Improve Matrix info and add alternative access
React with red question mark to get a DM of the author info, like PK.
This commit is contained in:
@@ -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)
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -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<DiscordTypes.APIInteractionResponse>}
|
||||
*/
|
||||
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}](<https://matrix.to/#/${event.sender}>)'s message in [${roomName}](<https://matrix.to/#/${message.room_id}/${message.event_id}>) 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 →](<https://matrix.to/#/${message.room_id}/${message.event_id}?${via}>)\n\n**User ID**: [${event.sender}](<https://matrix.to/#/${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
|
||||
|
||||
@@ -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](<https://matrix.to/#/@cadence:cadence.moe>)'s message in [main](<https://matrix.to/#/!kLRqKKUQXcibIMtOpl:cadence.moe/$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe4>) 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)
|
||||
|
||||
Reference in New Issue
Block a user