diff --git a/db/ooye-test-data.sql b/db/ooye-test-data.sql
index d37f7a1e..1f5f4a63 100644
--- a/db/ooye-test-data.sql
+++ b/db/ooye-test-data.sql
@@ -67,10 +67,12 @@ INSERT INTO file (discord_url, mxc_url) VALUES
('https://cdn.discordapp.com/guilds/112760669178241024/users/134826546694193153/avatars/38dd359aa12bcd52dd3164126c587f8c.png?size=1024', 'mxc://cadence.moe/rfemHmAtcprjLEiPiEuzPhpl'),
('https://cdn.discordapp.com/icons/112760669178241024/a_f83622e09ead74f0c5c527fe241f8f8c.png?size=1024', 'mxc://cadence.moe/zKXGZhmImMHuGQZWJEFKJbsF'),
('https://cdn.discordapp.com/avatars/113340068197859328/b48302623a12bc7c59a71328f72ccb39.png?size=1024', 'mxc://cadence.moe/UpAeIqeclhKfeiZNdIWNcXXL'),
-('https://cdn.discordapp.com/emojis/230201364309868544.png', 'mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC');
+('https://cdn.discordapp.com/emojis/230201364309868544.png', 'mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC'),
+('https://cdn.discordapp.com/emojis/393635038903926784.gif', 'mxc://cadence.moe/WbYqNlACRuicynBfdnPYtmvc');
INSERT INTO emoji (emoji_id, animated, mxc_url) VALUES
-('230201364309868544', 0, 'mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC');
+('230201364309868544', 0, 'mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC'),
+('393635038903926784', 1, 'mxc://cadence.moe/WbYqNlACRuicynBfdnPYtmvc');
INSERT INTO member_cache (room_id, mxid, displayname, avatar_url) VALUES
('!kLRqKKUQXcibIMtOpl:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', NULL),
diff --git a/m2d/converters/event-to-message.js b/m2d/converters/event-to-message.js
index c9b0133b..accaee5b 100644
--- a/m2d/converters/event-to-message.js
+++ b/m2d/converters/event-to-message.js
@@ -117,6 +117,28 @@ turndownService.addRule("inlineLink", {
}
})
+turndownService.addRule("emoji", {
+ filter: function (node, options) {
+ if (node.nodeName !== "IMG" || !node.hasAttribute("data-mx-emoticon") || !node.getAttribute("src")) return false
+ const row = select("emoji", ["emoji_id", "animated"], "WHERE mxc_url = ?").get(node.getAttribute("src"))
+ if (!row) return false
+ node.setAttribute("data-emoji-id", row.emoji_id)
+ node.setAttribute("data-emoji-animated-char", row.animated ? "a" : "")
+ return true
+ },
+
+ replacement: function (content, node) {
+ /** @type {string} */
+ const id = node.getAttribute("data-emoji-id")
+ /** @type {string} */
+ const animatedChar = node.getAttribute("data-emoji-animated-char")
+ /** @type {string} */
+ const title = node.getAttribute("title") || "__"
+ const name = title.replace(/^:|:$/g, "")
+ return `<${animatedChar}:${name}:${id}>`
+ }
+})
+
turndownService.addRule("fencedCodeBlock", {
filter: function (node, options) {
return (
diff --git a/m2d/converters/event-to-message.test.js b/m2d/converters/event-to-message.test.js
index 3b40f907..3ec8dac0 100644
--- a/m2d/converters/event-to-message.test.js
+++ b/m2d/converters/event-to-message.test.js
@@ -1692,3 +1692,55 @@ test("event2message: stickers work", async t => {
}
)
})
+
+test("event2message: static emojis work", async t => {
+ t.deepEqual(
+ await eventToMessage({
+ type: "m.room.message",
+ sender: "@cadence:cadence.moe",
+ content: {
+ msgtype: "m.text",
+ body: ":hippo:",
+ format: "org.matrix.custom.html",
+ formatted_body: ''
+ },
+ event_id: "$g07oYSZFWBkxohNEfywldwgcWj1hbhDzQ1sBAKvqOOU",
+ room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe"
+ }),
+ {
+ messagesToDelete: [],
+ messagesToEdit: [],
+ messagesToSend: [{
+ username: "cadence [they]",
+ content: "<:hippo:230201364309868544>",
+ avatar_url: undefined
+ }]
+ }
+ )
+})
+
+test("event2message: animated emojis work", async t => {
+ t.deepEqual(
+ await eventToMessage({
+ type: "m.room.message",
+ sender: "@cadence:cadence.moe",
+ content: {
+ msgtype: "m.text",
+ body: ":hippo:",
+ format: "org.matrix.custom.html",
+ formatted_body: ''
+ },
+ event_id: "$g07oYSZFWBkxohNEfywldwgcWj1hbhDzQ1sBAKvqOOU",
+ room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe"
+ }),
+ {
+ messagesToDelete: [],
+ messagesToEdit: [],
+ messagesToSend: [{
+ username: "cadence [they]",
+ content: "",
+ avatar_url: undefined
+ }]
+ }
+ )
+})