diff --git a/d2m/actions/send-message.js b/d2m/actions/send-message.js index 4f111b0..f5fe5ef 100644 --- a/d2m/actions/send-message.js +++ b/d2m/actions/send-message.js @@ -37,7 +37,7 @@ async function sendMessage(message, guild) { delete eventWithoutType.$type const eventID = await api.sendEvent(roomID, eventType, event, senderMxid) - db.prepare("INSERT INTO event_message (event_id, message_id, part, source) VALUES (?, ?, ?, 1)").run(eventID, message.id, eventPart) // source 1 = discord + db.prepare("INSERT INTO event_message (event_id, message_id, channel_id, part, source) VALUES (?, ?, ?, ?, 1)").run(eventID, message.id, message.channel_id, eventPart) // source 1 = discord eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting eventIDs.push(eventID) diff --git a/d2m/converters/message-to-event.js b/d2m/converters/message-to-event.js index 90023ee..fc76bf2 100644 --- a/d2m/converters/message-to-event.js +++ b/d2m/converters/message-to-event.js @@ -45,12 +45,22 @@ async function messageToEvent(message, guild) { // Text content appears first if (message.content) { - const html = markdown.toHTML(message.content, { + let content = message.content + content = content.replace(/https:\/\/(?:ptb\.|canary\.|www\.)?discord(?:app)?\.com\/channels\/([0-9]+)\/([0-9]+)\/([0-9]+)/, (whole, guildID, channelID, messageID) => { + const row = db.prepare("SELECT room_id, event_id FROM event_message INNER JOIN channel_room USING (channel_id) WHERE channel_id = ? AND message_id = ? AND part = 0").get(channelID, messageID) + if (row) { + return `https://matrix.to/#/${row.room_id}/${row.event_id}` + } else { + return `${whole} [event not found]` + } + }) + + const html = markdown.toHTML(content, { discordCallback: getDiscordParseCallbacks(message, true) }, null, null) - const body = markdown.toHTML(message.content, { - discordCallback: getDiscordParseCallbacks(message, false), //TODO: library bug!! + const body = markdown.toHTML(content, { + discordCallback: getDiscordParseCallbacks(message, 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 6e673f1..a456a94 100644 --- a/d2m/converters/message-to-event.test.js +++ b/d2m/converters/message-to-event.test.js @@ -22,6 +22,28 @@ test("message2event: simple user mention", async t => { }]) }) +test("message2event: simple room mention", async t => { + const events = await messageToEvent(data.message.simple_room_mention, data.guild.general) + t.deepEqual(events, [{ + $type: "m.room.message", + msgtype: "m.text", + body: "@crunch god: Tell me about Phil, renowned martial arts master and creator of the Chin Trick", + format: "org.matrix.custom.html", + formatted_body: '@crunch god Tell me about Phil, renowned martial arts master and creator of the Chin Trick' + }]) +}) + +test("message2event: simple message link", async t => { + const events = await messageToEvent(data.message.simple_message_link, data.guild.general) + t.deepEqual(events, [{ + $type: "m.room.message", + msgtype: "m.text", + body: "https://matrix.to/#/!kLRqKKUQXcibIMtOpl:cadence.moe/$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg", + format: "org.matrix.custom.html", + formatted_body: 'https://matrix.to/#/!kLRqKKUQXcibIMtOpl:cadence.moe/$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg' + }]) +}) + test("message2event: attachment with no content", async t => { const events = await messageToEvent(data.message.attachment_no_content, data.guild.general) t.deepEqual(events, [{ diff --git a/m2d/actions/send-event.js b/m2d/actions/send-event.js index 56a660f..c05f08c 100644 --- a/m2d/actions/send-event.js +++ b/m2d/actions/send-event.js @@ -25,7 +25,7 @@ async function sendEvent(event) { let eventPart = 0 // 0 is primary, 1 is supporting for (const message of messages) { const messageResponse = await channelWebhook.sendMessageWithWebhook(channelID, message) - db.prepare("INSERT INTO event_message (event_id, message_id, part, source) VALUES (?, ?, ?, 0)").run(event.event_id, messageResponse.id, eventPart) // source 0 = matrix + db.prepare("INSERT INTO event_message (event_id, message_id, channel_id, part, source) VALUES (?, ?, ?, ?, 0)").run(event.event_id, messageResponse.id, channelID, eventPart) // source 0 = matrix eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting? messageResponses.push(messageResponse) diff --git a/test/data.js b/test/data.js index f4326a6..52b8770 100644 --- a/test/data.js +++ b/test/data.js @@ -216,6 +216,119 @@ module.exports = { flags: 0, components: [] }, + simple_message_link: { + id: "1126788210308161626", + type: 0, + content: "https://ptb.discord.com/channels/112760669178241024/112760669178241024/1126786462646550579", + channel_id: "112760669178241024", + author: { + id: "113340068197859328", + username: "kumaccino", + avatar: "b48302623a12bc7c59a71328f72ccb39", + discriminator: "0", + public_flags: 128, + flags: 128, + banner: null, + accent_color: null, + global_name: "kumaccino", + avatar_decoration: null, + display_name: "kumaccino", + banner_color: null + }, + attachments: [], + embeds: [], + mentions: [], + mention_roles: [], + pinned: false, + mention_everyone: false, + tts: false, + timestamp: "2023-07-07T08:14:04.050000+00:00", + edited_timestamp: null, + flags: 0, + components: [] + }, + simple_reply: { + id: "1126604870762369124", + type: 19, + content: "", + channel_id: "112760669178241024", + author: { + id: "116718249567059974", + username: "rnl", + avatar: "67e70f6424eead669e076b44474164c3", + discriminator: "0", + public_flags: 768, + flags: 768, + banner: null, + accent_color: null, + global_name: "▲", + avatar_decoration: null, + display_name: "▲", + banner_color: null + }, + attachments: [], + embeds: [], + mentions: [ + { + id: "113340068197859328", + username: "kumaccino", + avatar: "b48302623a12bc7c59a71328f72ccb39", + discriminator: "0", + public_flags: 128, + flags: 128, + banner: null, + accent_color: null, + global_name: "kumaccino", + avatar_decoration: null, + display_name: "kumaccino", + banner_color: null + } + ], + mention_roles: [], + pinned: false, + mention_everyone: false, + tts: false, + timestamp: "2023-07-06T20:05:32.496000+00:00", + edited_timestamp: null, + flags: 0, + components: [], + message_reference: { + channel_id: "112760669178241024", + message_id: "1126577139723026564", + guild_id: "112760669178241024" + }, + referenced_message: { + id: "1126577139723026564", + type: 0, + content: "this message was replied to", + channel_id: "112760669178241024", + author: { + id: "113340068197859328", + username: "kumaccino", + avatar: "b48302623a12bc7c59a71328f72ccb39", + discriminator: "0", + public_flags: 128, + flags: 128, + banner: null, + accent_color: null, + global_name: "kumaccino", + avatar_decoration: null, + display_name: "kumaccino", + banner_color: null + }, + attachments: [], + embeds: [], + mentions: [], + mention_roles: [], + pinned: false, + mention_everyone: false, + tts: false, + timestamp: "2023-07-06T18:15:20.901000+00:00", + edited_timestamp: null, + flags: 0, + components: [] + } + }, attachment_no_content: { id: "1124628646670389348", type: 0,