From 9f3efcd10d8729f79d85f66a806f1137bbc6d79c Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Wed, 5 Jul 2023 12:04:28 +1200 Subject: [PATCH 1/2] streamline the convertNameAndTopic function --- d2m/actions/create-room.js | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/d2m/actions/create-room.js b/d2m/actions/create-room.js index 98333b2..0fd0646 100644 --- a/d2m/actions/create-room.js +++ b/d2m/actions/create-room.js @@ -37,25 +37,17 @@ function applyKStateDiffToRoom(roomID, kstate) { * @param {string?} customName */ function convertNameAndTopic(channel, guild, customName) { - // TODO: Improve nasty nested ifs - let convertedName, convertedTopic - if (customName) { - convertedName = customName - if (channel.topic) { - convertedTopic = `#${channel.name} | ${channel.topic}\n\nChannel ID: ${channel.id}\nGuild ID: ${guild.id}` - } else { - convertedTopic = `#${channel.name}\n\nChannel ID: ${channel.id}\nGuild ID: ${guild.id}` - } - } else { - convertedName = channel.name - if (channel.topic) { - convertedTopic = `${channel.topic}\n\nChannel ID: ${channel.id}\nGuild ID: ${guild.id}` - } else { - convertedTopic = `Channel ID: ${channel.id}\nGuild ID: ${guild.id}` - } - } + const convertedName = customName || channel.name; + const maybeTopicWithPipe = channel.topic ? ` | ${channel.topic}` : ''; + const maybeTopicWithNewlines = channel.topic ? `${channel.topic}\n\n` : ''; + const channelIDPart = `Channel ID: ${channel.id}`; + const guildIDPart = `Guild ID: ${guild.id}`; - return [convertedName, convertedTopic] + const convertedTopic = customName + ? `#${channel.name}${maybeTopicWithPipe}\n\n${channelIDPart}\n${guildIDPart}` + : `${maybeTopicWithNewlines}${channelIDPart}\n${guildIDPart}`; + + return [convertedName, convertedTopic]; } /** From 07f24db4131910ec31513da0987149acd52fe83d Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Fri, 7 Jul 2023 17:31:39 +1200 Subject: [PATCH 2/2] start getting d2m formatted body conversion --- d2m/converters/message-to-event.js | 64 +++++++++++-------- d2m/converters/message-to-event.test.js | 20 ++++++ db/ooye.db | Bin 258048 -> 258048 bytes stdin.js | 1 + test/data.js | 78 ++++++++++++++++++++++++ 5 files changed, 137 insertions(+), 26 deletions(-) diff --git a/d2m/converters/message-to-event.js b/d2m/converters/message-to-event.js index 382e970..90023ee 100644 --- a/d2m/converters/message-to-event.js +++ b/d2m/converters/message-to-event.js @@ -8,6 +8,34 @@ const { sync, db, discord } = passthrough /** @type {import("../../matrix/file")} */ const file = sync.require("../../matrix/file") +function getDiscordParseCallbacks(message, useHTML) { + return { + user: node => { + const mxid = db.prepare("SELECT mxid FROM sim WHERE discord_id = ?").pluck().get(node.id) + const username = message.mentions.find(ment => ment.id === node.id)?.username || node.id + if (mxid && useHTML) { + return `@${username}` + } else { + return `@${username}:` + } + }, + channel: node => { + const roomID = db.prepare("SELECT room_id FROM channel_room WHERE channel_id = ?").pluck().get(node.id) + if (roomID && useHTML) { + return "https://matrix.to/#/" + roomID + } else { + return "#" + node.id + } + }, + role: node => + "@&" + node.id, + everyone: node => + "@room", + here: node => + "@here" + } +} + /** * @param {import("discord-api-types/v10").APIMessage} message * @param {import("discord-api-types/v10").APIGuild} guild @@ -17,34 +45,18 @@ async function messageToEvent(message, guild) { // Text content appears first if (message.content) { - const body = message.content - const html = markdown.toHTML(body, { - discordCallback: { - user: node => { - const mxid = db.prepare("SELECT mxid FROM sim WHERE discord_id = ?").pluck().get(node.id) - if (mxid) { - return "https://matrix.to/#/" + mxid - } else { - return "@" + node.id - } - }, - channel: node => { - const roomID = db.prepare("SELECT room_id FROM channel_room WHERE channel_id = ?").pluck().get(node.id) - if (roomID) { - return "https://matrix.to/#/" + roomID - } else { - return "#" + node.id - } - }, - role: node => - "@&" + node.id, - everyone: node => - "@room", - here: node => - "@here" - } + const html = markdown.toHTML(message.content, { + discordCallback: getDiscordParseCallbacks(message, true) }, null, null) + + const body = markdown.toHTML(message.content, { + discordCallback: getDiscordParseCallbacks(message, false), //TODO: library bug!! + discordOnly: true, + escapeHTML: false, + }, null, null) + const isPlaintext = body === html + if (isPlaintext) { events.push({ $type: "m.room.message", diff --git a/d2m/converters/message-to-event.test.js b/d2m/converters/message-to-event.test.js index 26cf1f1..1f3a844 100644 --- a/d2m/converters/message-to-event.test.js +++ b/d2m/converters/message-to-event.test.js @@ -2,6 +2,26 @@ const {test} = require("supertape") const {messageToEvent} = require("./message-to-event") const data = require("../../test/data") +test("message2event: simple plaintext", async t => { + const events = await messageToEvent(data.message.simple_plaintext, data.guild.general) + t.deepEqual(events, [{ + $type: "m.room.message", + msgtype: "m.text", + body: "ayy lmao" + }]) +}) + +test("message2event: simple user mention", async t => { + const events = await messageToEvent(data.message.simple_user_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: attachment with no content", async t => { const events = await messageToEvent(data.message.attachment_no_content, data.guild.general) t.deepEqual(events, [{ diff --git a/db/ooye.db b/db/ooye.db index 8400cf00121fc350e6c60be96d1e485b122b8a1b..7df165b729fcd153b82c31b6108e205ba746d49b 100644 GIT binary patch delta 754 zcmZp8z~AtIe}Xil`a~ILR&@rwv{xHb7OZF1W)Ysw9>5g7ap6|xdY9&G)>LB-PL;$= z?<6BvkBrJHSO3WJZ2$O_%F=SfG~<%IAUBiZtdPJ+H%Ff=(@>9~P(wo_GjkIoQ%iFL z3ky?oQ&Tewm*y;pG4U>r-j(K#;b~6g#_=UlrKaw=x<1Aw1ztIR`NpBe#r~<0ArS?| zsqXQ2%fu zOo>8#F)W>Ig)A;i;{3aKyZFR-FHBtMxP9jVrpr7`440<&on^Y>O2~)!J;?Y1Z1?24 zt@hiWonw-l$YH{8kcGXEv#xo>)!E3<7q f#OstL8^+fVQ%FoTphUxqlxi4XZP&|WzSIT)CPn11 delta 209 zcmV;?051Q4;17V{50D!HBas|K1tS11YS6J{psxcb1uv5auurj}*#v_xwYM*|0n+*e z0Zjlimj$o_NtaNt0w4kbO_y-60^I}!Apk~~PVNFi1w{m9GXj^;tph)|*RcXE4goZm z1;7Gf5(J3`aRfvH7Z17)Tn&m277fsmp+UE~zyi|@0s$D8j?Dtpm+u7wMw5TFKDXx1 z0v?eDG62B@2acBvU;`SLC}0Cf1X4{=Qnzqm17!yS0b7^wLIaMMW<>)(1ONa7M3=!s L1BSOQX#>)RAkIa> diff --git a/stdin.js b/stdin.js index cd504f2..7e0db89 100644 --- a/stdin.js +++ b/stdin.js @@ -6,6 +6,7 @@ const util = require("util") const passthrough = require("./passthrough") const { discord, config, sync, db } = passthrough +const data = sync.require("./test/data") const createSpace = sync.require("./d2m/actions/create-space") const createRoom = sync.require("./d2m/actions/create-room") const registerUser = sync.require("./d2m/actions/register-user") diff --git a/test/data.js b/test/data.js index 49bbeaf..f4326a6 100644 --- a/test/data.js +++ b/test/data.js @@ -138,6 +138,84 @@ module.exports = { }, message: { // Display order is text content, attachments, then stickers + simple_plaintext: { + id: "1126733830494093453", + type: 0, + content: "ayy lmao", + channel_id: "112760669178241024", + author: { + id: "111604486476181504", + username: "kyuugryphon", + avatar: "e4ce31267ca524d19be80e684d4cafa1", + discriminator: "0", + public_flags: 0, + flags: 0, + banner: null, + accent_color: null, + global_name: "KyuuGryphon", + avatar_decoration: null, + display_name: "KyuuGryphon", + banner_color: null + }, + attachments: [], + embeds: [], + mentions: [], + mention_roles: [], + pinned: false, + mention_everyone: false, + tts: false, + timestamp: "2023-07-07T04:37:58.892000+00:00", + edited_timestamp: null, + flags: 0, + components: [] + }, + simple_user_mention: { + id: "1126739682080858234", + type: 0, + content: "<@820865262526005258> Tell me about Phil, renowned martial arts master and creator of the Chin Trick", + channel_id: "112760669178241024", + author: { + id: "114147806469554185", + username: "extremity", + avatar: "6628aaf6b27219c36e2d3b5cfd6d0ee6", + discriminator: "0", + public_flags: 768, + flags: 768, + banner: null, + accent_color: null, + global_name: "Extremity", + avatar_decoration: null, + display_name: "Extremity", + banner_color: null + }, + attachments: [], + embeds: [], + mentions: [ + { + id: "820865262526005258", + username: "crunch god", + avatar: "f7a75ca031c1d2326e0f3ca5213eea47", + discriminator: "8889", + public_flags: 0, + flags: 0, + bot: true, + banner: null, + accent_color: null, + global_name: null, + avatar_decoration: null, + display_name: null, + banner_color: null + } + ], + mention_roles: [], + pinned: false, + mention_everyone: false, + tts: false, + timestamp: "2023-07-07T05:01:14.019000+00:00", + edited_timestamp: null, + flags: 0, + components: [] + }, attachment_no_content: { id: "1124628646670389348", type: 0,