From 8144e6abb80cf73841f8679a3e1163c0977be70e Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Tue, 4 Jul 2023 00:39:42 +1200 Subject: [PATCH] bridge both ways and prevent reflections --- d2m/actions/add-reaction.js | 1 - d2m/actions/send-message.js | 2 +- d2m/converters/message-to-event.test.js | 1 - d2m/event-dispatcher.js | 9 ++++++- db/ooye.db | Bin 184320 -> 258048 bytes m2d/actions/channel-webhook.js | 2 +- m2d/actions/send-event.js | 20 +++++--------- m2d/converters/event-to-message.js | 1 - m2d/converters/event-to-message.test.js | 5 +--- m2d/converters/utils.js | 21 +++++++++++++++ m2d/converters/utils.test.js | 16 ++++++++++++ m2d/event-dispatcher.js | 33 +++++++----------------- matrix/api.test.js | 1 - matrix/read-registration.test.js | 3 +-- stdin.js | 2 +- test/test.js | 1 + 16 files changed, 67 insertions(+), 51 deletions(-) create mode 100644 m2d/converters/utils.js create mode 100644 m2d/converters/utils.test.js diff --git a/d2m/actions/add-reaction.js b/d2m/actions/add-reaction.js index 82449cd..cd3d296 100644 --- a/d2m/actions/add-reaction.js +++ b/d2m/actions/add-reaction.js @@ -17,7 +17,6 @@ const createRoom = sync.require("../actions/create-room") async function addReaction(data) { const user = data.member?.user assert.ok(user && user.username) - // TODO: should add my own sent messages to event_message so they can be reacted to? const parentID = db.prepare("SELECT event_id FROM event_message WHERE message_id = ? AND part = 0").pluck().get(data.message_id) // 0 = primary if (!parentID) return // TODO: how to handle reactions for unbridged messages? is there anything I can do? assert.equal(typeof parentID, "string") diff --git a/d2m/actions/send-message.js b/d2m/actions/send-message.js index 24a825a..4f111b0 100644 --- a/d2m/actions/send-message.js +++ b/d2m/actions/send-message.js @@ -37,7 +37,7 @@ async function sendMessage(message, guild) { delete eventWithoutType.$type const eventID = await api.sendEvent(roomID, eventType, event, senderMxid) - db.prepare("INSERT INTO event_message (event_id, message_id, part) VALUES (?, ?, ?)").run(eventID, message.id, eventPart) + db.prepare("INSERT INTO event_message (event_id, message_id, part, source) VALUES (?, ?, ?, 1)").run(eventID, message.id, eventPart) // source 1 = discord eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting eventIDs.push(eventID) diff --git a/d2m/converters/message-to-event.test.js b/d2m/converters/message-to-event.test.js index c318389..26cf1f1 100644 --- a/d2m/converters/message-to-event.test.js +++ b/d2m/converters/message-to-event.test.js @@ -1,5 +1,4 @@ const {test} = require("supertape") -const assert = require("assert") const {messageToEvent} = require("./message-to-event") const data = require("../../test/data") diff --git a/d2m/event-dispatcher.js b/d2m/event-dispatcher.js index 1a1e30a..99c7792 100644 --- a/d2m/event-dispatcher.js +++ b/d2m/event-dispatcher.js @@ -1,5 +1,5 @@ const assert = require("assert").strict -const {sync} = require("../passthrough") +const {sync, db} = require("../passthrough") /** @type {import("./actions/send-message")}) */ const sendMessage = sync.require("./actions/send-message") @@ -18,6 +18,13 @@ module.exports = { const channel = client.channels.get(message.channel_id) const guild = client.guilds.get(channel.guild_id) if (message.guild_id !== "112760669178241024" && message.guild_id !== "497159726455455754") return // TODO: activate on other servers (requires the space creation flow to be done first) + if (message.webhook_id) { + const row = db.prepare("SELECT webhook_id FROM webhook WHERE webhook_id = ?").pluck().get(message.webhook_id) + 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 + } + } sendMessage.sendMessage(message, guild) }, diff --git a/db/ooye.db b/db/ooye.db index e0b3a33f48a915e3e722489bdb7f33be174e7023..df5e6d199d8c0d1918dcbb6d2f18f403e9c8b19d 100644 GIT binary patch delta 28964 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

6nlt!XcnroN4Jj%@W5t` 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 I=lr$*2kx_yGynhq delta 8769 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 q)jove*pSr=a(5Hv^MGt0Y$UBY{RTbwa)(u&R { diff --git a/m2d/actions/send-event.js b/m2d/actions/send-event.js index 5eb8c04..56a660f 100644 --- a/m2d/actions/send-event.js +++ b/m2d/actions/send-event.js @@ -12,28 +12,22 @@ const eventToMessage = sync.require("../converters/event-to-message") /** @param {import("../../types").Event.Outer} event */ async function sendEvent(event) { - // TODO: matrix equivalents... - const roomID = await createRoom.ensureRoom(message.channel_id) - // TODO: no need to sync the member to the other side... right? - let senderMxid = null - if (!message.webhook_id) { - assert(message.member) - senderMxid = await registerUser.ensureSimJoined(message.author, roomID) - await registerUser.syncUser(message.author, message.member, message.guild_id, roomID) - } + // TODO: we just assume the bridge has already been created + const channelID = db.prepare("SELECT channel_id FROM channel_room WHERE room_id = ?").pluck().get(event.room_id) + + // no need to sync the matrix member to the other side. but if I did need to, this is where I'd do it const messages = eventToMessage.eventToMessage(event) - assert(Array.isArray(messages)) + assert(Array.isArray(messages)) // sanity /** @type {DiscordTypes.APIMessage[]} */ const messageResponses = [] let eventPart = 0 // 0 is primary, 1 is supporting for (const message of messages) { const messageResponse = await channelWebhook.sendMessageWithWebhook(channelID, message) - // TODO: are you sure about that? many to many? and we don't need to store which side it originated from? - db.prepare("INSERT INTO event_message (event_id, message_id, part) VALUES (?, ?, ?)").run(event.event_id, messageResponse.id, eventPart) + db.prepare("INSERT INTO event_message (event_id, message_id, part, source) VALUES (?, ?, ?, 0)").run(event.event_id, messageResponse.id, eventPart) // source 0 = matrix - eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting + eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting? messageResponses.push(messageResponse) } diff --git a/m2d/converters/event-to-message.js b/m2d/converters/event-to-message.js index f48b5da..8b41903 100644 --- a/m2d/converters/event-to-message.js +++ b/m2d/converters/event-to-message.js @@ -1,6 +1,5 @@ // @ts-check -const assert = require("assert").strict const DiscordTypes = require("discord-api-types/v10") const markdown = require("discord-markdown") diff --git a/m2d/converters/event-to-message.test.js b/m2d/converters/event-to-message.test.js index a41beef..e687059 100644 --- a/m2d/converters/event-to-message.test.js +++ b/m2d/converters/event-to-message.test.js @@ -1,14 +1,12 @@ // @ts-check const {test} = require("supertape") -const assert = require("assert") const {eventToMessage} = require("./event-to-message") const data = require("../../test/data") test("event2message: janky test", t => { t.deepEqual( eventToMessage({ - age: 405299, content: { body: "test", msgtype: "m.text" @@ -20,8 +18,7 @@ test("event2message: janky test", t => { type: "m.room.message", unsigned: { age: 405299 - }, - user_id: "@cadence:cadence.moe" + } }), [{ username: "cadence:cadence.moe", diff --git a/m2d/converters/utils.js b/m2d/converters/utils.js new file mode 100644 index 0000000..108da1f --- /dev/null +++ b/m2d/converters/utils.js @@ -0,0 +1,21 @@ +// @ts-check + +const reg = require("../../matrix/read-registration") +const userRegex = reg.namespaces.users.map(u => new RegExp(u.regex)) +/** + * Determine whether an event is the bridged representation of a discord message. + * Such messages shouldn't be bridged again. + * @param {string} sender + */ +function eventSenderIsFromDiscord(sender) { + // If it's from a user in the bridge's namespace, then it originated from discord + // This includes messages sent by the appservice's bot user, because that is what's used for webhooks + // TODO: It would be nice if bridge system messages wouldn't trigger this check and could be bridged from matrix to discord, while webhook reflections would remain ignored... + if (userRegex.some(x => sender.match(x))) { + return true + } + + return false +} + +module.exports.eventSenderIsFromDiscord = eventSenderIsFromDiscord diff --git a/m2d/converters/utils.test.js b/m2d/converters/utils.test.js new file mode 100644 index 0000000..ae3159e --- /dev/null +++ b/m2d/converters/utils.test.js @@ -0,0 +1,16 @@ +// @ts-check + +const {test} = require("supertape") +const {eventSenderIsFromDiscord} = require("./utils") + +test("sender type: matrix user", t => { + t.notOk(eventSenderIsFromDiscord("@cadence:cadence.moe")) +}) + +test("sender type: ooye bot", t => { + t.ok(eventSenderIsFromDiscord("@_ooye_bot:cadence.moe")) +}) + +test("sender type: ooye puppet", t => { + t.ok(eventSenderIsFromDiscord("@_ooye_sheep:cadence.moe")) +}) diff --git a/m2d/event-dispatcher.js b/m2d/event-dispatcher.js index b8bfacf..01a3dcc 100644 --- a/m2d/event-dispatcher.js +++ b/m2d/event-dispatcher.js @@ -4,34 +4,19 @@ * Grab Matrix events we care about, check them, and bridge them. */ -const assert = require("assert").strict const {sync, as} = require("../passthrough") -const reg = require("../matrix/read-registration") + /** @type {import("./actions/send-event")} */ const sendEvent = sync.require("./actions/send-event") +/** @type {import("./converters/utils")} */ +const utils = sync.require("./converters/utils") -const userRegex = reg.namespaces.users.map(u => new RegExp(u.regex)) + +sync.addTemporaryListener(as, "type:m.room.message", /** - * Determine whether an event is the bridged representation of a discord message. - * Such messages shouldn't be bridged again. - * @param {import("../types").Event.Outer} event + * @param {import("../types").Event.Outer} event it is a m.room.message because that's what this listener is filtering for */ -function eventOriginatedFromDiscord(event) { - if ( - // If it's from a user in the bridge's namespace... - userRegex.some(x => event.sender.match(x)) - // ...not counting the appservice's own user... - && !event.sender.startsWith(`@${reg.sender_localpart}:`) - ) { - // ...then it originated from discord - return true - } - - return false -} - -sync.addTemporaryListener(as, "type:m.room.message", event => { - console.log(event) - if (eventOriginatedFromDiscord(event)) return - const messageResponses = sendEvent.sendEvent(event) +async event => { + if (utils.eventSenderIsFromDiscord(event.sender)) return + const messageResponses = await sendEvent.sendEvent(event) }) diff --git a/matrix/api.test.js b/matrix/api.test.js index f54c665..6c74e50 100644 --- a/matrix/api.test.js +++ b/matrix/api.test.js @@ -1,5 +1,4 @@ const {test} = require("supertape") -const assert = require("assert") const {path} = require("./api") test("api path: no change for plain path", t => { diff --git a/matrix/read-registration.test.js b/matrix/read-registration.test.js index 9c7f828..c5b3ac8 100644 --- a/matrix/read-registration.test.js +++ b/matrix/read-registration.test.js @@ -1,5 +1,4 @@ const {test} = require("supertape") -const assert = require("assert") const reg = require("./read-registration") test("reg: has necessary parameters", t => { @@ -8,4 +7,4 @@ test("reg: has necessary parameters", t => { propertiesToCheck.filter(p => p in reg), propertiesToCheck ) -}) \ No newline at end of file +}) diff --git a/stdin.js b/stdin.js index 1a5b8d1..cd504f2 100644 --- a/stdin.js +++ b/stdin.js @@ -11,7 +11,7 @@ const createRoom = sync.require("./d2m/actions/create-room") const registerUser = sync.require("./d2m/actions/register-user") const mreq = sync.require("./matrix/mreq") const api = sync.require("./matrix/api") -const sendMessage = sync.require("./m2d/actions/send-message") +const sendEvent = sync.require("./m2d/actions/send-event") const guildID = "112760669178241024" const extraContext = {} diff --git a/test/test.js b/test/test.js index f2f0912..5805d09 100644 --- a/test/test.js +++ b/test/test.js @@ -19,3 +19,4 @@ require("../d2m/actions/create-room.test") require("../d2m/converters/user-to-mxid.test") require("../d2m/actions/register-user.test") require("../m2d/converters/event-to-message.test") +require("../m2d/converters/utils.test")