2023-09-18 13:45:40 +00:00
// @ts-check
const assert = require ( "assert" ) . strict
const DiscordTypes = require ( "discord-api-types/v10" )
const passthrough = require ( "../../passthrough" )
const { discord , sync , db , select } = passthrough
/** @type {import("../../matrix/file")} */
const file = sync . require ( "../../matrix/file" )
/ * *
* @ param { DiscordTypes . APIEmoji [ ] } emojis
* /
async function emojisToState ( emojis ) {
const result = {
pack : {
display _name : "Discord Emojis" ,
usage : [ "emoticon" ] // we'll see...
} ,
images : {
}
}
await Promise . all ( emojis . map ( emoji =>
// the homeserver can probably cope with doing this in parallel
file . uploadDiscordFileToMxc ( file . emoji ( emoji . id , emoji . animated ) ) . then ( url => {
result . images [ emoji . name ] = {
info : {
mimetype : emoji . animated ? "image/gif" : "image/png"
} ,
url
}
2023-09-19 05:15:34 +00:00
db . prepare ( "INSERT OR IGNORE INTO emoji (emoji_id, animated, mxc_url) VALUES (?, ?, ?)" ) . run ( emoji . id , + ! ! emoji . animated , url )
2023-09-18 13:45:40 +00:00
} ) . catch ( e => {
2023-09-19 05:15:34 +00:00
if ( e . data . errcode === "M_TOO_LARGE" ) { // Very unlikely to happen. Only possible for 3x-series emojis uploaded shortly after animated emojis were introduced, when there was no 256 KB size limit.
2023-09-18 13:45:40 +00:00
return
}
console . error ( ` Trying to handle emoji ${ emoji . name } ( ${ emoji . id } ), but... ` )
throw e
} )
) )
return result
}
/ * *
* @ param { DiscordTypes . APISticker [ ] } stickers
* /
async function stickersToState ( stickers ) {
const result = {
pack : {
display _name : "Discord Stickers" ,
usage : [ "sticker" ] // we'll see...
} ,
images : {
}
}
const shortcodes = [ ]
await Promise . all ( stickers . map ( sticker =>
// the homeserver can probably cope with doing this in parallel
file . uploadDiscordFileToMxc ( file . sticker ( sticker ) ) . then ( url => {
/** @type {string | undefined} */
let body = sticker . name
if ( sticker && sticker . description ) body += ` - ${ sticker . description } `
if ( ! body ) body = undefined
let shortcode = sticker . name . toLowerCase ( ) . replace ( /[^a-zA-Z0-9-_]/g , "-" ) . replace ( /^-|-$/g , "" ) . replace ( /--+/g , "-" )
while ( shortcodes . includes ( shortcode ) ) shortcode = shortcode + "~"
shortcodes . push ( shortcode )
result . images [ shortcodes ] = {
info : {
mimetype : file . stickerFormat . get ( sticker . format _type ) ? . mime || "image/png"
} ,
body ,
url
}
} )
) )
return result
}
module . exports . emojisToState = emojisToState
module . exports . stickersToState = stickersToState