53 lines
1.7 KiB
JavaScript
53 lines
1.7 KiB
JavaScript
// @ts-check
|
|
|
|
const DiscordTypes = require("discord-api-types/v10")
|
|
const Ty = require("../../types")
|
|
const assert = require("assert").strict
|
|
|
|
const passthrough = require("../../passthrough")
|
|
const {sync, db, select} = passthrough
|
|
/** @type {import("../../matrix/file")} */
|
|
const file = sync.require("../../matrix/file")
|
|
/** @type {import("../../matrix/mreq")} */
|
|
const mreq = sync.require("../../matrix/mreq")
|
|
/** @type {import("../converters/lottie")} */
|
|
const convertLottie = sync.require("../converters/lottie")
|
|
|
|
const INFO = {
|
|
mimetype: "image/png",
|
|
w: convertLottie.SIZE,
|
|
h: convertLottie.SIZE
|
|
}
|
|
|
|
/**
|
|
* @param {DiscordTypes.APIStickerItem} stickerItem
|
|
* @returns {Promise<{mxc_url: string, info: typeof INFO}>}
|
|
*/
|
|
async function convert(stickerItem) {
|
|
// Reuse sticker if already converted and uploaded
|
|
const existingMxc = select("lottie", "mxc_url", {sticker_id: stickerItem.id}).pluck().get()
|
|
if (existingMxc) return {mxc_url: existingMxc, info: INFO}
|
|
|
|
// Fetch sticker data from Discord
|
|
const res = await fetch(file.DISCORD_IMAGES_BASE + file.sticker(stickerItem))
|
|
if (res.status !== 200) throw new Error("Sticker data file not found.")
|
|
const text = await res.text()
|
|
|
|
// Convert to PNG (readable stream)
|
|
const readablePng = await convertLottie.convert(text)
|
|
|
|
// Upload to MXC
|
|
/** @type {Ty.R.FileUploaded} */
|
|
const root = await mreq.mreq("POST", "/media/v3/upload", readablePng, {
|
|
headers: {
|
|
"Content-Type": INFO.mimetype
|
|
}
|
|
})
|
|
assert(root.content_uri)
|
|
|
|
// Save the link for next time
|
|
db.prepare("INSERT INTO lottie (sticker_id, mxc_url) VALUES (?, ?)").run(stickerItem.id, root.content_uri)
|
|
return {mxc_url: root.content_uri, info: INFO}
|
|
}
|
|
|
|
module.exports.convert = convert
|