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 




"
+ },
+ 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"
+ })
+})