forked from cadence/out-of-your-element
Why did I make it this way??? #13
1 changed files with 14 additions and 5 deletions
|
|
@ -213,11 +213,18 @@ async event => {
|
|||
|
||||
let processCommands = true
|
||||
if (event.content["m.relates_to"]?.rel_type === "m.thread") {
|
||||
processCommands = false
|
||||
/**@type {string|null} */
|
||||
let toRedact = event.room_id
|
||||
const bridgedTo = utils.getThreadRoomFromThreadEvent(event.content["m.relates_to"].event_id)
|
||||
processCommands = false
|
||||
|
||||
if (bridgedTo) event.room_id = bridgedTo;
|
||||
else await bridgeThread(event);
|
||||
else if (!await bridgeThread(event)) toRedact = null;
|
||||
|
||||
if (toRedact){
|
||||
api.redactEvent(toRedact, event.event_id)
|
||||
api.sendEvent(event.room_id, event.type, event.content)
|
||||
}
|
||||
}
|
||||
|
||||
const messageResponses = await sendEvent.sendEvent(event)
|
||||
|
|
@ -237,19 +244,20 @@ async event => {
|
|||
}))
|
||||
|
||||
/**
|
||||
* @param {Ty.Event.Outer_M_Room_Message | Ty.Event.Outer_M_Room_Message_File} event Its room_id will mutate to the target thread, if such thread gets created.
|
||||
* @param {Ty.Event.Outer_M_Room_Message | Ty.Event.Outer_M_Room_Message_File} event Used for determining the branching-point and the title; its room_id will mutate to the target thread-room, if one gets created.
|
||||
* @returns {Promise<boolean>} whether a thread-room was created
|
||||
*/
|
||||
async function bridgeThread(event) {
|
||||
/** @type {string} */ // @ts-ignore
|
||||
const channelID = select("channel_room", "channel_id", {room_id: event.room_id}).pluck().get()
|
||||
const channel = discord.channels.get(channelID)
|
||||
const guildID = channel?.["guild_id"]
|
||||
if (!guildID) return; //Room not bridged? We don't care. It's a Matrix-native room, let Matrix users have standard Matrix-native threads there.
|
||||
if (!guildID) return false; //Room not bridged? We don't care. It's a Matrix-native room, let Matrix users have standard Matrix-native threads there.
|
||||
|
||||
const eventID = event.content["m.relates_to"]?.event_id
|
||||
if (!eventID) throw new Error("There was an event sent inside SOME Matrix thread, but it lacked any information as to what thread it actually was!"); //An „ugly error” is justified because if something like this DOES happen, then that means that it should be reported to us, as there is some broken client out there that we should account for.
|
||||
const messageID = select("event_message", "message_id", {event_id: eventID}).pluck().get()
|
||||
if (!messageID) return; //Message not bridged? Too bad! Discord users will just see normal replies, and Matrix uses won't get a thread-room. We COULD technically create a "headless" thread on Discord side and bridge it to a new thread-room, but that comes with a whole host of complications on its own (notably: what do we do if the message gets bridged later (by reaction emoji), and maybe gets its own thread; and: getThreadRoomFromThreadEvent will have to be much more complex than a simple DB call (probably a whole new DB table would have to be created, just to hold these Matrix-branched-but-headless-on-Discord threads) because the simple „MX event --(db)--> Discord Message --(Discord spec)--> Discord thread” relation would no longer hold true), which may not be worth it, as an unbridged message in a bridged channel is already an edge-case and it seems somewhat pointless to introduce and account for a whole bunch of edgier-cases that handling this edge-case "properly" would bring.
|
||||
if (!messageID) return false; //Message not bridged? Too bad! Discord users will just see normal replies, and Matrix uses won't get a thread-room. We COULD technically create a "headless" thread on Discord side and bridge it to a new thread-room, but that comes with a whole host of complications on its own (notably: what do we do if the message gets bridged later (by reaction emoji), and then hypothetically gets its own thread; and: getThreadRoomFromThreadEvent will have to be much more complex than a simple DB call (probably a whole new DB table would have to be created, just to hold these Matrix-branched-but-headless-on-Discord threads) because the simple „MX event --(db)--> Discord Message --(Discord spec)--> Discord thread” relation would no longer hold true), which may not be worth it, as an unbridged message in a bridged channel is already an edge-case (so it seems pointless to introduce a whole bunch of edgier-cases that handling this edge-case "properly" would bring).
|
||||
|
||||
let name = event.content.body
|
||||
if (name.startsWith("/thread ")) name = name.substring(8);
|
||||
|
|
@ -257,6 +265,7 @@ async function bridgeThread(event) {
|
|||
name = name.length < 100 ? name.replaceAll("\n", " ") : name.slice(0, 96).replaceAll("\n", " ") + "..."
|
||||
|
||||
event.room_id = await createRoom.ensureRoom((await discord.snow.channel.createThreadWithMessage(channelID, messageID, {name})).id)
|
||||
return true;
|
||||
}
|
||||
|
||||
sync.addTemporaryListener(as, "type:m.sticker", guard("m.sticker",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue