From 28abdac5b6ee118222faa571cf50b0766b9b1c4c Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Thu, 5 Oct 2023 12:32:05 +1300 Subject: [PATCH 001/501] Alter SQL column names to be distinct --- d2m/actions/announce-thread.js | 2 +- d2m/actions/register-user.js | 8 ++++---- d2m/actions/remove-reaction.js | 2 +- d2m/converters/edit-to-changes.js | 2 +- d2m/converters/lottie.js | 10 +++++----- d2m/converters/message-to-event.js | 6 +++--- d2m/converters/user-to-mxid.js | 2 +- d2m/event-dispatcher.js | 2 +- db/migrations/0003-distinguish-column-names.sql | 15 +++++++++++++++ db/orm-utils.d.ts | 6 +++--- db/orm.test.js | 2 +- m2d/converters/event-to-message.js | 4 ++-- scripts/seed.js | 2 +- test/ooye-test-data.sql | 2 +- 14 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 db/migrations/0003-distinguish-column-names.sql diff --git a/d2m/actions/announce-thread.js b/d2m/actions/announce-thread.js index 760905a..e52a2a3 100644 --- a/d2m/actions/announce-thread.js +++ b/d2m/actions/announce-thread.js @@ -15,7 +15,7 @@ const api = sync.require("../../matrix/api") * @param {import("discord-api-types/v10").APIThreadChannel} thread */ async function announceThread(parentRoomID, threadRoomID, thread) { - const creatorMxid = select("sim", "mxid", "WHERE discord_id = ?").pluck().get(thread.owner_id) + const creatorMxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(thread.owner_id) const content = await threadToAnnouncement.threadToAnnouncement(parentRoomID, threadRoomID, creatorMxid, thread, {api}) diff --git a/d2m/actions/register-user.js b/d2m/actions/register-user.js index 05f8518..dc3995d 100644 --- a/d2m/actions/register-user.js +++ b/d2m/actions/register-user.js @@ -29,7 +29,7 @@ async function createSim(user) { // Save chosen name in the database forever // Making this database change right away so that in a concurrent registration, the 2nd registration will already have generated a different localpart because it can see this row when it generates - db.prepare("INSERT INTO sim (discord_id, sim_name, localpart, mxid) VALUES (?, ?, ?, ?)").run(user.id, simName, localpart, mxid) + db.prepare("INSERT INTO sim (user_id, sim_name, localpart, mxid) VALUES (?, ?, ?, ?)").run(user.id, simName, localpart, mxid) // Register matrix user with that name try { @@ -37,7 +37,7 @@ async function createSim(user) { } catch (e) { // If user creation fails, manually undo the database change. Still isn't perfect, but should help. // (A transaction would be preferable, but I don't think it's safe to leave transaction open across event loop ticks.) - db.prepare("DELETE FROM sim WHERE discord_id = ?").run(user.id) + db.prepare("DELETE FROM sim WHERE user_id = ?").run(user.id) throw e } return mxid @@ -51,7 +51,7 @@ async function createSim(user) { */ async function ensureSim(user) { let mxid = null - const existing = select("sim", "mxid", "WHERE discord_id = ?").pluck().get(user.id) + const existing = select("sim", "mxid", "WHERE user_id = ?").pluck().get(user.id) if (existing) { mxid = existing } else { @@ -164,7 +164,7 @@ async function syncAllUsersInRoom(roomID) { assert.ok(typeof guildID === "string") for (const mxid of mxids) { - const userID = select("sim", "discord_id", "WHERE mxid = ?").pluck().get(mxid) + const userID = select("sim", "user_id", "WHERE mxid = ?").pluck().get(mxid) assert.ok(typeof userID === "string") /** @ts-ignore @type {Required} */ diff --git a/d2m/actions/remove-reaction.js b/d2m/actions/remove-reaction.js index b818867..d84531e 100644 --- a/d2m/actions/remove-reaction.js +++ b/d2m/actions/remove-reaction.js @@ -42,7 +42,7 @@ async function removeReaction(data) { } if (!lookingAtMatrixReaction && !wantToRemoveMatrixReaction) { // We are removing a Discord user's reaction, so we just make the sim user remove it. - const mxid = select("sim", "mxid", "WHERE discord_id = ?").pluck().get(data.user_id) + const mxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(data.user_id) if (mxid === event.sender) { await api.redactEvent(roomID, event.event_id, mxid) } diff --git a/d2m/converters/edit-to-changes.js b/d2m/converters/edit-to-changes.js index ac072f8..9144ccb 100644 --- a/d2m/converters/edit-to-changes.js +++ b/d2m/converters/edit-to-changes.js @@ -22,7 +22,7 @@ async function editToChanges(message, guild, api) { // Figure out what events we will be replacing const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(message.channel_id) - let senderMxid = select("sim", "mxid", "WHERE discord_id = ?").pluck().get(message.author.id) || null + let senderMxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(message.author.id) || null if (senderMxid) { const senderIsInRoom = select("sim_member", "mxid", "WHERE room_id = ? AND mxid = ?").get(roomID, senderMxid) if (!senderIsInRoom) { diff --git a/d2m/converters/lottie.js b/d2m/converters/lottie.js index 1d200a4..a00f98f 100644 --- a/d2m/converters/lottie.js +++ b/d2m/converters/lottie.js @@ -35,11 +35,11 @@ const Rlottie = (async () => { /** * @param {DiscordTypes.APIStickerItem} stickerItem - * @returns {Promise<{mxc: string, info: typeof INFO}>} + * @returns {Promise<{mxc_url: string, info: typeof INFO}>} */ async function convert(stickerItem) { - const existingMxc = select("lottie", "mxc", "WHERE id = ?").pluck().get(stickerItem.id) - if (existingMxc) return {mxc: existingMxc, info: INFO} + const existingMxc = select("lottie", "mxc_url", "WHERE sticker_id = ?").pluck().get(stickerItem.id) + if (existingMxc) return {mxc_url: existingMxc, info: INFO} const r = await Rlottie const res = await fetch(file.DISCORD_IMAGES_BASE + file.sticker(stickerItem)) if (res.status !== 200) throw new Error("Sticker data file not found.") @@ -67,8 +67,8 @@ async function convert(stickerItem) { } }) assert(root.content_uri) - db.prepare("INSERT INTO lottie (id, mxc) VALUES (?, ?)").run(stickerItem.id, root.content_uri) - return {mxc: root.content_uri, info: INFO} + db.prepare("INSERT INTO lottie (sticker_id, mxc_url) VALUES (?, ?)").run(stickerItem.id, root.content_uri) + return {mxc_url: root.content_uri, info: INFO} } module.exports.convert = convert diff --git a/d2m/converters/message-to-event.js b/d2m/converters/message-to-event.js index f0dc8fe..62a032f 100644 --- a/d2m/converters/message-to-event.js +++ b/d2m/converters/message-to-event.js @@ -19,7 +19,7 @@ function getDiscordParseCallbacks(message, useHTML) { return { /** @param {{id: string, type: "discordUser"}} node */ user: node => { - const mxid = select("sim", "mxid", "WHERE discord_id = ?").pluck().get(node.id) + const mxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(node.id) const username = message.mentions.find(ment => ment.id === node.id)?.username || node.id if (mxid && useHTML) { return `@${username}` @@ -405,13 +405,13 @@ async function messageToEvent(message, guild, options = {}, di) { const format = file.stickerFormat.get(stickerItem.format_type) if (format?.mime === "lottie") { try { - const {mxc, info} = await lottie.convert(stickerItem) + const {mxc_url, info} = await lottie.convert(stickerItem) return { $type: "m.sticker", "m.mentions": mentions, body: stickerItem.name, info, - url: mxc + url: mxc_url } } catch (e) { return { diff --git a/d2m/converters/user-to-mxid.js b/d2m/converters/user-to-mxid.js index 4537966..8514fc9 100644 --- a/d2m/converters/user-to-mxid.js +++ b/d2m/converters/user-to-mxid.js @@ -53,7 +53,7 @@ function userToSimName(user) { assert.notEqual(user.discriminator, "0000", "cannot create user for a webhook") // 1. Is sim user already registered? - const existing = select("sim", "sim_name", "WHERE discord_id = ?").pluck().get(user.id) + const existing = select("sim", "sim_name", "WHERE user_id = ?").pluck().get(user.id) if (existing) return existing // 2. Register based on username (could be new or old format) diff --git a/d2m/event-dispatcher.js b/d2m/event-dispatcher.js index f19437f..0fd1da5 100644 --- a/d2m/event-dispatcher.js +++ b/d2m/event-dispatcher.js @@ -251,7 +251,7 @@ module.exports = { async onTypingStart(client, data) { const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(data.channel_id) if (!roomID) return - const mxid = from("sim").join("sim_member", "mxid").and("WHERE discord_id = ? AND room_id = ?").pluck("mxid").get(data.user_id, roomID) + const mxid = from("sim").join("sim_member", "mxid").and("WHERE user_id = ? AND room_id = ?").pluck("mxid").get(data.user_id, roomID) if (!mxid) return // Each Discord user triggers the notification every 8 seconds as long as they remain typing. // Discord does not send typing stopped events, so typing only stops if the timeout is reached or if the user sends their message. diff --git a/db/migrations/0003-distinguish-column-names.sql b/db/migrations/0003-distinguish-column-names.sql new file mode 100644 index 0000000..4ffe0ac --- /dev/null +++ b/db/migrations/0003-distinguish-column-names.sql @@ -0,0 +1,15 @@ +BEGIN TRANSACTION; + +-- Rename mxc to mxc_url for consistency + +ALTER TABLE lottie RENAME COLUMN mxc TO mxc_url; + +-- Rename id to sticker_id so joins make sense in the future + +ALTER TABLE lottie RENAME COLUMN id TO sticker_id; + +-- Rename discord_id to user_id so joins make sense in the future + +ALTER TABLE sim RENAME COLUMN discord_id TO user_id; + +COMMIT; diff --git a/db/orm-utils.d.ts b/db/orm-utils.d.ts index e0c2cb4..a0cd817 100644 --- a/db/orm-utils.d.ts +++ b/db/orm-utils.d.ts @@ -28,8 +28,8 @@ export type Models = { } lottie: { - id: string - mxc: string + sticker_id: string + mxc_url: string } member_cache: { @@ -45,7 +45,7 @@ export type Models = { } sim: { - discord_id: string + user_id: string sim_name: string localpart: string mxid: string diff --git a/db/orm.test.js b/db/orm.test.js index ef5e2fb..7b8237b 100644 --- a/db/orm.test.js +++ b/db/orm.test.js @@ -26,6 +26,6 @@ test("orm: from: get pluck works", t => { }) test("orm: from: join and pluck works", t => { - const mxid = from("sim").join("sim_member", "mxid").and("WHERE discord_id = ? AND room_id = ?").pluck("mxid").get("771520384671416320", "!hYnGGlPHlbujVVfktC:cadence.moe") + const mxid = from("sim").join("sim_member", "mxid").and("WHERE user_id = ? AND room_id = ?").pluck("mxid").get("771520384671416320", "!hYnGGlPHlbujVVfktC:cadence.moe") t.equal(mxid, "@_ooye_bojack_horseman:cadence.moe") }) diff --git a/m2d/converters/event-to-message.js b/m2d/converters/event-to-message.js index 9ff810b..ae67645 100644 --- a/m2d/converters/event-to-message.js +++ b/m2d/converters/event-to-message.js @@ -324,7 +324,7 @@ async function eventToMessage(event, guild, di) { } const sender = repliedToEvent.sender const senderName = sender.match(/@([^:]*)/)?.[1] || sender - const authorID = select("sim", "discord_id", "WHERE mxid = ?").pluck().get(repliedToEvent.sender) + const authorID = select("sim", "user_id", "WHERE mxid = ?").pluck().get(repliedToEvent.sender) if (authorID) { replyLine += `<@${authorID}>` } else { @@ -367,7 +367,7 @@ async function eventToMessage(event, guild, di) { // Handling mentions of Discord users input = input.replace(/("https:\/\/matrix.to\/#\/(@[^"]+)")>/g, (whole, attributeValue, mxid) => { if (!utils.eventSenderIsFromDiscord(mxid)) return whole - const userID = select("sim", "discord_id", "WHERE mxid = ?").pluck().get(mxid) + const userID = select("sim", "user_id", "WHERE mxid = ?").pluck().get(mxid) if (!userID) return whole return `${attributeValue} data-user-id="${userID}">` }) diff --git a/scripts/seed.js b/scripts/seed.js index 10d12e6..3b24768 100644 --- a/scripts/seed.js +++ b/scripts/seed.js @@ -41,5 +41,5 @@ const utils = require("../m2d/converters/utils") await api.profileSetAvatarUrl(mxid, avatarUrl) // add initial rows to database, like adding the bot to sim... - db.prepare("INSERT INTO sim (discord_id, sim_name, localpart, mxid) VALUES (?, ?, ?, ?)").run("0", reg.sender_localpart.slice(reg.ooye.namespace_prefix.length), reg.sender_localpart, mxid) + db.prepare("INSERT INTO sim (user_id, sim_name, localpart, mxid) VALUES (?, ?, ?, ?)").run("0", reg.sender_localpart.slice(reg.ooye.namespace_prefix.length), reg.sender_localpart, mxid) })() diff --git a/test/ooye-test-data.sql b/test/ooye-test-data.sql index 70d02ed..681ec91 100644 --- a/test/ooye-test-data.sql +++ b/test/ooye-test-data.sql @@ -10,7 +10,7 @@ INSERT INTO channel_room (channel_id, room_id, name, nick, thread_parent, custom ('1100319550446252084', '!BnKuBPCvyfOkhcUjEu:cadence.moe', 'worm-farm', NULL, NULL, NULL), ('297272183716052993', '!rEOspnYqdOalaIFniV:cadence.moe', 'general', NULL, NULL, NULL); -INSERT INTO sim (discord_id, sim_name, localpart, mxid) VALUES +INSERT INTO sim (user_id, sim_name, localpart, mxid) VALUES ('0', 'bot', '_ooye_bot', '@_ooye_bot:cadence.moe'), ('820865262526005258', 'crunch_god', '_ooye_crunch_god', '@_ooye_crunch_god:cadence.moe'), ('771520384671416320', 'bojack_horseman', '_ooye_bojack_horseman', '@_ooye_bojack_horseman:cadence.moe'), From 475cd5b7243558d1e8d3821d8c1e8a898693b3ed Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Fri, 6 Oct 2023 12:31:10 +1300 Subject: [PATCH 002/501] Add new WHERE feature to my funny orm --- d2m/actions/add-reaction.js | 2 +- d2m/actions/announce-thread.js | 2 +- d2m/actions/create-room.js | 8 ++-- d2m/actions/create-space.js | 10 ++--- d2m/actions/delete-message.js | 4 +- d2m/actions/register-user.js | 12 +++--- d2m/actions/remove-reaction.js | 14 +++---- d2m/converters/edit-to-changes.js | 19 ++++----- d2m/converters/emoji-to-key.js | 2 +- d2m/converters/lottie.js | 2 +- d2m/converters/message-to-event.js | 20 ++++----- d2m/converters/thread-to-announcement.js | 2 +- d2m/converters/user-to-mxid.js | 4 +- d2m/event-dispatcher.js | 18 ++++---- .../0003-distinguish-column-names.sql | 4 ++ db/{orm-utils.d.ts => orm-defs.d.ts} | 2 +- db/{orm-utils.js => orm-defs.js} | 0 db/orm.js | 42 +++++++++++++++---- db/orm.test.js | 19 ++++++++- discord/discord-command-handler.js | 6 +-- m2d/actions/add-reaction.js | 4 +- m2d/actions/channel-webhook.js | 2 +- m2d/actions/redact.js | 5 ++- m2d/actions/send-event.js | 2 +- m2d/converters/emoji.js | 18 ++++---- m2d/converters/event-to-message.js | 16 +++---- m2d/converters/event-to-message.test.js | 6 +-- matrix/file.js | 2 +- matrix/matrix-command-handler.js | 2 +- test/ooye-test-data.sql | 5 ++- 30 files changed, 149 insertions(+), 105 deletions(-) rename db/{orm-utils.d.ts => orm-defs.d.ts} (98%) rename db/{orm-utils.js => orm-defs.js} (100%) diff --git a/d2m/actions/add-reaction.js b/d2m/actions/add-reaction.js index 1c2380f..f962a73 100644 --- a/d2m/actions/add-reaction.js +++ b/d2m/actions/add-reaction.js @@ -21,7 +21,7 @@ async function addReaction(data) { const user = data.member?.user assert.ok(user && user.username) - const parentID = select("event_message", "event_id", "WHERE message_id = ? AND part = 0").pluck().get(data.message_id) // 0 = primary + const parentID = select("event_message", "event_id", {message_id: data.message_id, part: 0}).pluck().get() // 0 = primary if (!parentID) return // Nothing can be done if the parent message was never bridged. assert.equal(typeof parentID, "string") diff --git a/d2m/actions/announce-thread.js b/d2m/actions/announce-thread.js index e52a2a3..86c6412 100644 --- a/d2m/actions/announce-thread.js +++ b/d2m/actions/announce-thread.js @@ -15,7 +15,7 @@ const api = sync.require("../../matrix/api") * @param {import("discord-api-types/v10").APIThreadChannel} thread */ async function announceThread(parentRoomID, threadRoomID, thread) { - const creatorMxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(thread.owner_id) + const creatorMxid = select("sim", "mxid", {user_id: thread.owner_id}).pluck().get() const content = await threadToAnnouncement.threadToAnnouncement(parentRoomID, threadRoomID, creatorMxid, thread, {api}) diff --git a/d2m/actions/create-room.js b/d2m/actions/create-room.js index 58488e7..51926ee 100644 --- a/d2m/actions/create-room.js +++ b/d2m/actions/create-room.js @@ -71,7 +71,7 @@ async function channelToKState(channel, guild) { const spaceID = await createSpace.ensureSpace(guild) assert.ok(typeof spaceID === "string") - const row = select("channel_room", ["nick", "custom_avatar"], "WHERE channel_id = ?").get(channel.id) + const row = select("channel_room", ["nick", "custom_avatar"], {channel_id: channel.id}).get() const customName = row?.nick const customAvatar = row?.custom_avatar const [convertedName, convertedTopic] = convertNameAndTopic(channel, guild, customName) @@ -248,7 +248,7 @@ async function _syncRoom(channelID, shouldActuallySync) { await inflightRoomCreate.get(channelID) // just waiting, and then doing a new db query afterwards, is the simplest way of doing it } - const existing = select("channel_room", ["room_id", "thread_parent"], "WHERE channel_id = ?").get(channelID) + const existing = select("channel_room", ["room_id", "thread_parent"], {channel_id: channelID}).get() if (!existing) { const creation = (async () => { @@ -308,9 +308,9 @@ async function _unbridgeRoom(channelID) { } async function unbridgeDeletedChannel(channelID, guildID) { - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(channelID) + const roomID = select("channel_room", "room_id", {channel_id: channelID}).pluck().get() assert.ok(roomID) - const spaceID = select("guild_space", "space_id", "WHERE guild_id = ?").pluck().get(guildID) + const spaceID = select("guild_space", "space_id", {guild_id: guildID}).pluck().get() assert.ok(spaceID) // remove room from being a space member diff --git a/d2m/actions/create-space.js b/d2m/actions/create-space.js index f90c1c3..da877e0 100644 --- a/d2m/actions/create-space.js +++ b/d2m/actions/create-space.js @@ -86,7 +86,7 @@ async function _syncSpace(guild, shouldActuallySync) { await inflightSpaceCreate.get(guild.id) // just waiting, and then doing a new db query afterwards, is the simplest way of doing it } - const spaceID = select("guild_space", "space_id", "WHERE guild_id = ?").pluck().get(guild.id) + const spaceID = select("guild_space", "space_id", {guild_id: guild.id}).pluck().get() if (!spaceID) { const creation = (async () => { @@ -117,7 +117,7 @@ async function _syncSpace(guild, shouldActuallySync) { const newAvatarState = spaceDiff["m.room.avatar/"] if (guild.icon && newAvatarState?.url) { // don't try to update rooms with custom avatars though - const roomsWithCustomAvatars = select("channel_room", "room_id", "WHERE custom_avatar IS NOT NULL").pluck().all() + const roomsWithCustomAvatars = select("channel_room", "room_id", {}, "WHERE custom_avatar IS NOT NULL").pluck().all() const childRooms = ks.kstateToState(spaceKState).filter(({type, state_key, content}) => { return type === "m.space.child" && "via" in content && !roomsWithCustomAvatars.includes(state_key) @@ -159,7 +159,7 @@ async function syncSpaceFully(guildID) { const guild = discord.guilds.get(guildID) assert.ok(guild) - const spaceID = select("guild_space", "space_id", "WHERE guild_id = ?").pluck().get(guildID) + const spaceID = select("guild_space", "space_id", {guild_id: guildID}).pluck().get() const guildKState = await guildToKState(guild) @@ -180,7 +180,7 @@ async function syncSpaceFully(guildID) { }).map(({state_key}) => state_key) for (const roomID of childRooms) { - const channelID = select("channel_room", "channel_id", "WHERE room_id = ?").pluck().get(roomID) + const channelID = select("channel_room", "channel_id", {room_id: roomID}).pluck().get() if (!channelID) continue if (discord.channels.has(channelID)) { await createRoom.syncRoom(channelID) @@ -198,7 +198,7 @@ async function syncSpaceFully(guildID) { async function syncSpaceExpressions(data) { // No need for kstate here. Each of these maps to a single state event, which will always overwrite what was there before. I can just send the state event. - const spaceID = select("guild_space", "space_id", "WHERE guild_id = ?").pluck().get(data.guild_id) + const spaceID = select("guild_space", "space_id", {guild_id: data.guild_id}).pluck().get() if (!spaceID) return if ("emojis" in data && data.emojis.length) { diff --git a/d2m/actions/delete-message.js b/d2m/actions/delete-message.js index ebbbbe4..30c31d4 100644 --- a/d2m/actions/delete-message.js +++ b/d2m/actions/delete-message.js @@ -9,10 +9,10 @@ const api = sync.require("../../matrix/api") * @param {import("discord-api-types/v10").GatewayMessageDeleteDispatchData} data */ async function deleteMessage(data) { - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(data.channel_id) + const roomID = select("channel_room", "room_id", {channel_id: data.channel_id}).pluck().get() if (!roomID) return - const eventsToRedact = select("event_message", "event_id", "WHERE message_id = ?").pluck().all(data.id) + const eventsToRedact = select("event_message", "event_id", {message_id: data.id}).pluck().all() for (const eventID of eventsToRedact) { // Unfortunately, we can't specify a sender to do the redaction as, unless we find out that info via the audit logs await api.redactEvent(roomID, eventID) diff --git a/d2m/actions/register-user.js b/d2m/actions/register-user.js index dc3995d..ca8fb8e 100644 --- a/d2m/actions/register-user.js +++ b/d2m/actions/register-user.js @@ -51,7 +51,7 @@ async function createSim(user) { */ async function ensureSim(user) { let mxid = null - const existing = select("sim", "mxid", "WHERE user_id = ?").pluck().get(user.id) + const existing = select("sim", "mxid", {user_id: user.id}).pluck().get() if (existing) { mxid = existing } else { @@ -74,7 +74,7 @@ async function ensureSimJoined(user, roomID) { const mxid = await ensureSim(user) // Ensure joined - const existing = select("sim_member", "mxid", "WHERE room_id = ? AND mxid = ?").pluck().get(roomID, mxid) + const existing = select("sim_member", "mxid", {room_id: roomID, mxid}).pluck().get() if (!existing) { try { await api.inviteToRoom(roomID, mxid) @@ -143,7 +143,7 @@ async function syncUser(user, member, guildID, roomID) { const mxid = await ensureSimJoined(user, roomID) const content = await memberToStateContent(user, member, guildID) const currentHash = hashProfileContent(content) - const existingHash = select("sim_member", "hashed_profile_content", "WHERE room_id = ? AND mxid = ?").safeIntegers().pluck().get(roomID, mxid) + const existingHash = select("sim_member", "hashed_profile_content", {room_id: roomID, mxid}).safeIntegers().pluck().get() // only do the actual sync if the hash has changed since we last looked if (existingHash !== currentHash) { await api.sendState(roomID, "m.room.member", mxid, content, mxid) @@ -153,9 +153,9 @@ async function syncUser(user, member, guildID, roomID) { } async function syncAllUsersInRoom(roomID) { - const mxids = select("sim_member", "mxid", "WHERE room_id = ?").pluck().all(roomID) + const mxids = select("sim_member", "mxid", {room_id: roomID}).pluck().all() - const channelID = select("channel_room", "channel_id", "WHERE room_id = ?").pluck().get(roomID) + const channelID = select("channel_room", "channel_id", {room_id: roomID}).pluck().get() assert.ok(typeof channelID === "string") /** @ts-ignore @type {import("discord-api-types/v10").APIGuildChannel} */ @@ -164,7 +164,7 @@ async function syncAllUsersInRoom(roomID) { assert.ok(typeof guildID === "string") for (const mxid of mxids) { - const userID = select("sim", "user_id", "WHERE mxid = ?").pluck().get(mxid) + const userID = select("sim", "user_id", {mxid}).pluck().get() assert.ok(typeof userID === "string") /** @ts-ignore @type {Required} */ diff --git a/d2m/actions/remove-reaction.js b/d2m/actions/remove-reaction.js index d84531e..eec93a4 100644 --- a/d2m/actions/remove-reaction.js +++ b/d2m/actions/remove-reaction.js @@ -18,9 +18,9 @@ const emoji = sync.require("../../m2d/converters/emoji") * @param {import("discord-api-types/v10").GatewayMessageReactionRemoveDispatchData} data */ async function removeReaction(data) { - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(data.channel_id) + const roomID = select("channel_room", "room_id", {channel_id: data.channel_id}).pluck().get() if (!roomID) return - const eventIDForMessage = select("event_message", "event_id", "WHERE message_id = ? AND part = 0").pluck().get(data.message_id) + const eventIDForMessage = select("event_message", "event_id", {message_id: data.message_id, part: 0}).pluck().get() if (!eventIDForMessage) return /** @type {Ty.Pagination>} */ @@ -42,7 +42,7 @@ async function removeReaction(data) { } if (!lookingAtMatrixReaction && !wantToRemoveMatrixReaction) { // We are removing a Discord user's reaction, so we just make the sim user remove it. - const mxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(data.user_id) + const mxid = select("sim", "mxid", {user_id: data.user_id}).pluck().get() if (mxid === event.sender) { await api.redactEvent(roomID, event.event_id, mxid) } @@ -55,9 +55,9 @@ async function removeReaction(data) { * @param {import("discord-api-types/v10").GatewayMessageReactionRemoveEmojiDispatchData} data */ async function removeEmojiReaction(data) { - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(data.channel_id) + const roomID = select("channel_room", "room_id", {channel_id: data.channel_id}).pluck().get() if (!roomID) return - const eventIDForMessage = select("event_message", "event_id", "WHERE message_id = ? AND part = 0").pluck().get(data.message_id) + const eventIDForMessage = select("event_message", "event_id", {message_id: data.message_id, part: 0}).pluck().get() if (!eventIDForMessage) return /** @type {Ty.Pagination>} */ @@ -79,9 +79,9 @@ async function removeEmojiReaction(data) { * @param {import("discord-api-types/v10").GatewayMessageReactionRemoveAllDispatchData} data */ async function removeAllReactions(data) { - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(data.channel_id) + const roomID = select("channel_room", "room_id", {channel_id: data.channel_id}).pluck().get() if (!roomID) return - const eventIDForMessage = select("event_message", "event_id", "WHERE message_id = ? AND part = 0").pluck().get(data.message_id) + const eventIDForMessage = select("event_message", "event_id", {message_id: data.message_id, part: 0}).pluck().get() if (!eventIDForMessage) return /** @type {Ty.Pagination>} */ diff --git a/d2m/converters/edit-to-changes.js b/d2m/converters/edit-to-changes.js index 9144ccb..8df3979 100644 --- a/d2m/converters/edit-to-changes.js +++ b/d2m/converters/edit-to-changes.js @@ -1,9 +1,9 @@ // @ts-check -const assert = require("assert") +const assert = require("assert").strict const passthrough = require("../../passthrough") -const {discord, sync, db, select} = passthrough +const {discord, sync, db, select, from} = passthrough /** @type {import("./message-to-event")} */ const messageToEvent = sync.require("../converters/message-to-event") /** @type {import("../actions/register-user")} */ @@ -21,15 +21,12 @@ const createRoom = sync.require("../actions/create-room") async function editToChanges(message, guild, api) { // Figure out what events we will be replacing - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(message.channel_id) - let senderMxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(message.author.id) || null - if (senderMxid) { - const senderIsInRoom = select("sim_member", "mxid", "WHERE room_id = ? AND mxid = ?").get(roomID, senderMxid) - if (!senderIsInRoom) { - senderMxid = null // just send as ooye bot - } - } - const oldEventRows = select("event_message", ["event_id", "event_type", "event_subtype", "part"], "WHERE message_id = ?").all(message.id) + const roomID = select("channel_room", "room_id", {channel_id: message.channel_id}).pluck().get() + assert(roomID) + /** @type {string?} Null if we don't have a sender in the room, which will happen if it's a webhook's message. The bridge bot will do the edit instead. */ + const senderMxid = from("sim").join("sim_member", "mxid").where({user_id: message.author.id}).pluck("mxid").get() || null + + const oldEventRows = select("event_message", ["event_id", "event_type", "event_subtype", "part"], {message_id: message.id}).all() // Figure out what we will be replacing them with diff --git a/d2m/converters/emoji-to-key.js b/d2m/converters/emoji-to-key.js index 7d04f97..bfd05c2 100644 --- a/d2m/converters/emoji-to-key.js +++ b/d2m/converters/emoji-to-key.js @@ -14,7 +14,7 @@ async function emojiToKey(emoji) { let key if (emoji.id) { // Custom emoji - const mxc = select("emoji", "mxc_url", "WHERE id = ?").pluck().get(emoji.id) + const mxc = select("emoji", "mxc_url", {emoji_id: emoji.id}).pluck().get(emoji.id) if (mxc) { // The custom emoji is registered and we should send it key = mxc diff --git a/d2m/converters/lottie.js b/d2m/converters/lottie.js index a00f98f..a0d1cd1 100644 --- a/d2m/converters/lottie.js +++ b/d2m/converters/lottie.js @@ -38,7 +38,7 @@ const Rlottie = (async () => { * @returns {Promise<{mxc_url: string, info: typeof INFO}>} */ async function convert(stickerItem) { - const existingMxc = select("lottie", "mxc_url", "WHERE sticker_id = ?").pluck().get(stickerItem.id) + const existingMxc = select("lottie", "mxc_url", {sticker_id: stickerItem.id}).pluck().get() if (existingMxc) return {mxc_url: existingMxc, info: INFO} const r = await Rlottie const res = await fetch(file.DISCORD_IMAGES_BASE + file.sticker(stickerItem)) diff --git a/d2m/converters/message-to-event.js b/d2m/converters/message-to-event.js index 62a032f..e3b932f 100644 --- a/d2m/converters/message-to-event.js +++ b/d2m/converters/message-to-event.js @@ -19,7 +19,7 @@ function getDiscordParseCallbacks(message, useHTML) { return { /** @param {{id: string, type: "discordUser"}} node */ user: node => { - const mxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(node.id) + const mxid = select("sim", "mxid", {user_id: node.id}).pluck().get() const username = message.mentions.find(ment => ment.id === node.id)?.username || node.id if (mxid && useHTML) { return `@${username}` @@ -29,7 +29,7 @@ function getDiscordParseCallbacks(message, useHTML) { }, /** @param {{id: string, type: "discordChannel"}} node */ channel: node => { - const row = select("channel_room", ["room_id", "name", "nick"], "WHERE channel_id = ?").get(node.id) + const row = select("channel_room", ["room_id", "name", "nick"], {channel_id: node.id}).get() if (!row) { return `<#${node.id}>` // fallback for when this channel is not bridged } else if (useHTML) { @@ -41,7 +41,7 @@ function getDiscordParseCallbacks(message, useHTML) { /** @param {{animated: boolean, name: string, id: string, type: "discordEmoji"}} node */ emoji: node => { if (useHTML) { - const mxc = select("emoji", "mxc_url", "WHERE id = ?").pluck().get(node.id) + const mxc = select("emoji", "mxc_url", {emoji_id: node.id}).pluck().get() if (mxc) { return `:${node.name}:` } else { // We shouldn't get here since all emojis should have been added ahead of time in the messageToEvent function. @@ -85,8 +85,8 @@ async function messageToEvent(message, guild, options = {}, di) { const ref = message.message_reference assert(ref) assert(ref.message_id) - const eventID = select("event_message", "event_id", "WHERE message_id = ?").pluck().get(ref.message_id) - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(ref.channel_id) + const eventID = select("event_message", "event_id", {message_id: ref.message_id}).pluck().get() + const roomID = select("channel_room", "room_id", {channel_id: ref.channel_id}).pluck().get() if (!eventID || !roomID) return [] const event = await di.api.getEvent(roomID, eventID) return [{ @@ -138,8 +138,8 @@ async function messageToEvent(message, guild, options = {}, di) { async function addTextEvent(content, msgtype, {scanMentions}) { content = content.replace(/https:\/\/(?:ptb\.|canary\.|www\.)?discord(?:app)?\.com\/channels\/([0-9]+)\/([0-9]+)\/([0-9]+)/, (whole, guildID, channelID, messageID) => { - const eventID = select("event_message", "event_id", "WHERE message_id = ?").pluck().get(messageID) - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(channelID) + const eventID = select("event_message", "event_id", {message_id: messageID}).pluck().get() + const roomID = select("channel_room", "room_id", {channel_id: channelID}).pluck().get() if (eventID && roomID) { return `https://matrix.to/#/${roomID}/${eventID}` } else { @@ -155,8 +155,8 @@ async function messageToEvent(message, guild, options = {}, di) { const id = match[3] const name = match[2] const animated = +!!match[1] - const row = select("emoji", "id", "WHERE id = ?").pluck().get(id) - if (!row) { + const exists = select("emoji", "emoji_id", {emoji_id: id}).pluck().get() + if (!exists) { // The custom emoji is not registered. We will register it and then add it. emojiDownloads.push( file.uploadDiscordFileToMxc(file.emoji(id, animated)).then(mxc => { @@ -182,7 +182,7 @@ async function messageToEvent(message, guild, options = {}, di) { const matches = [...content.matchAll(/@ ?([a-z0-9._]+)\b/gi)] if (matches.length && matches.some(m => m[1].match(/[a-z]/i))) { const writtenMentionsText = matches.map(m => m[1].toLowerCase()) - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(message.channel_id) + const roomID = select("channel_room", "room_id", {channel_id: message.channel_id}).pluck().get() assert(roomID) const {joined} = await di.api.getJoinedMembers(roomID) for (const [mxid, member] of Object.entries(joined)) { diff --git a/d2m/converters/thread-to-announcement.js b/d2m/converters/thread-to-announcement.js index 003134b..8ef3a67 100644 --- a/d2m/converters/thread-to-announcement.js +++ b/d2m/converters/thread-to-announcement.js @@ -17,7 +17,7 @@ const userRegex = reg.namespaces.users.map(u => new RegExp(u.regex)) * @param {{api: import("../../matrix/api")}} di simple-as-nails dependency injection for the matrix API */ async function threadToAnnouncement(parentRoomID, threadRoomID, creatorMxid, thread, di) { - const branchedFromEventID = select("event_message", "event_id", "WHERE message_id = ?").pluck().get(thread.id) + const branchedFromEventID = select("event_message", "event_id", {message_id: thread.id}).pluck().get() /** @type {{"m.mentions"?: any, "m.in_reply_to"?: any}} */ const context = {} if (branchedFromEventID) { diff --git a/d2m/converters/user-to-mxid.js b/d2m/converters/user-to-mxid.js index 8514fc9..35a3b5e 100644 --- a/d2m/converters/user-to-mxid.js +++ b/d2m/converters/user-to-mxid.js @@ -53,7 +53,7 @@ function userToSimName(user) { assert.notEqual(user.discriminator, "0000", "cannot create user for a webhook") // 1. Is sim user already registered? - const existing = select("sim", "sim_name", "WHERE user_id = ?").pluck().get(user.id) + const existing = select("sim", "sim_name", {user_id: user.id}).pluck().get() if (existing) return existing // 2. Register based on username (could be new or old format) @@ -64,7 +64,7 @@ function userToSimName(user) { } // Check for conflicts with already registered sims - const matches = select("sim", "sim_name", "WHERE sim_name LIKE ? ESCAPE '@'").pluck().all(downcased + "%") + const matches = select("sim", "sim_name", {}, "WHERE sim_name LIKE ? ESCAPE '@'").pluck().all(downcased + "%") // Keep generating until we get a suggestion that doesn't conflict for (const suggestion of generateLocalpartAlternatives(preferences)) { if (!matches.includes(suggestion)) return suggestion diff --git a/d2m/event-dispatcher.js b/d2m/event-dispatcher.js index 0fd1da5..525b735 100644 --- a/d2m/event-dispatcher.js +++ b/d2m/event-dispatcher.js @@ -46,7 +46,7 @@ module.exports = { const channelID = gatewayMessage.d.channel_id if (!channelID) return - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(channelID) + const roomID = select("channel_room", "room_id", {channel_id: channelID}).pluck().get() if (!roomID) return let stackLines = e.stack.split("\n") @@ -85,7 +85,7 @@ module.exports = { async checkMissedMessages(client, guild) { if (guild.unavailable) return const bridgedChannels = select("channel_room", "channel_id").pluck().all() - const prepared = select("event_message", "event_id", "WHERE message_id = ?").pluck() + const prepared = select("event_message", "event_id", {}, "WHERE message_id = ?").pluck() for (const channel of guild.channels.concat(guild.threads)) { if (!bridgedChannels.includes(channel.id)) continue if (!channel.last_message_id) continue @@ -129,7 +129,7 @@ module.exports = { * @param {import("discord-api-types/v10").APIThreadChannel} thread */ async onThreadCreate(client, thread) { - const parentRoomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(thread.parent_id) + const parentRoomID = select("channel_room", "room_id", {channel_id: thread.parent_id}).pluck().get() if (!parentRoomID) return // Not interested in a thread if we aren't interested in its wider channel const threadRoomID = await createRoom.syncRoom(thread.id) // Create room (will share the same inflight as the initial message to the thread) await announceThread.announceThread(parentRoomID, threadRoomID, thread) @@ -140,7 +140,7 @@ module.exports = { * @param {import("discord-api-types/v10").GatewayGuildUpdateDispatchData} guild */ async onGuildUpdate(client, guild) { - const spaceID = select("guild_space", "space_id", "WHERE guild_id = ?").pluck().get(guild.id) + const spaceID = select("guild_space", "space_id", {guild_id: guild.id}).pluck().get() if (!spaceID) return await createSpace.syncSpace(guild) }, @@ -151,7 +151,7 @@ module.exports = { * @param {boolean} isThread */ async onChannelOrThreadUpdate(client, channelOrThread, isThread) { - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(channelOrThread.id) + const roomID = select("channel_room", "room_id", {channel_id: channelOrThread.id}).pluck().get() if (!roomID) return // No target room to update the data on await createRoom.syncRoom(channelOrThread.id) }, @@ -162,7 +162,7 @@ module.exports = { */ async onMessageCreate(client, message) { if (message.webhook_id) { - const row = select("webhook", "webhook_id", "WHERE webhook_id = ?").pluck().get(message.webhook_id) + const row = select("webhook", "webhook_id", {webhook_id: message.webhook_id}).pluck().get() if (row) { // The message was sent by the bridge's own webhook on discord. We don't want to reflect this back, so just drop it. return @@ -183,7 +183,7 @@ module.exports = { */ async onMessageUpdate(client, data) { if (data.webhook_id) { - const row = select("webhook", "webhook_id", "WHERE webhook_id = ?").pluck().get(data.webhook_id) + const row = select("webhook", "webhook_id", {webhook_id: data.webhook_id}).pluck().get() if (row) { // The update was sent by the bridge's own webhook on discord. We don't want to reflect this back, so just drop it. return @@ -249,9 +249,9 @@ module.exports = { * @param {import("discord-api-types/v10").GatewayTypingStartDispatchData} data */ async onTypingStart(client, data) { - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(data.channel_id) + const roomID = select("channel_room", "room_id", {channel_id: data.channel_id}).pluck().get() if (!roomID) return - const mxid = from("sim").join("sim_member", "mxid").and("WHERE user_id = ? AND room_id = ?").pluck("mxid").get(data.user_id, roomID) + const mxid = from("sim").join("sim_member", "mxid").where({user_id: data.user_id, room_id: roomID}).pluck("mxid").get() if (!mxid) return // Each Discord user triggers the notification every 8 seconds as long as they remain typing. // Discord does not send typing stopped events, so typing only stops if the timeout is reached or if the user sends their message. diff --git a/db/migrations/0003-distinguish-column-names.sql b/db/migrations/0003-distinguish-column-names.sql index 4ffe0ac..f94720b 100644 --- a/db/migrations/0003-distinguish-column-names.sql +++ b/db/migrations/0003-distinguish-column-names.sql @@ -12,4 +12,8 @@ ALTER TABLE lottie RENAME COLUMN id TO sticker_id; ALTER TABLE sim RENAME COLUMN discord_id TO user_id; +-- Rename id to emoji_id so joins make sense in the future + +ALTER TABLE emoji RENAME COLUMN id TO emoji_id; + COMMIT; diff --git a/db/orm-utils.d.ts b/db/orm-defs.d.ts similarity index 98% rename from db/orm-utils.d.ts rename to db/orm-defs.d.ts index a0cd817..9524f20 100644 --- a/db/orm-utils.d.ts +++ b/db/orm-defs.d.ts @@ -64,7 +64,7 @@ export type Models = { } emoji: { - id: string + emoji_id: string name: string animated: number mxc_url: string diff --git a/db/orm-utils.js b/db/orm-defs.js similarity index 100% rename from db/orm-utils.js rename to db/orm-defs.js diff --git a/db/orm.js b/db/orm.js index 6195753..9325bc0 100644 --- a/db/orm.js +++ b/db/orm.js @@ -1,19 +1,28 @@ // @ts-check const {db} = require("../passthrough") -const U = require("./orm-utils") +const U = require("./orm-defs") /** * @template {keyof U.Models} Table * @template {keyof U.Models[Table]} Col * @param {Table} table * @param {Col[] | Col} cols + * @param {Partial} where * @param {string} [e] */ -function select(table, cols, e = "") { +function select(table, cols, where = {}, e = "") { if (!Array.isArray(cols)) cols = [cols] + const parameters = [] + const wheres = Object.entries(where).map(([col, value]) => { + parameters.push(value) + return `"${col}" = ?` + }) + const whereString = wheres.length ? " WHERE " + wheres.join(" AND ") : "" /** @type {U.Prepared>} */ - const prepared = db.prepare(`SELECT ${cols.map(k => `"${String(k)}"`).join(", ")} FROM ${table} ${e}`) + const prepared = db.prepare(`SELECT ${cols.map(k => `"${String(k)}"`).join(", ")} FROM ${table} ${whereString} ${e}`) + prepared.get = prepared.get.bind(prepared, ...parameters) + prepared.all = prepared.all.bind(prepared, ...parameters) return prepared } @@ -26,13 +35,18 @@ class From { * @param {Table} table */ constructor(table) { - /** @type {Table[]} */ + /** @private @type {Table[]} */ this.tables = [table] - + /** @private */ this.sql = "" + /** @private */ this.cols = [] + /** @private */ this.using = [] + /** @private */ this.isPluck = false + /** @private */ + this.parameters = [] } /** @@ -78,7 +92,19 @@ class From { * @param {string} sql */ and(sql) { - this.sql = sql + this.sql += " " + sql + return this + } + + /** + * @param {Partial} conditions + */ + where(conditions) { + const wheres = Object.entries(conditions).map(([col, value]) => { + this.parameters.push(value) + return `"${col}" = ?` + }) + this.sql += " WHERE " + wheres.join(" AND ") return this } @@ -98,12 +124,12 @@ class From { get(..._) { const prepared = this.prepare() - return prepared.get(..._) + return prepared.get(...this.parameters, ..._) } all(..._) { const prepared = this.prepare() - return prepared.all(..._) + return prepared.all(...this.parameters, ..._) } } diff --git a/db/orm.test.js b/db/orm.test.js index 7b8237b..36e95c2 100644 --- a/db/orm.test.js +++ b/db/orm.test.js @@ -6,7 +6,7 @@ const data = require("../test/data") const {db, select, from} = require("../passthrough") test("orm: select: get works", t => { - const row = select("guild_space", "guild_id", "WHERE space_id = ?").get("!jjWAGMeQdNrVZSSfvz:cadence.moe") + const row = select("guild_space", "guild_id", {}, "WHERE space_id = ?").get("!jjWAGMeQdNrVZSSfvz:cadence.moe") t.equal(row?.guild_id, data.guild.general.id) }) @@ -16,10 +16,20 @@ test("orm: from: get works", t => { }) test("orm: select: get pluck works", t => { - const guildID = select("guild_space", "guild_id", "WHERE space_id = ?").pluck().get("!jjWAGMeQdNrVZSSfvz:cadence.moe") + const guildID = select("guild_space", "guild_id", {}, "WHERE space_id = ?").pluck().get("!jjWAGMeQdNrVZSSfvz:cadence.moe") t.equal(guildID, data.guild.general.id) }) +test("orm: select: get, where and pluck works", t => { + const channelID = select("message_channel", "channel_id", {message_id: "1128118177155526666"}).pluck().get() + t.equal(channelID, "112760669178241024") +}) + +test("orm: select: all, where and pluck works on multiple columns", t => { + const names = select("member_cache", "displayname", {room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe", mxid: "@cadence:cadence.moe"}).pluck().all() + t.deepEqual(names, ["cadence [they]"]) +}) + test("orm: from: get pluck works", t => { const guildID = from("guild_space").pluck("guild_id").and("WHERE space_id = ?").get("!jjWAGMeQdNrVZSSfvz:cadence.moe") t.equal(guildID, data.guild.general.id) @@ -29,3 +39,8 @@ test("orm: from: join and pluck works", t => { const mxid = from("sim").join("sim_member", "mxid").and("WHERE user_id = ? AND room_id = ?").pluck("mxid").get("771520384671416320", "!hYnGGlPHlbujVVfktC:cadence.moe") t.equal(mxid, "@_ooye_bojack_horseman:cadence.moe") }) + +test("orm: from: where and pluck works", t => { + const subtypes = from("event_message").where({message_id: "1141501302736695316"}).pluck("event_subtype").all() + t.deepEqual(subtypes.sort(), ["m.image", "m.text"]) +}) diff --git a/discord/discord-command-handler.js b/discord/discord-command-handler.js index 8fb6aec..5711561 100644 --- a/discord/discord-command-handler.js +++ b/discord/discord-command-handler.js @@ -81,7 +81,7 @@ const commands = [{ execute: replyctx( async (message, channel, guild, ctx) => { // Guard - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(channel.id) + const roomID = select("channel_room", "room_id", {channel_id: channel.id}).pluck().get() if (!roomID) return discord.snow.channel.createMessage(channel.id, { ...ctx, content: "This channel isn't bridged to the other side." @@ -125,8 +125,8 @@ const commands = [{ execute: replyctx( async (message, channel, guild, ctx) => { // Check guild is bridged - const spaceID = select("guild_space", "space_id", "WHERE guild_id = ?").pluck().get(guild.id) - const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(channel.id) + const spaceID = select("guild_space", "space_id", {guild_id: guild.id}).pluck().get() + const roomID = select("channel_room", "room_id", {channel_id: channel.id}).pluck().get() if (!spaceID || !roomID) return discord.snow.channel.createMessage(channel.id, { ...ctx, content: "This server isn't bridged to Matrix, so you can't invite Matrix users." diff --git a/m2d/actions/add-reaction.js b/m2d/actions/add-reaction.js index bd8eeff..eb12bd4 100644 --- a/m2d/actions/add-reaction.js +++ b/m2d/actions/add-reaction.js @@ -14,9 +14,9 @@ const emoji = sync.require("../converters/emoji") * @param {Ty.Event.Outer} event */ async function addReaction(event) { - const channelID = select("channel_room", "channel_id", "WHERE room_id = ?").pluck().get(event.room_id) + const channelID = select("channel_room", "channel_id", {room_id: event.room_id}).pluck().get() if (!channelID) return // We just assume the bridge has already been created - const messageID = select("event_message", "message_id", "WHERE event_id = ? AND part = 0").pluck().get(event.content["m.relates_to"].event_id) // 0 = primary + const messageID = select("event_message", "message_id", {event_id: event.content["m.relates_to"].event_id, part: 0}).pluck().get() // 0 = primary if (!messageID) return // Nothing can be done if the parent message was never bridged. const key = event.content["m.relates_to"].key // TODO: handle custom text or emoji reactions diff --git a/m2d/actions/channel-webhook.js b/m2d/actions/channel-webhook.js index 0fde77a..3bb728d 100644 --- a/m2d/actions/channel-webhook.js +++ b/m2d/actions/channel-webhook.js @@ -14,7 +14,7 @@ const {discord, db, select} = passthrough */ async function ensureWebhook(channelID, forceCreate = false) { if (!forceCreate) { - const row = select("webhook", ["webhook_id", "webhook_token"], "WHERE channel_id = ?").get(channelID) + const row = select("webhook", ["webhook_id", "webhook_token"], {channel_id: channelID}).get() if (row) { return { id: row.webhook_id, diff --git a/m2d/actions/redact.js b/m2d/actions/redact.js index 74b92b8..316b466 100644 --- a/m2d/actions/redact.js +++ b/m2d/actions/redact.js @@ -12,7 +12,7 @@ const utils = sync.require("../converters/utils") * @param {Ty.Event.Outer_M_Room_Redaction} event */ async function deleteMessage(event) { - const rows = from("event_message").join("message_channel", "message_id").select("channel_id", "message_id").and("WHERE event_id = ?").all(event.redacts) + const rows = from("event_message").join("message_channel", "message_id").select("channel_id", "message_id").where({event_id: event.redacts}).all() for (const row of rows) { discord.snow.channel.deleteMessage(row.channel_id, row.message_id, event.content.reason) } @@ -23,7 +23,8 @@ async function deleteMessage(event) { */ async function removeReaction(event) { const hash = utils.getEventIDHash(event.redacts) - const row = from("reaction").join("message_channel", "message_id").select("channel_id", "message_id", "encoded_emoji").and("WHERE hashed_event_id = ?").get(hash) + // TODO: this works but fix the type + const row = from("reaction").join("message_channel", "message_id").select("channel_id", "message_id", "encoded_emoji").where({hashed_event_id: hash}).get() if (!row) return await discord.snow.channel.deleteReactionSelf(row.channel_id, row.message_id, row.encoded_emoji) db.prepare("DELETE FROM reaction WHERE hashed_event_id = ?").run(hash) diff --git a/m2d/actions/send-event.js b/m2d/actions/send-event.js index d5797b9..13966fb 100644 --- a/m2d/actions/send-event.js +++ b/m2d/actions/send-event.js @@ -58,7 +58,7 @@ async function resolvePendingFiles(message) { /** @param {Ty.Event.Outer_M_Room_Message | Ty.Event.Outer_M_Room_Message_File | Ty.Event.Outer_M_Sticker} event */ async function sendEvent(event) { - const row = select("channel_room", ["channel_id", "thread_parent"], "WHERE room_id = ?").get(event.room_id) + const row = select("channel_room", ["channel_id", "thread_parent"], {room_id: event.room_id}).get() if (!row) return // allow the bot to exist in unbridged rooms, just don't do anything with it let channelID = row.channel_id let threadID = undefined diff --git a/m2d/converters/emoji.js b/m2d/converters/emoji.js index a505cd1..e17367c 100644 --- a/m2d/converters/emoji.js +++ b/m2d/converters/emoji.js @@ -7,19 +7,19 @@ const passthrough = require("../../passthrough") const {sync, select} = passthrough /** - * @param {string} emoji + * @param {string} input * @param {string | null | undefined} shortcode * @returns {string?} */ -function encodeEmoji(emoji, shortcode) { +function encodeEmoji(input, shortcode) { let discordPreferredEncoding - if (emoji.startsWith("mxc://")) { + if (input.startsWith("mxc://")) { // Custom emoji - let row = select("emoji", ["id", "name"], "WHERE mxc_url = ?").get(emoji) + let row = select("emoji", ["emoji_id", "name"], {mxc_url: input}).get() if (!row && shortcode) { // Use the name to try to find a known emoji with the same name. const name = shortcode.replace(/^:|:$/g, "") - row = select("emoji", ["id", "name"], "WHERE name = ?").get(name) + row = select("emoji", ["emoji_id", "name"], {name: name}).get() } if (!row) { // We don't have this emoji and there's no realistic way to just-in-time upload a new emoji somewhere. @@ -27,11 +27,11 @@ function encodeEmoji(emoji, shortcode) { return null } // Cool, we got an exact or a candidate emoji. - discordPreferredEncoding = encodeURIComponent(`${row.name}:${row.id}`) + discordPreferredEncoding = encodeURIComponent(`${row.name}:${row.emoji_id}`) } else { // Default emoji // https://github.com/discord/discord-api-docs/issues/2723#issuecomment-807022205 ???????????? - const encoded = encodeURIComponent(emoji) + const encoded = encodeURIComponent(input) const encodedTrimmed = encoded.replace(/%EF%B8%8F/g, "") const forceTrimmedList = [ @@ -42,10 +42,10 @@ function encodeEmoji(emoji, shortcode) { discordPreferredEncoding = ( forceTrimmedList.includes(encodedTrimmed) ? encodedTrimmed - : encodedTrimmed !== encoded && [...emoji].length === 2 ? encoded + : encodedTrimmed !== encoded && [...input].length === 2 ? encoded : encodedTrimmed) - console.log("add reaction from matrix:", emoji, encoded, encodedTrimmed, "chosen:", discordPreferredEncoding) + console.log("add reaction from matrix:", input, encoded, encodedTrimmed, "chosen:", discordPreferredEncoding) } return discordPreferredEncoding } diff --git a/m2d/converters/event-to-message.js b/m2d/converters/event-to-message.js index ae67645..bd9c37a 100644 --- a/m2d/converters/event-to-message.js +++ b/m2d/converters/event-to-message.js @@ -121,7 +121,7 @@ turndownService.addRule("emoji", { replacement: function (content, node) { const mxcUrl = node.getAttribute("src") // Get the known emoji from the database. (We may not be able to actually use this if it was from another server.) - const row = select("emoji", ["id", "name", "animated"], "WHERE mxc_url = ?").get(mxcUrl) + const row = select("emoji", ["emoji_id", "name", "animated"], {mxc_url: mxcUrl}).get() // Also guess a suitable emoji based on the ID (if available) or name let guess = null const guessedName = node.getAttribute("title").replace(/^:|:$/g, "") @@ -129,7 +129,7 @@ turndownService.addRule("emoji", { /** @type {{name: string, id: string, animated: number}[]} */ // @ts-ignore const emojis = guild.emojis - const match = emojis.find(e => e.id === row?.id) || emojis.find(e => e.name === guessedName) || emojis.find(e => e.name?.toLowerCase() === guessedName.toLowerCase()) + const match = emojis.find(e => e.id === row?.emoji_id) || emojis.find(e => e.name === guessedName) || emojis.find(e => e.name?.toLowerCase() === guessedName.toLowerCase()) if (match) { guess = match break @@ -180,7 +180,7 @@ turndownService.addRule("fencedCodeBlock", { * @returns {Promise<{displayname?: string?, avatar_url?: string?}>} */ async function getMemberFromCacheOrHomeserver(roomID, mxid, api) { - const row = select("member_cache", ["displayname", "avatar_url"], "WHERE room_id = ? AND mxid = ?").get(roomID, mxid) + const row = select("member_cache", ["displayname", "avatar_url"], {room_id: roomID, mxid}).get() if (row) return row return api.getStateEvent(roomID, "m.room.member", mxid).then(event => { db.prepare("REPLACE INTO member_cache (room_id, mxid, displayname, avatar_url) VALUES (?, ?, ?, ?)").run(roomID, mxid, event?.displayname || null, event?.avatar_url || null) @@ -285,7 +285,7 @@ async function eventToMessage(event, guild, di) { if (relType !== "m.replace") return const originalEventId = relatesTo.event_id if (!originalEventId) return - messageIDsToEdit = select("event_message", "message_id", "WHERE event_id = ? ORDER BY part").pluck().all(originalEventId) + messageIDsToEdit = select("event_message", "message_id", {event_id: originalEventId}, "ORDER BY part").pluck().all() if (!messageIDsToEdit.length) return // Ok, it's an edit. @@ -316,7 +316,7 @@ async function eventToMessage(event, guild, di) { if (!repliedToEventId) return let repliedToEvent = await di.api.getEvent(event.room_id, repliedToEventId) if (!repliedToEvent) return - const row = from("event_message").join("message_channel", "message_id").select("channel_id", "message_id").and("WHERE event_id = ? ORDER BY part").get(repliedToEventId) + const row = from("event_message").join("message_channel", "message_id").select("channel_id", "message_id").where({event_id: repliedToEventId}).and("ORDER BY part").get() if (row) { replyLine = `<:L1:1144820033948762203><:L2:1144820084079087647>https://discord.com/channels/${guild.id}/${row.channel_id}/${row.message_id} ` } else { @@ -324,7 +324,7 @@ async function eventToMessage(event, guild, di) { } const sender = repliedToEvent.sender const senderName = sender.match(/@([^:]*)/)?.[1] || sender - const authorID = select("sim", "user_id", "WHERE mxid = ?").pluck().get(repliedToEvent.sender) + const authorID = select("sim", "user_id", {mxid: repliedToEvent.sender}).pluck().get() if (authorID) { replyLine += `<@${authorID}>` } else { @@ -367,14 +367,14 @@ async function eventToMessage(event, guild, di) { // Handling mentions of Discord users input = input.replace(/("https:\/\/matrix.to\/#\/(@[^"]+)")>/g, (whole, attributeValue, mxid) => { if (!utils.eventSenderIsFromDiscord(mxid)) return whole - const userID = select("sim", "user_id", "WHERE mxid = ?").pluck().get(mxid) + const userID = select("sim", "user_id", {mxid: mxid}).pluck().get() if (!userID) return whole return `${attributeValue} data-user-id="${userID}">` }) // Handling mentions of Discord rooms input = input.replace(/("https:\/\/matrix.to\/#\/(![^"]+)")>/g, (whole, attributeValue, roomID) => { - const channelID = select("channel_room", "channel_id", "WHERE room_id = ?").pluck().get(roomID) + const channelID = select("channel_room", "channel_id", {room_id: roomID}).pluck().get() if (!channelID) return whole return `${attributeValue} data-channel-id="${channelID}">` }) diff --git a/m2d/converters/event-to-message.test.js b/m2d/converters/event-to-message.test.js index 6fc8123..ef7f65d 100644 --- a/m2d/converters/event-to-message.test.js +++ b/m2d/converters/event-to-message.test.js @@ -1508,7 +1508,7 @@ test("event2message: caches the member if the member is not known", async t => { } ) - t.deepEqual(select("member_cache", ["avatar_url", "displayname", "mxid"], "WHERE room_id = '!should_be_newly_cached:cadence.moe'").all(), [ + t.deepEqual(select("member_cache", ["avatar_url", "displayname", "mxid"], {room_id: "!should_be_newly_cached:cadence.moe"}).all(), [ {avatar_url: "mxc://cadence.moe/this_is_the_avatar", displayname: null, mxid: "@should_be_newly_cached:cadence.moe"} ]) t.equal(called, 1, "getStateEvent should be called once") @@ -1551,7 +1551,7 @@ test("event2message: skips caching the member if the member does not exist, some }] } ) - t.deepEqual(select("member_cache", ["avatar_url", "displayname", "mxid"], "WHERE room_id = '!not_real:cadence.moe'").all(), []) + t.deepEqual(select("member_cache", ["avatar_url", "displayname", "mxid"], {room_id: "!not_real:cadence.moe"}).all(), []) t.equal(called, 1, "getStateEvent should be called once") }) @@ -1594,7 +1594,7 @@ test("event2message: overly long usernames are shifted into the message content" }] } ) - t.deepEqual(select("member_cache", ["avatar_url", "displayname", "mxid"], "WHERE room_id = '!should_be_newly_cached_2:cadence.moe'").all(), [ + t.deepEqual(select("member_cache", ["avatar_url", "displayname", "mxid"], {room_id: "!should_be_newly_cached_2:cadence.moe"}).all(), [ {avatar_url: null, displayname: "I am BLACK I am WHITE I am SHORT I am LONG I am EVERYTHING YOU THINK IS IMPORTANT and I DON'T MATTER", mxid: "@should_be_newly_cached_2:cadence.moe"} ]) t.equal(called, 1, "getStateEvent should be called once") diff --git a/matrix/file.js b/matrix/file.js index 2dd64f1..626a1ad 100644 --- a/matrix/file.js +++ b/matrix/file.js @@ -43,7 +43,7 @@ async function uploadDiscordFileToMxc(path) { } // Has this file already been uploaded in the past? Grab the existing copy from the database. - const existingFromDb = select("file", "mxc_url", "WHERE discord_url = ?").pluck().get(urlNoExpiry) + const existingFromDb = select("file", "mxc_url", {discord_url: urlNoExpiry}).pluck().get() if (typeof existingFromDb === "string") { return existingFromDb } diff --git a/matrix/matrix-command-handler.js b/matrix/matrix-command-handler.js index 0f90bc6..a22d2b1 100644 --- a/matrix/matrix-command-handler.js +++ b/matrix/matrix-command-handler.js @@ -151,7 +151,7 @@ const commands = [{ async (event, realBody, ctx) => { // Guard /** @type {string} */ // @ts-ignore - const channelID = select("channel_room", "channel_id", "WHERE room_id = ?").pluck().get(event.room_id) + const channelID = select("channel_room", "channel_id", {room_id: event.room_id}).pluck().get() const guildID = discord.channels.get(channelID)?.["guild_id"] let matrixOnlyReason = null const matrixOnlyConclusion = "So the emoji will be uploaded on Matrix-side only. It will still be usable over the bridge, but may have degraded functionality." diff --git a/test/ooye-test-data.sql b/test/ooye-test-data.sql index 681ec91..88dabcd 100644 --- a/test/ooye-test-data.sql +++ b/test/ooye-test-data.sql @@ -8,7 +8,8 @@ INSERT INTO channel_room (channel_id, room_id, name, nick, thread_parent, custom ('497161350934560778', '!CzvdIdUQXgUjDVKxeU:cadence.moe', 'amanda-spam', NULL, NULL, NULL), ('160197704226439168', '!hYnGGlPHlbujVVfktC:cadence.moe', 'the-stanley-parable-channel', 'bots', NULL, NULL), ('1100319550446252084', '!BnKuBPCvyfOkhcUjEu:cadence.moe', 'worm-farm', NULL, NULL, NULL), -('297272183716052993', '!rEOspnYqdOalaIFniV:cadence.moe', 'general', NULL, NULL, NULL); +('297272183716052993', '!rEOspnYqdOalaIFniV:cadence.moe', 'general', NULL, NULL, NULL), +('122155380120748034', '!cqeGDbPiMFAhLsqqqq:cadence.moe', 'cadences-mind', 'coding', NULL, NULL); INSERT INTO sim (user_id, sim_name, localpart, mxid) VALUES ('0', 'bot', '_ooye_bot', '@_ooye_bot:cadence.moe'), @@ -72,7 +73,7 @@ INSERT INTO file (discord_url, mxc_url) VALUES ('https://cdn.discordapp.com/emojis/393635038903926784.gif', 'mxc://cadence.moe/WbYqNlACRuicynBfdnPYtmvc'), ('https://cdn.discordapp.com/attachments/176333891320283136/1157854643037163610/Screenshot_20231001_034036.jpg', 'mxc://cadence.moe/zAXdQriaJuLZohDDmacwWWDR'); -INSERT INTO emoji (id, name, animated, mxc_url) VALUES +INSERT INTO emoji (emoji_id, name, animated, mxc_url) VALUES ('230201364309868544', 'hippo', 0, 'mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC'), ('393635038903926784', 'hipposcope', 1, 'mxc://cadence.moe/WbYqNlACRuicynBfdnPYtmvc'), ('362741439211503616', 'bn_re', 0, 'mxc://cadence.moe/OIpqpfxTnHKokcsYqDusxkBT'), From f69cf587a28c89ceeab17e2d31c5cbdbc51ab2cf Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Fri, 6 Oct 2023 12:48:43 +1300 Subject: [PATCH 003/501] Mention tags and update efficiency details --- readme.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/readme.md b/readme.md index c0768ae..a086716 100644 --- a/readme.md +++ b/readme.md @@ -45,10 +45,12 @@ For more information about features, [see the user guide.](https://gitdab.com/ca Using WeatherStack as a thin layer between the bridge application and the Discord API lets us control exactly what data is cached. Only necessary information is cached. For example, member data, user data, message content, and past edits are never stored in memory. This keeps the memory usage low and also prevents it ballooning in size over the bridge's runtime. -The bridge uses a small SQLite database to store relationships like which Discord messages correspond to which Matrix messages. This is so the bridge knows what to edit when some message is edited on Discord. Using `without rowid` on the database tables stores the index and the data in the same B-tree. Since Matrix and Discord's internal IDs are quite long, this vastly reduces storage space because those IDs do not have to be stored twice separately. On my personal instance of OOYE, every 100,000 messages sent require only 17.7 MB of storage space in the SQLite database. +The bridge uses a small SQLite database to store relationships like which Discord messages correspond to which Matrix messages. This is so the bridge knows what to edit when some message is edited on Discord. Using `without rowid` on the database tables stores the index and the data in the same B-tree. Since Matrix and Discord's internal IDs are quite long, this vastly reduces storage space because those IDs do not have to be stored twice separately. Some event IDs are actually stored as xxhash integers to reduce storage requirements even more. On my personal instance of OOYE, every 100,000 messages sent require only 17.7 MB of storage space in the SQLite database. Only necessary data and columns are queried from the database. We only contact the homeserver API if the database doesn't contain what we need. +File uploads (like avatars from bridged members) are checked locally and deduplicated. Only brand new files are uploaded to the homeserver. This saves loads of space in the homeserver's media repo, especially for Synapse. + # Setup If you get stuck, you're welcome to message @cadence:cadence.moe to ask for help setting up OOYE! @@ -63,19 +65,21 @@ Follow these steps: 1. [Get Node.js version 18 or later](https://nodejs.org/en/download/releases) (the version is required by the matrix-appservice dependency) -2. Install dependencies: `npm install --save-dev` (omit --save-dev if you will not run the automated tests) +1. Clone this repo and checkout a specific tag. (Development happens on main. Stabler versions are tagged.) -3. Copy `config.example.js` to `config.js` and fill in Discord token. +1. Install dependencies: `npm install --save-dev` (omit --save-dev if you will not run the automated tests) -4. Copy `registration.example.yaml` to `registration.yaml` and fill in bracketed values. You could generate each hex string with `dd if=/dev/urandom bs=32 count=1 2> /dev/null | basenc --base16 | dd conv=lcase 2> /dev/null`. Register the registration in Synapse's `homeserver.yaml` through the usual appservice installation process, then restart Synapse. +1. Copy `config.example.js` to `config.js` and fill in Discord token. -5. Run `node scripts/seed.js` to check your setup, create the database and server state (only need to run this once ever) +1. Copy `registration.example.yaml` to `registration.yaml` and fill in bracketed values. You could generate each hex string with `dd if=/dev/urandom bs=32 count=1 2> /dev/null | basenc --base16 | dd conv=lcase 2> /dev/null`. Register the registration in Synapse's `homeserver.yaml` through the usual appservice installation process, then restart Synapse. -6. Make sure the tests work by running `npm t` +1. Run `node scripts/seed.js` to check your setup, create the database and server state (only need to run this once ever) -7. Start the bridge: `node start.js` +1. Make sure the tests work by running `npm t` -8. Add the bot to a server - use any *one* of the following commands for an invite link: +1. Start the bridge: `node start.js` + +1. Add the bot to a server - use any *one* of the following commands for an invite link: * (in the REPL) `addbot` * (in a chat) `//addbot` * $ `node addbot.js` From ef15c850dd67e0196ab52cf282d24fe58b6faadc Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Fri, 6 Oct 2023 16:50:23 +1300 Subject: [PATCH 004/501] Promote another event if part = 0 is redacted --- d2m/actions/edit-message.js | 19 ++++++++++++++----- d2m/converters/edit-to-changes.js | 16 +++++++++++++++- d2m/converters/edit-to-changes.test.js | 16 ++++++++++++---- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/d2m/actions/edit-message.js b/d2m/actions/edit-message.js index 5cdd690..a1538b9 100644 --- a/d2m/actions/edit-message.js +++ b/d2m/actions/edit-message.js @@ -1,7 +1,7 @@ // @ts-check const passthrough = require("../../passthrough") -const { sync, db } = passthrough +const {sync, db, select} = passthrough /** @type {import("../converters/edit-to-changes")} */ const editToChanges = sync.require("../converters/edit-to-changes") /** @type {import("../../matrix/api")} */ @@ -12,7 +12,7 @@ const api = sync.require("../../matrix/api") * @param {import("discord-api-types/v10").APIGuild} guild */ async function editMessage(message, guild) { - const {roomID, eventsToRedact, eventsToReplace, eventsToSend, senderMxid} = await editToChanges.editToChanges(message, guild, api) + const {roomID, eventsToRedact, eventsToReplace, eventsToSend, senderMxid, promoteEvent, promoteNextEvent} = await editToChanges.editToChanges(message, guild, api) // 1. Replace all the things. for (const {oldID, newContent} of eventsToReplace) { @@ -33,10 +33,17 @@ async function editMessage(message, guild) { for (const eventID of eventsToRedact) { await api.redactEvent(roomID, eventID, senderMxid) db.prepare("DELETE FROM event_message WHERE event_id = ?").run(eventID) - // TODO: If I just redacted part = 0, I should update one of the other events to make it the new part = 0, right? } - // 3. Send all the things. + // 3. Consistency: Ensure there is exactly one part = 0 + let eventPart = 1 + if (promoteEvent) { + db.prepare("UPDATE event_message SET part = 0 WHERE event_id = ?").run(promoteEvent) + } else if (promoteNextEvent) { + eventPart = 0 + } + + // 4. Send all the things. for (const content of eventsToSend) { const eventType = content.$type /** @type {Pick> & { $type?: string }} */ @@ -44,7 +51,9 @@ async function editMessage(message, guild) { delete contentWithoutType.$type const eventID = await api.sendEvent(roomID, eventType, contentWithoutType, senderMxid) - db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES (?, ?, ?, ?, 1, 1)").run(eventID, eventType, content.msgtype || null, message.id) // part 1 = supporting; source 1 = discord + db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES (?, ?, ?, ?, ?, 1)").run(eventID, eventType, content.msgtype || null, message.id, eventPart) // part 1 = supporting; source 1 = discord + + eventPart = 1 } } diff --git a/d2m/converters/edit-to-changes.js b/d2m/converters/edit-to-changes.js index 8df3979..6d4bbdd 100644 --- a/d2m/converters/edit-to-changes.js +++ b/d2m/converters/edit-to-changes.js @@ -83,6 +83,20 @@ async function editToChanges(message, guild, api) { // Anything remaining in oldEventRows is present in the old version only and should be redacted. eventsToRedact = oldEventRows + // If events are being deleted, we might be deleting the part = 0. But we want to have a part = 0 at all times. In this case we choose an existing event to promote. + let promoteEvent = null, promoteNextEvent = false + if (eventsToRedact.some(e => e.part === 0)) { + if (eventsToReplace.length) { + // We can choose an existing event to promote. Bigger order is better. + const order = e => 2*+(e.event_type === "m.room.message") + 1*+(e.event_subtype === "m.text") + eventsToReplace.sort((a, b) => order(b) - order(a)) + promoteEvent = eventsToReplace[0].old.event_id + } else { + // Everything is being deleted. Whatever gets sent in their place will be the new part = 0. + promoteNextEvent = true + } + } + // Now, everything in eventsToSend and eventsToRedact is a real change, but everything in eventsToReplace might not have actually changed! // (Example: a MESSAGE_UPDATE for a text+image message - Discord does not allow the image to be changed, but the text might have been.) // So we'll remove entries from eventsToReplace that *definitely* cannot have changed. (This is category 4 mentioned above.) Everything remaining *may* have changed. @@ -103,7 +117,7 @@ async function editToChanges(message, guild, api) { eventsToRedact = eventsToRedact.map(e => e.event_id) eventsToReplace = eventsToReplace.map(e => ({oldID: e.old.event_id, newContent: makeReplacementEventContent(e.old.event_id, e.newFallbackContent, e.newInnerContent)})) - return {roomID, eventsToReplace, eventsToRedact, eventsToSend, senderMxid} + return {roomID, eventsToReplace, eventsToRedact, eventsToSend, senderMxid, promoteEvent, promoteNextEvent} } /** diff --git a/d2m/converters/edit-to-changes.test.js b/d2m/converters/edit-to-changes.test.js index 449af98..c0762c7 100644 --- a/d2m/converters/edit-to-changes.test.js +++ b/d2m/converters/edit-to-changes.test.js @@ -4,7 +4,7 @@ const data = require("../../test/data") const Ty = require("../../types") test("edit2changes: edit by webhook", async t => { - const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.edit_by_webhook, data.guild.general, {}) + const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.edit_by_webhook, data.guild.general, {}) t.deepEqual(eventsToRedact, []) t.deepEqual(eventsToSend, []) t.deepEqual(eventsToReplace, [{ @@ -27,10 +27,12 @@ test("edit2changes: edit by webhook", async t => { } }]) t.equal(senderMxid, null) + t.equal(promoteEvent, null) + t.equal(promoteNextEvent, false) }) test("edit2changes: bot response", async t => { - const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.bot_response, data.guild.general, { + const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.bot_response, data.guild.general, { async getJoinedMembers(roomID) { t.equal(roomID, "!hYnGGlPHlbujVVfktC:cadence.moe") return new Promise(resolve => { @@ -82,17 +84,21 @@ test("edit2changes: bot response", async t => { } }]) t.equal(senderMxid, "@_ooye_bojack_horseman:cadence.moe") + t.equal(promoteEvent, null) + t.equal(promoteNextEvent, false) }) test("edit2changes: remove caption from image", async t => { - const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.removed_caption_from_image, data.guild.general, {}) + const {eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.removed_caption_from_image, data.guild.general, {}) t.deepEqual(eventsToRedact, ["$mtR8cJqM4fKno1bVsm8F4wUVqSntt2sq6jav1lyavuA"]) t.deepEqual(eventsToSend, []) t.deepEqual(eventsToReplace, []) + t.equal(promoteEvent, "$51f4yqHinwnSbPEQ9dCgoyy4qiIJSX0QYYVUnvwyTCI") + t.equal(promoteNextEvent, false) }) test("edit2changes: add caption back to that image", async t => { - const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.added_caption_to_image, data.guild.general, {}) + const {eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.added_caption_to_image, data.guild.general, {}) t.deepEqual(eventsToRedact, []) t.deepEqual(eventsToSend, [{ $type: "m.room.message", @@ -101,6 +107,8 @@ test("edit2changes: add caption back to that image", async t => { "m.mentions": {} }]) t.deepEqual(eventsToReplace, []) + t.equal(promoteEvent, null) + t.equal(promoteNextEvent, false) }) test("edit2changes: stickers and attachments are not changed, only the content can be edited", async t => { From a5d170eb8fa53b6f96f66e03d69113e9d4f831f1 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Fri, 6 Oct 2023 16:58:18 +1300 Subject: [PATCH 005/501] Choosing first event as primary part = 0 is fine --- d2m/actions/send-message.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/d2m/actions/send-message.js b/d2m/actions/send-message.js index 9befbf6..ab5b6c6 100644 --- a/d2m/actions/send-message.js +++ b/d2m/actions/send-message.js @@ -46,7 +46,10 @@ async function sendMessage(message, guild) { const eventID = await api.sendEvent(roomID, eventType, eventWithoutType, senderMxid, useTimestamp) db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES (?, ?, ?, ?, ?, 1)").run(eventID, eventType, event.msgtype || null, message.id, eventPart) // source 1 = discord - eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting + // The primary event is part = 0 and has the most important and distinct information. It is used to provide reply previews, be pinned, and possibly future uses. + // The first event is chosen to be the primary part because it is usually the message text content and is more likely to be distinct. + // For example, "Reply to 'this meme made me think of you'" is more useful than "Replied to image". + eventPart = 1 eventIDs.push(eventID) } From a925750254a6645e493d0c46334a74aa0b864d3b Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Fri, 6 Oct 2023 16:58:44 +1300 Subject: [PATCH 006/501] Handling custom emoji reactions is already done --- m2d/actions/add-reaction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/m2d/actions/add-reaction.js b/m2d/actions/add-reaction.js index eb12bd4..e6a94d9 100644 --- a/m2d/actions/add-reaction.js +++ b/m2d/actions/add-reaction.js @@ -19,7 +19,7 @@ async function addReaction(event) { const messageID = select("event_message", "message_id", {event_id: event.content["m.relates_to"].event_id, part: 0}).pluck().get() // 0 = primary if (!messageID) return // Nothing can be done if the parent message was never bridged. - const key = event.content["m.relates_to"].key // TODO: handle custom text or emoji reactions + const key = event.content["m.relates_to"].key const discordPreferredEncoding = emoji.encodeEmoji(key, event.content.shortcode) if (!discordPreferredEncoding) return From 9fbef15ad1d922199aa70dfed659eda79ccf64da Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Fri, 6 Oct 2023 17:00:21 +1300 Subject: [PATCH 007/501] The function argument is good enough --- matrix/file.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/matrix/file.js b/matrix/file.js index 626a1ad..f0ee29a 100644 --- a/matrix/file.js +++ b/matrix/file.js @@ -21,13 +21,11 @@ function _removeExpiryParams(url) { } /** - * @param {string} path + * @param {string} path or full URL if it's not a Discord CDN file */ async function uploadDiscordFileToMxc(path) { let url if (path.startsWith("http")) { - // TODO: this is cheating to make seed.js easier. due a refactor or a name change since it's not soley for discord? - // possibly could be good to save non-discord external URLs under a user-specified key rather than simply using the url? url = path } else { url = DISCORD_IMAGES_BASE + path From e3b2c844d83b30179fef233b7277cc1955f9bd9c Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Sat, 7 Oct 2023 20:58:46 +1300 Subject: [PATCH 008/501] Fix emoji_id references and add tests --- d2m/converters/emoji-to-key.js | 4 ++-- d2m/converters/emoji-to-key.test.js | 21 +++++++++++++++++ d2m/converters/expression.js | 2 +- d2m/converters/message-to-event.js | 20 +++++----------- d2m/converters/message-to-event.test.js | 12 ++++++++++ test/data.js | 31 +++++++++++++++++++++++++ test/ooye-test-data.sql | 3 ++- test/test.js | 3 ++- 8 files changed, 77 insertions(+), 19 deletions(-) create mode 100644 d2m/converters/emoji-to-key.test.js diff --git a/d2m/converters/emoji-to-key.js b/d2m/converters/emoji-to-key.js index bfd05c2..267664c 100644 --- a/d2m/converters/emoji-to-key.js +++ b/d2m/converters/emoji-to-key.js @@ -14,7 +14,7 @@ async function emojiToKey(emoji) { let key if (emoji.id) { // Custom emoji - const mxc = select("emoji", "mxc_url", {emoji_id: emoji.id}).pluck().get(emoji.id) + const mxc = select("emoji", "mxc_url", {emoji_id: emoji.id}).pluck().get() if (mxc) { // The custom emoji is registered and we should send it key = mxc @@ -22,7 +22,7 @@ async function emojiToKey(emoji) { // The custom emoji is not registered. We will register it and then add it. assert(emoji.name) // The docs say: "name may be null when custom emoji data is not available, for example, if it was deleted from the guild" const mxc = await file.uploadDiscordFileToMxc(file.emoji(emoji.id, emoji.animated)) - db.prepare("INSERT OR IGNORE INTO emoji (id, name, animated, mxc_url) VALUES (?, ?, ?, ?)").run(emoji.id, emoji.name, +!!emoji.animated, mxc) + db.prepare("INSERT OR IGNORE INTO emoji (emoji_id, name, animated, mxc_url) VALUES (?, ?, ?, ?)").run(emoji.id, emoji.name, +!!emoji.animated, mxc) key = mxc // TODO: what happens if the matrix user also tries adding this reaction? the bridge bot isn't able to use that emoji... } diff --git a/d2m/converters/emoji-to-key.test.js b/d2m/converters/emoji-to-key.test.js new file mode 100644 index 0000000..5af046c --- /dev/null +++ b/d2m/converters/emoji-to-key.test.js @@ -0,0 +1,21 @@ +// @ts-check + +const {test} = require("supertape") +const {emojiToKey} = require("./emoji-to-key") +const data = require("../../test/data") +const Ty = require("../../types") + +test("emoji2key: unicode emoji works", async t => { + const result = await emojiToKey({id: null, name: "🐈"}) + t.equal(result, "🐈") +}) + +test("emoji2key: custom emoji works", async t => { + const result = await emojiToKey({id: "230201364309868544", name: "hippo", animated: false}) + t.equal(result, "mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC") +}) + +test("emoji2key: custom animated emoji works", async t => { + const result = await emojiToKey({id: "393635038903926784", name: "hipposcope", animated: true}) + t.equal(result, "mxc://cadence.moe/WbYqNlACRuicynBfdnPYtmvc") +}) diff --git a/d2m/converters/expression.js b/d2m/converters/expression.js index 87f0d88..1c52c98 100644 --- a/d2m/converters/expression.js +++ b/d2m/converters/expression.js @@ -29,7 +29,7 @@ async function emojisToState(emojis) { }, url } - db.prepare("INSERT OR IGNORE INTO emoji (id, name, animated, mxc_url) VALUES (?, ?, ?, ?)").run(emoji.id, emoji.name, +!!emoji.animated, url) + db.prepare("INSERT OR IGNORE INTO emoji (emoji_id, name, animated, mxc_url) VALUES (?, ?, ?, ?)").run(emoji.id, emoji.name, +!!emoji.animated, url) }).catch(e => { if (e.data.errcode === "M_TOO_LARGE") { // Very unlikely to happen. Only possible for 3x-series emojis uploaded shortly after animated emojis were introduced, when there was no 256 KB size limit. return diff --git a/d2m/converters/message-to-event.js b/d2m/converters/message-to-event.js index e3b932f..3241582 100644 --- a/d2m/converters/message-to-event.js +++ b/d2m/converters/message-to-event.js @@ -9,6 +9,8 @@ const passthrough = require("../../passthrough") const {sync, db, discord, select, from} = passthrough /** @type {import("../../matrix/file")} */ const file = sync.require("../../matrix/file") +/** @type {import("./emoji-to-key")} */ +const emojiToKey = sync.require("./emoji-to-key") /** @type {import("./lottie")} */ const lottie = sync.require("./lottie") const reg = require("../../matrix/read-registration") @@ -150,22 +152,12 @@ async function messageToEvent(message, guild, options = {}, di) { // Handling emojis that we don't know about. The emoji has to be present in the DB for it to be picked up in the emoji markdown converter. // So we scan the message ahead of time for all its emojis and ensure they are in the DB. const emojiMatches = [...content.matchAll(/<(a?):([^:>]{2,64}):([0-9]+)>/g)] - const emojiDownloads = [] - for (const match of emojiMatches) { + await Promise.all(emojiMatches.map(match => { const id = match[3] const name = match[2] - const animated = +!!match[1] - const exists = select("emoji", "emoji_id", {emoji_id: id}).pluck().get() - if (!exists) { - // The custom emoji is not registered. We will register it and then add it. - emojiDownloads.push( - file.uploadDiscordFileToMxc(file.emoji(id, animated)).then(mxc => { - db.prepare("INSERT OR IGNORE INTO emoji (id, name, animated, mxc_url) VALUES (?, ?, ?, ?)").run(id, name, animated, mxc) - }) - ) - } - } - await Promise.all(emojiDownloads) + const animated = match[1] + return emojiToKey.emojiToKey({id, name, animated}) // Register the custom emoji if needed + })) let html = markdown.toHTML(content, { discordCallback: getDiscordParseCallbacks(message, true) diff --git a/d2m/converters/message-to-event.test.js b/d2m/converters/message-to-event.test.js index f369912..715aa5d 100644 --- a/d2m/converters/message-to-event.test.js +++ b/d2m/converters/message-to-event.test.js @@ -464,6 +464,18 @@ test("message2event: mid-message small bridged emoji", async t => { }]) }) +test("message2event: emoji that hasn't been registered yet", async t => { + const events = await messageToEvent(data.message.not_been_registered_emoji, data.guild.general, {}) + t.deepEqual(events, [{ + $type: "m.room.message", + "m.mentions": {}, + msgtype: "m.text", + body: ":Yeah:", + format: "org.matrix.custom.html", + formatted_body: ':Yeah:' + }]) +}) + test("message2event: emoji triple long name", async t => { const events = await messageToEvent(data.message.emoji_triple_long_name, data.guild.general, {}) t.deepEqual(events, [{ diff --git a/test/data.js b/test/data.js index 9d1cdbc..bcaf9c4 100644 --- a/test/data.js +++ b/test/data.js @@ -1089,6 +1089,37 @@ module.exports = { flags: 0, components: [] }, + not_been_registered_emoji: { + id: "1126733830494093453", + type: 0, + content: "<:Yeah:1125827250609201255>", + 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: [] + }, emoji_triple_long_name: { id: "1156394116540805170", type: 0, diff --git a/test/ooye-test-data.sql b/test/ooye-test-data.sql index 88dabcd..4ad318c 100644 --- a/test/ooye-test-data.sql +++ b/test/ooye-test-data.sql @@ -71,7 +71,8 @@ INSERT INTO file (discord_url, mxc_url) VALUES ('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/393635038903926784.gif', 'mxc://cadence.moe/WbYqNlACRuicynBfdnPYtmvc'), -('https://cdn.discordapp.com/attachments/176333891320283136/1157854643037163610/Screenshot_20231001_034036.jpg', 'mxc://cadence.moe/zAXdQriaJuLZohDDmacwWWDR'); +('https://cdn.discordapp.com/attachments/176333891320283136/1157854643037163610/Screenshot_20231001_034036.jpg', 'mxc://cadence.moe/zAXdQriaJuLZohDDmacwWWDR'), +('https://cdn.discordapp.com/emojis/1125827250609201255.png', 'mxc://cadence.moe/pgdGTxAyEltccRgZKxdqzHHP'); INSERT INTO emoji (emoji_id, name, animated, mxc_url) VALUES ('230201364309868544', 'hippo', 0, 'mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC'), diff --git a/test/test.js b/test/test.js index 76fe658..98ecf1c 100644 --- a/test/test.js +++ b/test/test.js @@ -50,8 +50,9 @@ file._actuallyUploadDiscordFileToMxc = function(url, res) { throw new Error(`Not require("../d2m/converters/message-to-event.embeds.test") require("../d2m/converters/edit-to-changes.test") require("../d2m/converters/thread-to-announcement.test") - require("../d2m/actions/create-room.test") require("../d2m/converters/user-to-mxid.test") + require("../d2m/converters/emoji-to-key.test") + require("../d2m/actions/create-room.test") require("../d2m/actions/register-user.test") require("../m2d/converters/event-to-message.test") require("../m2d/converters/utils.test") From 0b40a5025498f1e84cddf2ceb14c51ec9b91bcd7 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Sat, 7 Oct 2023 21:57:09 +1300 Subject: [PATCH 009/501] Set profile data in seed.js --- d2m/discord-packets.js | 1 - readme.md | 3 +-- scripts/seed.js | 29 +++++++++++++++++++++++++---- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/d2m/discord-packets.js b/d2m/discord-packets.js index 979f756..dfba8b0 100644 --- a/d2m/discord-packets.js +++ b/d2m/discord-packets.js @@ -25,7 +25,6 @@ const utils = { client.application = message.d.application console.log(`Discord logged in as ${client.user.username}#${client.user.discriminator} (${client.user.id})`) - } else if (message.t === "GUILD_CREATE") { client.guilds.set(message.d.id, message.d) const arr = [] diff --git a/readme.md b/readme.md index a086716..f1a35c7 100644 --- a/readme.md +++ b/readme.md @@ -73,8 +73,7 @@ Follow these steps: 1. Copy `registration.example.yaml` to `registration.yaml` and fill in bracketed values. You could generate each hex string with `dd if=/dev/urandom bs=32 count=1 2> /dev/null | basenc --base16 | dd conv=lcase 2> /dev/null`. Register the registration in Synapse's `homeserver.yaml` through the usual appservice installation process, then restart Synapse. -1. Run `node scripts/seed.js` to check your setup, create the database and server state (only need to run this once ever) - +1. Run `node scripts/seed.js` to check your setup and set the bot's initial state. You only need to run this once ever. 1. Make sure the tests work by running `npm t` 1. Start the bridge: `node start.js` diff --git a/scripts/seed.js b/scripts/seed.js index 3b24768..2a0c279 100644 --- a/scripts/seed.js +++ b/scripts/seed.js @@ -12,7 +12,15 @@ const migrate = require("../db/migrate") const sync = new HeatSync({watchFS: false}) -Object.assign(passthrough, { config, sync, db }) +Object.assign(passthrough, { sync, config, db }) + +const orm = sync.require("../db/orm") +passthrough.from = orm.from +passthrough.select = orm.select + +const DiscordClient = require("../d2m/discord-client") +const discord = new DiscordClient(config.discordToken, "no") +passthrough.discord = discord const api = require("../matrix/api") const file = require("../matrix/file") @@ -27,19 +35,32 @@ const utils = require("../m2d/converters/utils") assert(utils.eventSenderIsFromDiscord(mxid)) // appservice's mxid must be in the namespace it controls assert(reg.ooye.server_origin.match(/^https?:\/\//)) // must start with http or https assert.notEqual(reg.ooye.server_origin.slice(-1), "/") // must not end in slash + console.log("✅ Configuration looks good...") // database ddl... await migrate.migrate(db) + // add initial rows to database, like adding the bot to sim... + db.prepare("INSERT OR IGNORE INTO sim (user_id, sim_name, localpart, mxid) VALUES (?, ?, ?, ?)").run("0", reg.sender_localpart.slice(reg.ooye.namespace_prefix.length), reg.sender_localpart, mxid) + + console.log("✅ Database is ready...") + // ensure homeserver well-known is valid and returns reg.ooye.server_name... // upload initial images... - const avatarUrl = await file.uploadDiscordFileToMxc("https://cadence.moe/friends/out_of_your_element_rev_2.jpg") + const avatarUrl = await file.uploadDiscordFileToMxc("https://cadence.moe/friends/out_of_your_element.png") + + // set profile data on discord... + const avatarImageBuffer = await fetch("https://cadence.moe/friends/out_of_your_element.png").then(res => res.arrayBuffer()) + await discord.snow.user.updateSelf({avatar: "data:image/png;base64," + Buffer.from(avatarImageBuffer).toString("base64")}) + await discord.snow.requestHandler.request(`/applications/@me`, {}, "patch", "json", {description: "Powered by **Out Of Your Element**\nhttps://gitdab.com/cadence/out-of-your-element"}) + console.log("✅ Discord profile updated...") // set profile data on homeserver... await api.profileSetDisplayname(mxid, "Out Of Your Element") await api.profileSetAvatarUrl(mxid, avatarUrl) + console.log("✅ Matrix profile updated...") - // add initial rows to database, like adding the bot to sim... - db.prepare("INSERT INTO sim (user_id, sim_name, localpart, mxid) VALUES (?, ?, ?, ?)").run("0", reg.sender_localpart.slice(reg.ooye.namespace_prefix.length), reg.sender_localpart, mxid) + console.log("Good to go. I hope you enjoy Out Of Your Element.") + process.exit() })() From 0e56255f82a4921e9898c0e3cce032b892a50d7b Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Sat, 7 Oct 2023 22:47:31 +1300 Subject: [PATCH 010/501] Improve code coverage --- d2m/actions/register-user.js | 2 +- d2m/converters/edit-to-changes.test.js | 17 +++++- m2d/converters/emoji-sheet.js | 11 +++- m2d/converters/event-to-message.js | 2 +- m2d/converters/event-to-message.test.js | 9 +-- m2d/converters/utils.test.js | 11 +++- package.json | 2 +- test/data.js | 74 +++++++++++++++++++++++++ 8 files changed, 118 insertions(+), 10 deletions(-) diff --git a/d2m/actions/register-user.js b/d2m/actions/register-user.js index ca8fb8e..62e0fb6 100644 --- a/d2m/actions/register-user.js +++ b/d2m/actions/register-user.js @@ -134,7 +134,7 @@ function hashProfileContent(content) { * 1. Join the sim to the room if needed * 2. Make an object of what the new room member state content would be, including uploading the profile picture if it hasn't been done before * 3. Compare against the previously known state content, which is helpfully stored in the database - * 4. If the state content has changes, send it to Matrix and update it in the database for next time + * 4. If the state content has changed, send it to Matrix and update it in the database for next time * @param {import("discord-api-types/v10").APIUser} user * @param {Omit} member * @returns {Promise} mxid of the updated sim diff --git a/d2m/converters/edit-to-changes.test.js b/d2m/converters/edit-to-changes.test.js index c0762c7..8c67f6a 100644 --- a/d2m/converters/edit-to-changes.test.js +++ b/d2m/converters/edit-to-changes.test.js @@ -97,6 +97,22 @@ test("edit2changes: remove caption from image", async t => { t.equal(promoteNextEvent, false) }) +test("edit2changes: change file type", async t => { + const {eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.changed_file_type, data.guild.general, {}) + t.deepEqual(eventsToRedact, ["$51f4yqHinwnSbPEQ9dCgoyy4qiIJSX0QYYVUnvwyTCJ"]) + t.deepEqual(eventsToSend, [{ + $type: "m.room.message", + body: "📝 Uploaded file: https://cdn.discordapp.com/attachments/112760669178241024/1141501302497615912/gaze_into_my_dark_mind.txt (20 MB)", + format: "org.matrix.custom.html", + formatted_body: "📝 Uploaded file: gaze_into_my_dark_mind.txt (20 MB)", + "m.mentions": {}, + msgtype: "m.text" + }]) + t.deepEqual(eventsToReplace, []) + t.equal(promoteEvent, null) + t.equal(promoteNextEvent, true) +}) + test("edit2changes: add caption back to that image", async t => { const {eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.added_caption_to_image, data.guild.general, {}) t.deepEqual(eventsToRedact, []) @@ -136,7 +152,6 @@ test("edit2changes: stickers and attachments are not changed, only the content c }]) }) - test("edit2changes: edit of reply to skull webp attachment with content", async t => { const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.edit_of_reply_to_skull_webp_attachment_with_content, data.guild.general, {}) t.deepEqual(eventsToRedact, []) diff --git a/m2d/converters/emoji-sheet.js b/m2d/converters/emoji-sheet.js index c271567..c05f45d 100644 --- a/m2d/converters/emoji-sheet.js +++ b/m2d/converters/emoji-sheet.js @@ -40,6 +40,7 @@ async function compositeMatrixEmojis(mxcs) { .resize(SIZE, SIZE, {fit: "contain", background: {r: 0, g: 0, b: 0, alpha: 0}}) .png({compressionLevel: 0}) .toBuffer((err, buffer, info) => { + /* c8 ignore next */ if (err) return reject(err) resolve({info, buffer}) }) @@ -73,6 +74,7 @@ async function compositeMatrixEmojis(mxcs) { } })) + // Calculate the size of the final composited image const totalWidth = Math.min(buffers.length, IMAGES_ACROSS) * SIZE const imagesDown = Math.ceil(buffers.length / IMAGES_ACROSS) const totalHeight = imagesDown * SIZE @@ -80,8 +82,15 @@ async function compositeMatrixEmojis(mxcs) { let left = 0, top = 0 for (const buffer of buffers) { if (Buffer.isBuffer(buffer)) { + // Composite the current buffer into the sprite sheet comp.push({left, top, input: buffer}) - ;(left += SIZE) + SIZE > RESULT_WIDTH && (left = 0, top += SIZE) + // The next buffer should be placed one slot to the right + left += SIZE + // If we're out of space to fit the entire next buffer there, wrap to the next line + if (left + SIZE > RESULT_WIDTH) { + left = 0 + top += SIZE + } } } diff --git a/m2d/converters/event-to-message.js b/m2d/converters/event-to-message.js index bd9c37a..8a68656 100644 --- a/m2d/converters/event-to-message.js +++ b/m2d/converters/event-to-message.js @@ -125,7 +125,7 @@ turndownService.addRule("emoji", { // Also guess a suitable emoji based on the ID (if available) or name let guess = null const guessedName = node.getAttribute("title").replace(/^:|:$/g, "") - for (const guild of discord?.guilds.values() || []) { + for (const guild of discord.guilds.values()) { /** @type {{name: string, id: string, animated: number}[]} */ // @ts-ignore const emojis = guild.emojis diff --git a/m2d/converters/event-to-message.test.js b/m2d/converters/event-to-message.test.js index ef7f65d..87a4b12 100644 --- a/m2d/converters/event-to-message.test.js +++ b/m2d/converters/event-to-message.test.js @@ -1,9 +1,11 @@ +const assert = require("assert").strict const {test} = require("supertape") const {eventToMessage} = require("./event-to-message") const data = require("../../test/data") const {MatrixServerError} = require("../../matrix/mreq") const {db, select} = require("../../passthrough") +/* c8 ignore next 7 */ function slow() { if (process.argv.includes("--slow")) { return test @@ -843,6 +845,7 @@ test("event2message: editing a rich reply to a sim user", async t => { }, data.guild.general, { api: { getEvent: (roomID, eventID) => { + assert.ok(eventID === "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04" || eventID === "$v_Gtr-bzv9IVlSLBO5DstzwmiDd-GSFaNfHX66IupV8") if (eventID === "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04") { eventsFetched.push("past") return mockGetEvent(t, "!fGgIymcYWOqjbSRUdV:cadence.moe", "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04", { @@ -870,8 +873,6 @@ test("event2message: editing a rich reply to a sim user", async t => { } } })(roomID, eventID) - } else { - throw new Error(`This test wasn't meant to fetch event ID: ${eventID}`) } } } @@ -1920,9 +1921,9 @@ slow()("event2message: all unknown chess emojis are reuploaded as a sprite sheet sender: "@cadence:cadence.moe", content: { msgtype: "m.text", - body: "testing :chess_good_move::chess_incorrect::chess_blund::chess_brilliant_move::chess_blundest::chess_draw_black:", + body: "testing :chess_good_move::chess_incorrect::chess_blund::chess_brilliant_move::chess_blundest::chess_draw_black::chess_good_move::chess_incorrect::chess_blund::chess_brilliant_move::chess_blundest::chess_draw_black:", format: "org.matrix.custom.html", - formatted_body: "testing \":chess_good_move:\"\":chess_incorrect:\"\":chess_blund:\"\":chess_brilliant_move:\"\":chess_blundest:\"\":chess_draw_black:\"" + formatted_body: "testing \":chess_good_move:\"\":chess_incorrect:\"\":chess_blund:\"\":chess_brilliant_move:\"\":chess_blundest:\"\":chess_draw_black:\"\":chess_good_move:\"\":chess_incorrect:\"\":chess_blund:\"\":chess_brilliant_move:\"\":chess_blundest:\"\":chess_draw_black:\"" }, event_id: "$Me6iE8C8CZyrDEOYYrXKSYRuuh_25Jj9kZaNrf7LKr4", room_id: "!maggESguZBqGBZtSnr:cadence.moe" diff --git a/m2d/converters/utils.test.js b/m2d/converters/utils.test.js index ae3159e..9d039fe 100644 --- a/m2d/converters/utils.test.js +++ b/m2d/converters/utils.test.js @@ -1,7 +1,7 @@ // @ts-check const {test} = require("supertape") -const {eventSenderIsFromDiscord} = require("./utils") +const {eventSenderIsFromDiscord, getEventIDHash} = require("./utils") test("sender type: matrix user", t => { t.notOk(eventSenderIsFromDiscord("@cadence:cadence.moe")) @@ -14,3 +14,12 @@ test("sender type: ooye bot", t => { test("sender type: ooye puppet", t => { t.ok(eventSenderIsFromDiscord("@_ooye_sheep:cadence.moe")) }) + +test("event hash: hash is the same each time", t => { + const eventID = "$example" + t.equal(getEventIDHash(eventID), getEventIDHash(eventID)) +}) + +test("event hash: hash is different for different inputs", t => { + t.notEqual(getEventIDHash("$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe1"), getEventIDHash("$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe2")) +}) diff --git a/package.json b/package.json index e9a42e2..e40e82c 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,6 @@ "addbot": "node addbot.js", "test": "cross-env FORCE_COLOR=true supertape --no-check-assertions-count --format tap test/test.js | tap-dot", "test-slow": "cross-env FORCE_COLOR=true supertape --no-check-assertions-count --format tap test/test.js -- --slow | tap-dot", - "cover": "c8 --skip-full -r html -r text supertape --no-check-assertions-count --format fail test/test.js" + "cover": "c8 --skip-full -x db/migrations -x matrix/file.js -x matrix/api.js -x matrix/mreq.js -r html -r text supertape --no-check-assertions-count --format fail test/test.js -- --slow" } } diff --git a/test/data.js b/test/data.js index bcaf9c4..d6abc9d 100644 --- a/test/data.js +++ b/test/data.js @@ -1665,6 +1665,80 @@ module.exports = { tts: false, type: 0 }, + changed_file_type: { + attachments: [ + { + content_type: "text/plain", + filename: "gaze_into_my_dark_mind.txt", + size: 20102199, + url: "https://cdn.discordapp.com/attachments/112760669178241024/1141501302497615912/gaze_into_my_dark_mind.txt", + } + ], + author: { + avatar: "47db1be7ab77e1d812a4573177af0692", + avatar_decoration: null, + discriminator: "0", + global_name: "wing", + id: "112890272819507200", + public_flags: 0, + username: ".wing." + }, + channel_id: "112760669178241024", + components: [], + content: "", + edited_timestamp: "2023-08-17T00:13:18.620975+00:00", + embeds: [], + flags: 0, + guild_id: "112760669178241024", + id: "1141501302736695317", + member: { + avatar: null, + communication_disabled_until: null, + deaf: false, + flags: 0, + joined_at: "2015-11-08T12:25:38.461000+00:00", + mute: false, + nick: "windfucker", + pending: false, + premium_since: null, + roles: [ + "204427286542417920", + "118924814567211009", + "222168467627835392", + "265239342648131584", + "303273332248412160", + "303319030163439616", + "305775031223320577", + "318243902521868288", + "349185088157777920", + "378402925128712193", + "391076926573510656", + "230462991751970827", + "392141548932038658", + "397533096012152832", + "454567553738473472", + "482658335536185357", + "482860581670486028", + "495384759074160642", + "638988388740890635", + "764071315388629012", + "373336013109461013", + "872274377150980116", + "1034022405275910164", + "790724320824655873", + "1040735082610167858", + "1123730787653660742", + "1070177137367208036" + ] + }, + mention_everyone: false, + mention_roles: [], + mentions: [], + pinned: false, + timestamp: "2023-08-16T22:38:38.641000+00:00", + tts: false, + type: 0 + }, edited_content_with_sticker_and_attachments: { id: "1106366167788044450", type: 0, From 9e5a3f5f3203fe295dc856be261eb81b3e547ffb Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Sat, 7 Oct 2023 22:53:02 +1300 Subject: [PATCH 011/501] Ignore messages from Deleted User --- d2m/event-dispatcher.js | 1 + 1 file changed, 1 insertion(+) diff --git a/d2m/event-dispatcher.js b/d2m/event-dispatcher.js index 525b735..82e3b64 100644 --- a/d2m/event-dispatcher.js +++ b/d2m/event-dispatcher.js @@ -161,6 +161,7 @@ module.exports = { * @param {import("discord-api-types/v10").GatewayMessageCreateDispatchData} message */ async onMessageCreate(client, message) { + if (message.author.username === "Deleted User") return // Nothing we can do for deleted users. if (message.webhook_id) { const row = select("webhook", "webhook_id", {webhook_id: message.webhook_id}).pluck().get() if (row) { From 3ef569d855ce96236e4df6e155bbcf79427d5b1f Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Sat, 7 Oct 2023 23:39:49 +1300 Subject: [PATCH 012/501] seed.js should now upload the L1 & L2 emojis --- db/migrations/0004-auto-emoji-guild.sql | 10 ++++ db/orm-defs.d.ts | 6 +++ docs/img/L1.png | Bin 0 -> 1610 bytes docs/img/L2.png | Bin 0 -> 514 bytes package-lock.json | 3 +- package.json | 1 + readme.md | 2 +- scripts/seed.js | 59 ++++++++++++++++++++++++ 8 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 db/migrations/0004-auto-emoji-guild.sql create mode 100644 docs/img/L1.png create mode 100644 docs/img/L2.png diff --git a/db/migrations/0004-auto-emoji-guild.sql b/db/migrations/0004-auto-emoji-guild.sql new file mode 100644 index 0000000..6d92f2b --- /dev/null +++ b/db/migrations/0004-auto-emoji-guild.sql @@ -0,0 +1,10 @@ +BEGIN TRANSACTION; + +CREATE TABLE auto_emoji ( + name TEXT NOT NULL, + emoji_id TEXT NOT NULL, + guild_id TEXT NOT NULL, + PRIMARY KEY (name) +) WITHOUT ROWID; + +COMMIT; diff --git a/db/orm-defs.d.ts b/db/orm-defs.d.ts index 9524f20..ffb9728 100644 --- a/db/orm-defs.d.ts +++ b/db/orm-defs.d.ts @@ -75,6 +75,12 @@ export type Models = { message_id: string encoded_emoji: string } + + auto_emoji: { + name: string + emoji_id: string + guild_id: string + } } export type Prepared = { diff --git a/docs/img/L1.png b/docs/img/L1.png new file mode 100644 index 0000000000000000000000000000000000000000..4e66a092eff7812fc4cfdb06cd6b3be5749918dd GIT binary patch literal 1610 zcmd5-`#;lb9Dg>$*K*l%Sq(MIVU1j>qlh-PVX1Lkl9Z;xaY@TCNoxn?R=Fk7#U&0a zQPwL(m(fkRb)tx)b~Nh5C?%$u^Id<%dA**`^Lag==l#4t@6YG?;gjXV^3Xx!(EtD) zrYGGO_5zhb8u0#bb7%+bv^btYTmYCGRfcF;B20#Z%i|e4;{6VW$MZtt!T^uQvx$t2 z=I#sSgxMU7i#R{&j0ZrypGkN1Pr4u*-o`Zu!-&63UK-Xm&nr)-lNn4qpLEVLMs1}} z#|Zn`0ZJB5FHSn9DVd1i9K4VsEGUHPeeH<`?l;biJVqyZCMMPl<&a1ldp7TH9O_-z z#7RCYyRtB~PE>fbb^BHIZX5h}5PRDhy#IeL{KFO0v~W>LXV)6pR=;!R_#s#IToEUm zG(;y=qx?v0V*t#l$bppjU@VJ?%5X^0(v#TB5{-K}+6(T1>{= z0j_|K0w_Ab$|G!x9xNgNK!Mi$qY4*+b%#YxLh00!Zd*Pl#&*jwZS%t;5>l>9dBVQ6 zg2D{eM{oe=^fqsEdOs69u4+-!f96GcQTf!LA!NL~EUyQKvs zp*?G(qD-l0!`{oC?ysh1w3f-d1BSrq6;8JXc4stU*)ap6lZ}JBp{ORxlgDWd7x$*~ z6s@)y3G*|bkN)^xUHHCt3jIP!p7H<=R8AV?aIQM1eK)54msXQ`F#vRPLSCTb)9~6Z zGj{mcR&Lx#tQS3G@Z_Q%15IeQI>}pV%`Zl-H0qN6qg-fN8FHIb(X@Ql9vy{+CH2YP zINpvSdPNi{-Q)1;WBX!rGMn;8hcw6i zHXIzDzuEFebjoQ4Vd5C4AmQ$=pIh^Mhepqc=Q|*Y%GZ26R_v4FcVj-9~gNwSA|70Z}>f zX*TeFeX`Agz7U95pg!StAF~R7$qE4Xs<7Xh%Y;E9${T-=06-nJJZ9}% z6?wl|y|*v56b#B7km8s(&F-mJFR~(}?=tPleJIZ40=I=$|AU*$f17>yliM~ht}|%d z$SR!+hErvgf~CwqJ6;pE*ly!eeykLfg1jFs&tKcUzsRcjTGn*vPK2MnU_IV1EE>~Z zwxH&#`Ycr2CNG?Wq}Ax8pA{LoBRGu-ohwS7Kxlh1fWH2zth@vr8)pGR2$hoxWM<=& zA8eJs%~&T~CIaHy?YA@-QiXh0ftCpTQQ}?c6TtY|_6~~LW`ZGt;P$UB0WuD@_Zt2P zm3z8v9+M&HK3Kq(f52gc4rK$wTgXVvSXGS9<+<~eRke@+@={Cs_EjR zS29uy5m1F?YVa9o+(lCj^awCIm4#d|A!KI*w?u&RU;s0P6V=2JF_$3t^br!c)vL|v zVrUG|&NnS5!}3D~Mp4D|ime7ApFi9KX=0+J=bq z&omVql%crEeK7AD1@~|n2O`1nN+QUgHYG5f1+s>wj#G&$jjNpOAC?tLff{>;2H3RU7-d yxT+;(?fd$#>^Jhif1V>Z(Q+=`9Zg&?{buAmD)|3Payu|Gfl=w|=d#Wzp$PyozoUl$ literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 15b4b76..2cf30c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "out-of-your-element", "version": "1.0.0", - "license": "MIT", + "license": "AGPL-3.0-or-later", "dependencies": { "@chriscdn/promise-semaphore": "^2.0.1", "better-sqlite3": "^8.3.0", @@ -18,6 +18,7 @@ "heatsync": "^2.4.1", "js-yaml": "^4.1.0", "matrix-appservice": "^2.0.0", + "minimist": "^1.2.8", "mixin-deep": "github:cloudrac3r/mixin-deep#v3.0.0", "node-fetch": "^2.6.7", "pngjs": "^7.0.0", diff --git a/package.json b/package.json index e40e82c..333aae9 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "heatsync": "^2.4.1", "js-yaml": "^4.1.0", "matrix-appservice": "^2.0.0", + "minimist": "^1.2.8", "mixin-deep": "github:cloudrac3r/mixin-deep#v3.0.0", "node-fetch": "^2.6.7", "pngjs": "^7.0.0", diff --git a/readme.md b/readme.md index f1a35c7..2a217e5 100644 --- a/readme.md +++ b/readme.md @@ -59,7 +59,6 @@ You'll need: * Administrative access to a homeserver * Discord bot -* Custom emojis named `L1` and `L2` for replies sent to Discord (TODO: provide) Follow these steps: @@ -148,6 +147,7 @@ Follow these steps: * (1) heatsync: Module hot-reloader that I trust. * (1) js-yaml: It seems to do what I want, and it's already pulled in by matrix-appservice. * (70) matrix-appservice: I wish it didn't pull in express :( +* (0) minimist: It's already pulled in by better-sqlite3->prebuild-install * (0) mixin-deep: This is my fork! It fixes a bug in regular mixin-deep. * (3) node-fetch@2: I like it and it does what I want. * (0) pngjs: Lottie stickers are converted to bitmaps with the vendored Rlottie WASM build, then the bitmaps are converted to PNG with pngjs. diff --git a/scripts/seed.js b/scripts/seed.js index 2a0c279..0f2f23d 100644 --- a/scripts/seed.js +++ b/scripts/seed.js @@ -1,10 +1,14 @@ // @ts-check +console.log("This could take up to 30 seconds. Please be patient.") + const assert = require("assert").strict const fs = require("fs") const sqlite = require("better-sqlite3") const HeatSync = require("heatsync") +const args = require("minimist")(process.argv.slice(2), {string: ["emoji-guild"]}) + const config = require("../config") const passthrough = require("../passthrough") const db = new sqlite("db/ooye.db") @@ -27,6 +31,24 @@ const file = require("../matrix/file") const reg = require("../matrix/read-registration") const utils = require("../m2d/converters/utils") +function die(message) { + console.error(message) + process.exit(1) +} + +async function uploadAutoEmoji(guild, name, filename) { + let emoji = guild.emojis.find(e => e.name === name) + if (!emoji) { + console.log(` Uploading ${name}...`) + const data = fs.readFileSync(filename, null) + emoji = await discord.snow.guildAssets.createEmoji(guild.id, {name, image: "data:image/png;base64," + data.toString("base64")}) + } else { + console.log(` Reusing ${name}...`) + } + db.prepare("REPLACE INTO auto_emoji (name, emoji_id, guild_id) VALUES (?, ?, ?)").run(emoji.name, emoji.id, guild.id) + return emoji +} + ;(async () => { const mxid = `@${reg.sender_localpart}:${reg.ooye.server_name}` @@ -45,6 +67,43 @@ const utils = require("../m2d/converters/utils") console.log("✅ Database is ready...") + // upload the L1 L2 emojis to some guild + const emojis = db.prepare("SELECT name FROM auto_emoji WHERE name = 'L1' OR name = 'L2'").pluck().all() + if (emojis.length !== 2) { + // If an argument was supplied, always use that one + let guild = null + if (args["emoji-guild"]) { + if (typeof args["emoji-guild"] === "string") { + guild = await discord.snow.guild.getGuild(args["emoji-guild"]) + } + if (!guild) return die(`Error: You asked emojis to be uploaded to guild ID ${args["emoji-guild"]}, but the bot isn't in that guild.`) + } + // Otherwise, check if we have already registered an auto emoji guild + if (!guild) { + const guildID = passthrough.select("auto_emoji", "guild_id", {name: "_"}).pluck().get() + if (guildID) { + guild = await discord.snow.guild.getGuild(guildID, false) + } + } + // Otherwise, check if we should create a new guild + if (!guild) { + const guilds = await discord.snow.user.getGuilds({limit: 11, with_counts: false}) + if (guilds.length < 10) { + console.log(" Creating a guild for emojis...") + guild = await discord.snow.guild.createGuild({name: "OOYE Emojis"}) + } + } + // Otherwise, it's the user's problem + if (!guild) { + return die(`Error: The bot needs to upload some emojis. Please say where to upload them to. Run seed.js again with --emoji-guild=GUILD_ID`) + } + // Upload those emojis to the chosen location + db.prepare("REPLACE INTO auto_emoji (name, emoji_id, guild_id) VALUES ('_', '_', ?)").run(guild.id) + await uploadAutoEmoji(guild, "L1", "docs/img/L1.png") + await uploadAutoEmoji(guild, "L2", "docs/img/L2.png") + } + console.log("✅ Emojis are ready...") + // ensure homeserver well-known is valid and returns reg.ooye.server_name... // upload initial images... From af274ede53a7a3b401138ddfb27e1b67e47e3e6f Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Sun, 8 Oct 2023 00:00:34 +1300 Subject: [PATCH 013/501] Use the proper L1 and L2 emojis --- db/orm-defs.d.ts | 1 + m2d/converters/event-to-message.js | 7 ++++--- test/ooye-test-data.sql | 5 +++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/db/orm-defs.d.ts b/db/orm-defs.d.ts index ffb9728..292a445 100644 --- a/db/orm-defs.d.ts +++ b/db/orm-defs.d.ts @@ -86,6 +86,7 @@ export type Models = { export type Prepared = { pluck: () => Prepared safeIntegers: () => Prepared<{[K in keyof Row]: Row[K] extends number ? BigInt : Row[K]}> + raw: () => Prepared all: (..._: any[]) => Row[] get: (..._: any[]) => Row | null } diff --git a/m2d/converters/event-to-message.js b/m2d/converters/event-to-message.js index 8a68656..fcf0bf8 100644 --- a/m2d/converters/event-to-message.js +++ b/m2d/converters/event-to-message.js @@ -316,11 +316,12 @@ async function eventToMessage(event, guild, di) { if (!repliedToEventId) return let repliedToEvent = await di.api.getEvent(event.room_id, repliedToEventId) if (!repliedToEvent) return + // @ts-ignore + const autoEmoji = new Map(select("auto_emoji", ["name", "emoji_id"], {}, "WHERE name = 'L1' OR name = 'L2'").raw().all()) + replyLine = `<:L1:${autoEmoji.get("L1")}><:L2:${autoEmoji.get("L2")}>` const row = from("event_message").join("message_channel", "message_id").select("channel_id", "message_id").where({event_id: repliedToEventId}).and("ORDER BY part").get() if (row) { - replyLine = `<:L1:1144820033948762203><:L2:1144820084079087647>https://discord.com/channels/${guild.id}/${row.channel_id}/${row.message_id} ` - } else { - replyLine = `<:L1:1144820033948762203><:L2:1144820084079087647>` + replyLine += `https://discord.com/channels/${guild.id}/${row.channel_id}/${row.message_id} ` } const sender = repliedToEvent.sender const senderName = sender.match(/@([^:]*)/)?.[1] || sender diff --git a/test/ooye-test-data.sql b/test/ooye-test-data.sql index 4ad318c..68932dd 100644 --- a/test/ooye-test-data.sql +++ b/test/ooye-test-data.sql @@ -89,4 +89,9 @@ INSERT INTO member_cache (room_id, mxid, displayname, avatar_url) VALUES ('!BnKuBPCvyfOkhcUjEu:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', 'mxc://cadence.moe/azCAhThKTojXSZJRoWwZmhvU'), ('!maggESguZBqGBZtSnr:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', 'mxc://cadence.moe/azCAhThKTojXSZJRoWwZmhvU'); +INSERT INTO "auto_emoji" ("name","emoji_id","guild_id") VALUES +('L1','1144820033948762203','529176156398682115'), +('L2','1144820084079087647','529176156398682115'), +('_','_','529176156398682115'); + COMMIT; From 26abd560b03a77583e3c7cc09366837e74a212e9 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Mon, 9 Oct 2023 13:50:03 +1300 Subject: [PATCH 014/501] Offer a script to switch to WAL mode --- .gitignore | 2 +- readme.md | 2 ++ scripts/wal.js | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 scripts/wal.js diff --git a/.gitignore b/.gitignore index bbe392a..9a310ad 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ node_modules config.js registration.yaml coverage -db/ooye.db +db/ooye.db* diff --git a/readme.md b/readme.md index 2a217e5..7ad21d3 100644 --- a/readme.md +++ b/readme.md @@ -51,6 +51,8 @@ Only necessary data and columns are queried from the database. We only contact t File uploads (like avatars from bridged members) are checked locally and deduplicated. Only brand new files are uploaded to the homeserver. This saves loads of space in the homeserver's media repo, especially for Synapse. +Switching to [WAL mode](https://www.sqlite.org/wal.html) could improve your database access speed even more. Run `node scripts/wal.js` if you want to switch to WAL mode. + # Setup If you get stuck, you're welcome to message @cadence:cadence.moe to ask for help setting up OOYE! diff --git a/scripts/wal.js b/scripts/wal.js new file mode 100644 index 0000000..1ad15d0 --- /dev/null +++ b/scripts/wal.js @@ -0,0 +1,6 @@ +// @ts-check + +const sqlite = require("better-sqlite3") +const db = new sqlite("db/ooye.db", {fileMustExist: true}) +db.pragma("journal_mode = wal") +db.close() From 2211f89a61702d125c311c59ab1bbe1063df448d Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Mon, 9 Oct 2023 23:46:30 +1300 Subject: [PATCH 015/501] v1.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2cf30c6..16ed46c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "out-of-your-element", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "out-of-your-element", - "version": "1.0.0", + "version": "1.1.0", "license": "AGPL-3.0-or-later", "dependencies": { "@chriscdn/promise-semaphore": "^2.0.1", diff --git a/package.json b/package.json index 333aae9..7c84ebc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "out-of-your-element", - "version": "1.0.0", + "version": "1.1.0", "description": "A bridge between Matrix and Discord", "main": "index.js", "repository": { From 8bc696b6f8e08401c48c17507635b17e051b6504 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Tue, 10 Oct 2023 00:58:19 +1300 Subject: [PATCH 016/501] Making it easier to find the documentation --- d2m/discord-packets.js | 1 + docs/{notes.md => algorithms-notetaking.md} | 0 docs/{ => img}/reply-line.svg | 0 readme.md | 27 ++++++++++++++++----- 4 files changed, 22 insertions(+), 6 deletions(-) rename docs/{notes.md => algorithms-notetaking.md} (100%) rename docs/{ => img}/reply-line.svg (100%) diff --git a/d2m/discord-packets.js b/d2m/discord-packets.js index dfba8b0..0782702 100644 --- a/d2m/discord-packets.js +++ b/d2m/discord-packets.js @@ -141,6 +141,7 @@ const utils = { await eventDispatcher.onChannelOrThreadUpdate(client, message.d, true) } else if (message.t === "MESSAGE_CREATE") { + console.log(message.d) await eventDispatcher.onMessageCreate(client, message.d) } else if (message.t === "MESSAGE_UPDATE") { diff --git a/docs/notes.md b/docs/algorithms-notetaking.md similarity index 100% rename from docs/notes.md rename to docs/algorithms-notetaking.md diff --git a/docs/reply-line.svg b/docs/img/reply-line.svg similarity index 100% rename from docs/reply-line.svg rename to docs/img/reply-line.svg diff --git a/readme.md b/readme.md index 7ad21d3..447e6f1 100644 --- a/readme.md +++ b/readme.md @@ -2,6 +2,8 @@ Modern Matrix-to-Discord appservice bridge. +Created by [@cadence:cadence.moe](https://matrix.to/#/@cadence:cadence.moe) // Discuss in [#out-of-your-element:cadence.moe](https://matrix.to/#/#out-of-your-element:cadence.moe) + ## Why a new bridge? * Modern: Supports new Discord features like replies, threads and stickers, and new Matrix features like edits, spaces and space membership. @@ -40,12 +42,17 @@ For more information about features, [see the user guide.](https://gitdab.com/ca ## Caveats * This bridge is not designed for puppetting. +* Direct Messaging is not supported yet. + +## Documentation + +The most important information is here in the readme. The rest is [in the docs folder.](https://gitdab.com/cadence/out-of-your-element/src/branch/main/docs) ## Efficiency details Using WeatherStack as a thin layer between the bridge application and the Discord API lets us control exactly what data is cached. Only necessary information is cached. For example, member data, user data, message content, and past edits are never stored in memory. This keeps the memory usage low and also prevents it ballooning in size over the bridge's runtime. -The bridge uses a small SQLite database to store relationships like which Discord messages correspond to which Matrix messages. This is so the bridge knows what to edit when some message is edited on Discord. Using `without rowid` on the database tables stores the index and the data in the same B-tree. Since Matrix and Discord's internal IDs are quite long, this vastly reduces storage space because those IDs do not have to be stored twice separately. Some event IDs are actually stored as xxhash integers to reduce storage requirements even more. On my personal instance of OOYE, every 100,000 messages sent require only 17.7 MB of storage space in the SQLite database. +The bridge uses a small SQLite database to store relationships like which Discord messages correspond to which Matrix messages. This is so the bridge knows what to edit when some message is edited on Discord. Using `without rowid` on the database tables stores the index and the data in the same B-tree. Since Matrix and Discord's internal IDs are quite long, this vastly reduces storage space because those IDs do not have to be stored twice separately. Some event IDs are actually stored as xxhash integers to reduce storage requirements even more. On my personal instance of OOYE, every 100,000 messages require 16.1 MB of storage space in the SQLite database. Only necessary data and columns are queried from the database. We only contact the homeserver API if the database doesn't contain what we need. @@ -103,7 +110,10 @@ Follow these steps: ├── registration.yaml * The bridge's SQLite database is stored here: ├── db - │   └── *.sql, *.db + │   ├── *.sql, *.db + │   * Migrations change the database schema when you update to a newer version of OOYE: + │   └── migrations + │       └── *.sql, *.js * Discord-to-Matrix bridging: ├── d2m │   * Execute actions through the whole flow, like sending a Discord message to Matrix: @@ -116,22 +126,27 @@ Follow these steps: │   ├── discord-*.js │   * Listening to events from Discord and dispatching them to the correct `action`: │   └── event-dispatcher.js + ├── discord + │   └── discord-command-handler.js * Matrix-to-Discord bridging: ├── m2d │   * Execute actions through the whole flow, like sending a Matrix message to Discord: │   ├── actions │   │   └── *.js + │   * Convert data from one form to another without depending on bridge state. Called by actions: │   ├── converters │   │   └── *.js + │   * Listening to events from Matrix and dispatching them to the correct `action`: │   └── event-dispatcher.js - * We aren't using the matrix-js-sdk, so here's all the stuff we need to call the Matrix C-S API: + * We aren't using the matrix-js-sdk, so here are all the functions for the Matrix C-S and Appservice APIs: ├── matrix │   └── *.js - * Various files you can run once if you need them. Hopefully you won't need them. + * Various files you can run once if you need them. ├── scripts - │   ├── *.js │   * First time running a new bridge? Run this file to plant a seed, which will flourish into state for the bridge: - │   └── seed.js + │   ├── seed.js + │   * Hopefully you won't need the rest of these. Code quality varies wildly. + │   └── *.js * You are here! :) └── readme.md From e2dffe457ea97811ac9bd1cd4a3939d76f79c883 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Tue, 10 Oct 2023 01:17:17 +1300 Subject: [PATCH 017/501] Adding icon to readme --- docs/img/icon.png | Bin 0 -> 392529 bytes readme.md | 12 +++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 docs/img/icon.png diff --git a/docs/img/icon.png b/docs/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0de58b6083c175aed1e30314ccd85b219e9f07bb GIT binary patch literal 392529 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 z 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

Yh`-FNdZk58XQ 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 z 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μj#CyF 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