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,