diff --git a/d2m/converters/message-to-event.js b/d2m/converters/message-to-event.js index 7c4a998..c0c937e 100644 --- a/d2m/converters/message-to-event.js +++ b/d2m/converters/message-to-event.js @@ -17,7 +17,12 @@ const reg = require("../../matrix/read-registration") const userRegex = reg.namespaces.users.map(u => new RegExp(u.regex)) -function getDiscordParseCallbacks(message, useHTML) { +/** + * @param {DiscordTypes.APIMessage} message + * @param {DiscordTypes.APIGuild} guild + * @param {boolean} useHTML + */ +function getDiscordParseCallbacks(message, guild, useHTML) { return { /** @param {{id: string, type: "discordUser"}} node */ user: node => { @@ -53,8 +58,18 @@ function getDiscordParseCallbacks(message, useHTML) { return `:${node.name}:` } }, - role: node => - "@&" + node.id, + role: node => { + const role = guild.roles.find(r => r.id === node.id) + if (!role) { + return "@&" + node.id // fallback for if the cache breaks. if this happens, fix discord-packets.js to store the role info. + } else if (useHTML && role.color) { + return `@${role.name}` + } else if (useHTML) { + return `@${role.name}` + } else { + return `@${role.name}:` + } + }, everyone: node => "@room", here: node => @@ -160,11 +175,11 @@ async function messageToEvent(message, guild, options = {}, di) { })) let html = markdown.toHTML(content, { - discordCallback: getDiscordParseCallbacks(message, true) + discordCallback: getDiscordParseCallbacks(message, guild, true) }, null, null) let body = markdown.toHTML(content, { - discordCallback: getDiscordParseCallbacks(message, false), + discordCallback: getDiscordParseCallbacks(message, guild, false), discordOnly: true, escapeHTML: false, }, null, null) @@ -223,10 +238,10 @@ async function messageToEvent(message, guild, options = {}, di) { if (repliedToContent == "") repliedToContent = "[Media]" else if (!repliedToContent) repliedToContent = "[Replied-to message content wasn't provided by Discord]" const repliedToHtml = markdown.toHTML(repliedToContent, { - discordCallback: getDiscordParseCallbacks(message, true) + discordCallback: getDiscordParseCallbacks(message, guild, true) }, null, null) const repliedToBody = markdown.toHTML(repliedToContent, { - discordCallback: getDiscordParseCallbacks(message, false), + discordCallback: getDiscordParseCallbacks(message, guild, false), discordOnly: true, escapeHTML: false, }, null, null) diff --git a/d2m/converters/message-to-event.test.js b/d2m/converters/message-to-event.test.js index 4b4b6a0..8e2ba53 100644 --- a/d2m/converters/message-to-event.test.js +++ b/d2m/converters/message-to-event.test.js @@ -73,6 +73,18 @@ test("message2event: simple room mention", async t => { }]) }) +test("message2event: simple role mentions", async t => { + const events = await messageToEvent(data.message.simple_role_mentions, data.guild.general, {}) + t.deepEqual(events, [{ + $type: "m.room.message", + "m.mentions": {}, + msgtype: "m.text", + body: "I'm just @!!DLCS!!: testing a few role pings @Master Wonder Mage: don't mind me", + format: "org.matrix.custom.html", + formatted_body: `I'm just @!!DLCS!! testing a few role pings @Master Wonder Mage don't mind me` + }]) +}) + test("message2event: simple message link", async t => { const events = await messageToEvent(data.message.simple_message_link, data.guild.general, {}) t.deepEqual(events, [{ diff --git a/test/data.js b/test/data.js index 1a526aa..3d3f1f0 100644 --- a/test/data.js +++ b/test/data.js @@ -119,7 +119,51 @@ module.exports = { } ], premium_subscription_count: 14, - roles: [], + roles: [ + { + version: 1696964862461, + unicode_emoji: null, + tags: {}, + position: 22, + permissions: '0', + name: 'Master Wonder Mage', + mentionable: true, + managed: false, + id: '503685967463448616', + icon: null, + hoist: false, + flags: 0, + color: 0 + }, { + version: 1696964862776, + unicode_emoji: null, + tags: {}, + position: 131, + permissions: '0', + name: '!!DLCS!!', + mentionable: true, + managed: false, + id: '212762309364285440', + icon: null, + hoist: true, + flags: 0, + color: 11076095 + }, { + version: 1696964862698, + unicode_emoji: '🍂', + tags: {}, + position: 102, + permissions: '0', + name: 'corporate overlord', + mentionable: false, + managed: false, + id: '217013981053845504', + icon: null, + hoist: true, + flags: 0, + color: 16745267 + } + ], discovery_splash: null, default_message_notifications: 1, region: "deprecated", @@ -434,6 +478,36 @@ module.exports = { attachments: [], guild_id: "112760669178241024" }, + simple_role_mentions: { + id: "1162374402785153106", + type: 0, + content: "I'm just <@&212762309364285440> testing a few role pings <@&503685967463448616> don't mind me", + channel_id: "160197704226439168", + author: { + id: "772659086046658620", + username: "cadence.worm", + avatar: "4b5c4b28051144e4c111f0113a0f1cf1", + discriminator: "0", + public_flags: 0, + flags: 0, + banner: null, + accent_color: null, + global_name: "cadence", + avatar_decoration_data: null, + banner_color: null + }, + attachments: [], + embeds: [], + mentions: [], + mention_roles: [ "212762309364285440", "503685967463448616" ], + pinned: false, + mention_everyone: false, + tts: false, + timestamp: "2023-10-13T13:00:53.496000+00:00", + edited_timestamp: null, + flags: 0, + components: [] + }, simple_message_link: { id: "1126788210308161626", type: 0,