From 60f3b67d2db9f59b2fef1bf34b65ef58581b64bb Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Wed, 27 Sep 2023 23:25:46 +1300 Subject: [PATCH] m->d fix for memorised emojis from other servers --- m2d/converters/event-to-message.js | 45 ++++++++++++------------- m2d/converters/event-to-message.test.js | 26 +++++++++++++- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/m2d/converters/event-to-message.js b/m2d/converters/event-to-message.js index 4c6e9e2..b028dc5 100644 --- a/m2d/converters/event-to-message.js +++ b/m2d/converters/event-to-message.js @@ -120,32 +120,31 @@ turndownService.addRule("emoji", { replacement: function (content, node) { const mxcUrl = node.getAttribute("src") - let row = select("emoji", ["id", "name", "animated"], "WHERE mxc_url = ?").get(mxcUrl) - if (!row) { - // We don't know what this is... but maybe we can guess based on the name? - const guessedName = node.getAttribute("title").replace(/^:|:$/g, "") - for (const guild of discord?.guilds.values() || []) { - /** @type {{name: string, id: string, animated: number}[]} */ - // @ts-ignore - const emojis = guild.emojis - const match = emojis.find(e => e.name === guessedName) || emojis.find(e => e.name?.toLowerCase() === guessedName.toLowerCase()) - if (match) { - row = match - break - } + // Get the known emoji from the database. (We may not be able to actually use this if it was from another server.) + const row = select("emoji", ["id", "name", "animated"], "WHERE mxc_url = ?").get(mxcUrl) + // Also guess a suitable emoji based on the ID (if available) or name + let guess = null + const guessedName = node.getAttribute("title").replace(/^:|:$/g, "") + for (const guild of discord?.guilds.values() || []) { + /** @type {{name: string, id: string, animated: number}[]} */ + // @ts-ignore + const emojis = guild.emojis + const match = emojis.find(e => e.id === row?.id) || emojis.find(e => e.name === guessedName) || emojis.find(e => e.name?.toLowerCase() === guessedName.toLowerCase()) + if (match) { + guess = match + break } } - if (row) { - const animatedChar = row.animated ? "a" : "" - return `<${animatedChar}:${row.name}:${row.id}>` + if (guess) { + // We know an emoji, and we can use it + const animatedChar = guess.animated ? "a" : "" + return `<${animatedChar}:${guess.name}:${guess.id}>` + } else if (endOfMessageEmojis.includes(mxcUrl)) { + // We can't locate or use a suitable emoji. After control returns, it will rewind over this, delete this section, and upload the emojis as a sprite sheet. + return `<::>` } else { - if (endOfMessageEmojis.includes(mxcUrl)) { - // After control returns to the main converter, it will rewind over this, delete this section, and upload the emojis as a sprite sheet. - return `<::>` - } else { - // This emoji is not at the end of the message, it is in the middle. We don't upload middle emojis as a sprite sheet. - return `[${node.getAttribute("title")}](${utils.getPublicUrlForMxc(mxcUrl)})` - } + // We prefer not to upload this as a sprite sheet because the emoji is not at the end of the message, it is in the middle. + return `[${node.getAttribute("title")}](${utils.getPublicUrlForMxc(mxcUrl)})` } } }) diff --git a/m2d/converters/event-to-message.test.js b/m2d/converters/event-to-message.test.js index 438334b..a65f747 100644 --- a/m2d/converters/event-to-message.test.js +++ b/m2d/converters/event-to-message.test.js @@ -1805,7 +1805,6 @@ slow()("event2message: unknown emoji in the end is reuploaded as a sprite sheet" }) slow()("event2message: known and unknown emojis in the end are reuploaded as a sprite sheet", async t => { - t.comment("SKIPPED") const messages = await eventToMessage({ type: "m.room.message", sender: "@cadence:cadence.moe", @@ -1829,3 +1828,28 @@ slow()("event2message: known and unknown emojis in the end are reuploaded as a s fileContentStart: "iVBORw0KGgoAAAANSUhEUgAAAGAAAAAwCAYAAADuFn/PAAAACXBIWXMAAAPoAAAD6AG1e1JrAAAT5UlEQVR4nOVbCXSVRZauR9gMsoYlvKwvARKSkPUlJOyL" }) }) + +slow()("event2message: all unknown chess emojis are reuploaded as a sprite sheet", async t => { + const messages = await eventToMessage({ + type: "m.room.message", + sender: "@cadence:cadence.moe", + content: { + msgtype: "m.text", + body: "testing :chess_good_move::chess_incorrect::chess_blund::chess_brilliant_move::chess_blundest::chess_draw_black:", + format: "org.matrix.custom.html", + formatted_body: "testing \":chess_good_move:\"\":chess_incorrect:\"\":chess_blund:\"\":chess_brilliant_move:\"\":chess_blundest:\"\":chess_draw_black:\"" + }, + event_id: "$Me6iE8C8CZyrDEOYYrXKSYRuuh_25Jj9kZaNrf7LKr4", + room_id: "!maggESguZBqGBZtSnr:cadence.moe" + }) + const testResult = { + content: messages.messagesToSend[0].content, + fileName: messages.messagesToSend[0].pendingFiles[0].name, + fileContentStart: messages.messagesToSend[0].pendingFiles[0].buffer.subarray(0, 90).toString("base64") + } + t.deepEqual(testResult, { + content: "testing", + fileName: "emojis.png", + fileContentStart: "iVBORw0KGgoAAAANSUhEUgAAASAAAAAwCAYAAACxIqevAAAACXBIWXMAAAPoAAAD6AG1e1JrAAAgAElEQVR4nOV9B1xUV9r3JMbEGBQLbRodhukDg2jWZP02" + }) +})