From 92a60955bca0a1e24c42179b3bc051695be60298 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Sun, 18 Jan 2026 02:39:17 +1300 Subject: [PATCH] Improve Matrix info and add alternative access React with red question mark to get a DM of the author info, like PK. --- src/d2m/event-dispatcher.js | 13 +++++- src/discord/interactions/matrix-info.js | 43 ++++++++++++++++++-- src/discord/interactions/matrix-info.test.js | 20 +++++++-- 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/d2m/event-dispatcher.js b/src/d2m/event-dispatcher.js index 834cf9d..0a619ef 100644 --- a/src/d2m/event-dispatcher.js +++ b/src/d2m/event-dispatcher.js @@ -34,6 +34,8 @@ const retrigger = sync.require("./actions/retrigger") const setPresence = sync.require("./actions/set-presence") /** @type {import("../m2d/event-dispatcher")} */ const matrixEventDispatcher = sync.require("../m2d/event-dispatcher") +/** @type {import("../discord/interactions/matrix-info")} */ +const matrixInfoInteraction = sync.require("../discord/interactions/matrix-info") const {Semaphore} = require("@chriscdn/promise-semaphore") const checkMissedPinsSema = new Semaphore() @@ -299,7 +301,16 @@ module.exports = { */ async MESSAGE_REACTION_ADD(client, data) { if (data.user_id === client.user.id) return // m2d reactions are added by the discord bot user - do not reflect them back to matrix. - await addReaction.addReaction(data) + if (data.emoji.name === "❓" && select("event_message", "message_id", {message_id: data.message_id, source: 0})) { + const guild_id = data.guild_id ?? client.channels.get(data.channel_id)["guild_id"] + await Promise.all([ + client.snow.channel.deleteReaction(data.channel_id, data.message_id, data.emoji.name).catch(() => {}), + // @ts-ignore - this is all you need for it to do a matrix-side lookup + matrixInfoInteraction.dm({guild_id, data: {target_id: data.message_id}, member: {user: {id: data.user_id}}}) + ]) + } else { + await addReaction.addReaction(data) + } }, /** diff --git a/src/discord/interactions/matrix-info.js b/src/discord/interactions/matrix-info.js index e35cde1..ca7da5b 100644 --- a/src/discord/interactions/matrix-info.js +++ b/src/discord/interactions/matrix-info.js @@ -7,12 +7,18 @@ const assert = require("assert").strict /** @type {import("../../matrix/api")} */ const api = sync.require("../../matrix/api") +/** @type {import("../../matrix/utils")} */ +const utils = sync.require("../../matrix/utils") + +/** @type {import("../../web/routes/guild")} */ +const webGuild = sync.require("../../web/routes/guild") + /** * @param {DiscordTypes.APIMessageApplicationCommandGuildInteraction} interaction * @param {{api: typeof api}} di * @returns {Promise} */ -async function _interact({guild_id, channel, data}, {api}) { +async function _interact({guild_id, data}, {api}) { const message = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") .select("source", "reference_channel_id", "room_id", "event_id").where({message_id: data.target_id, part: 0}).get() @@ -47,11 +53,32 @@ async function _interact({guild_id, channel, data}, {api}) { // from Matrix const event = await api.getEvent(message.room_id, message.event_id) + const via = await utils.getViaServersQuery(message.room_id, api) + const inChannels = discord.guildChannelMap.get(guild_id) + .map(cid => discord.channels.get(cid)) + .sort((a, b) => webGuild._getPosition(a, discord.channels) - webGuild._getPosition(b, discord.channels)) + .filter(channel => from("channel_room").join("member_cache", "room_id").select("mxid").where({channel_id: channel.id, mxid: event.sender}).get()) + const matrixMember = select("member_cache", ["displayname", "avatar_url"], {room_id: message.room_id, mxid: event.sender}).get() + const name = matrixMember?.displayname || event.sender return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { - content: `Bridged [${event.sender}]()'s message in [${roomName}]() on Matrix to https://discord.com/channels/${guild_id}/${channel_id}/${data.target_id} on Discord.` - + idInfo, + embeds: [{ + author: { + name, + url: `https://matrix.to/#/${event.sender}`, + icon_url: utils.getPublicUrlForMxc(matrixMember.avatar_url) + }, + description: `This Matrix message was delivered to Discord by **Out Of Your Element**.\n[View on Matrix →]()\n\n**User ID**: [${event.sender}]()`, + color: 0x0dbd8b, + fields: [{ + name: "In Channels", + value: inChannels.map(c => `<#${c.id}>`).join(" • ") + }, { + name: "\u200b", + value: idInfo + }] + }], flags: DiscordTypes.MessageFlags.Ephemeral } } @@ -64,5 +91,15 @@ async function interact(interaction) { await discord.snow.interaction.createInteractionResponse(interaction.id, interaction.token, await _interact(interaction, {api})) } +/** @param {DiscordTypes.APIMessageApplicationCommandGuildInteraction} interaction */ +async function dm(interaction) { + const channel = await discord.snow.user.createDirectMessageChannel(interaction.member.user.id) + const response = await _interact(interaction, {api}) + assert(response.type === DiscordTypes.InteractionResponseType.ChannelMessageWithSource) + response.data.flags &= 0 // not ephemeral + await discord.snow.channel.createMessage(channel.id, response.data) +} + module.exports.interact = interact module.exports._interact = _interact +module.exports.dm = dm diff --git a/src/discord/interactions/matrix-info.test.js b/src/discord/interactions/matrix-info.test.js index 5d0206e..f455700 100644 --- a/src/discord/interactions/matrix-info.test.js +++ b/src/discord/interactions/matrix-info.test.js @@ -60,13 +60,27 @@ test("matrix info: shows info for matrix source message", async t => { }, sender: "@cadence:cadence.moe" } + }, + async getJoinedMembers(roomID) { + return { + joined: {} + } + }, + async getStateEventOuter(roomID, type, key) { + return { + content: { + room_version: "11" + } + } + }, + async getStateEvent(roomID, type, key) { + return {} } } }) t.equal( - msg.data.content, - "Bridged [@cadence:cadence.moe]()'s message in [main]() on Matrix to https://discord.com/channels/112760669178241024/112760669178241024/1128118177155526666 on Discord." - + "\n-# Room ID: `!kLRqKKUQXcibIMtOpl:cadence.moe`" + msg.data.embeds[0].fields[1].value, + "\n-# Room ID: `!kLRqKKUQXcibIMtOpl:cadence.moe`" + "\n-# Event ID: `$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe4`" ) t.equal(called, 1)