From 15cba11ebdee9acf99c6d1d38eff09f0b62b5c6a Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Tue, 11 Jul 2023 10:10:47 +1200 Subject: [PATCH 1/2] get room mentions formatting working --- d2m/converters/message-to-event.js | 8 ++-- d2m/converters/message-to-event.test.js | 4 +- d2m/discord-client.js | 3 +- db/ooye.db | Bin 303104 -> 303104 bytes index.js | 2 +- scripts/save-channel-names-to-db.js | 58 ++++++++++++++++++++++++ test/data.js | 57 +++++++++++++++++++++++ 7 files changed, 124 insertions(+), 8 deletions(-) create mode 100644 scripts/save-channel-names-to-db.js diff --git a/d2m/converters/message-to-event.js b/d2m/converters/message-to-event.js index fc76bf2..9999df9 100644 --- a/d2m/converters/message-to-event.js +++ b/d2m/converters/message-to-event.js @@ -20,11 +20,11 @@ function getDiscordParseCallbacks(message, useHTML) { } }, channel: node => { - const roomID = db.prepare("SELECT room_id FROM channel_room WHERE channel_id = ?").pluck().get(node.id) - if (roomID && useHTML) { - return "https://matrix.to/#/" + roomID + const {room_id, name, nick} = db.prepare("SELECT room_id, name, nick FROM channel_room WHERE channel_id = ?").get(node.id) + if (room_id && useHTML) { + return `#${nick || name}` } else { - return "#" + node.id + return `#${nick || name}` } }, role: node => diff --git a/d2m/converters/message-to-event.test.js b/d2m/converters/message-to-event.test.js index a456a94..e3fcb06 100644 --- a/d2m/converters/message-to-event.test.js +++ b/d2m/converters/message-to-event.test.js @@ -27,9 +27,9 @@ test("message2event: simple room mention", async t => { t.deepEqual(events, [{ $type: "m.room.message", msgtype: "m.text", - body: "@crunch god: Tell me about Phil, renowned martial arts master and creator of the Chin Trick", + body: "#main", format: "org.matrix.custom.html", - formatted_body: '@crunch god Tell me about Phil, renowned martial arts master and creator of the Chin Trick' + formatted_body: '#main' }]) }) diff --git a/d2m/discord-client.js b/d2m/discord-client.js index 2092718..91682bd 100644 --- a/d2m/discord-client.js +++ b/d2m/discord-client.js @@ -12,8 +12,9 @@ const discordPackets = sync.require("./discord-packets") class DiscordClient { /** * @param {string} discordToken + * @param {boolean} listen whether to set up the event listeners for OOYE to operate */ - constructor(discordToken) { + constructor(discordToken, listen) { this.discordToken = discordToken this.snow = new SnowTransfer(discordToken) this.cloud = new CloudStorm(discordToken, { diff --git a/db/ooye.db b/db/ooye.db index b87572013e78f96e7b0fa036a7f964b33b2fad7c..560fa72042d091d7c598c89ce57ae3556dd5c227 100644 GIT binary patch delta 32601 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 ReFJ3aLFwWllu-1-{{wt_3a$VE delta 8340 zcmeI1dsJ1`zQ@;GkG=QW>jjbmihzpZ3wgPDh_XR9C<>za77b7_6;xC-%?B#CQRa)? zDrckPNwCu1K%^^6186K9rt#|xa0nD?)~F1##-Y$ zf1lrP&be4?{^nZ0y|%f-+U5?`ojVB09LJ4>qdy!S;YjiKPtd?RU|f+V@8dc;C;3ae z+@lXx8kFU(99`2scTRFIb@z4mZ48WSmfZ3_(iR*WOR9RBhoxvDm^Y=K=1%9+E(rd2 z1dWrNCA_ddFWS7JgqWw~fZ$~%3n~idmn>OQe1D1Vex6$t934&8$D75@h#+m)y;+&# zvm(c54$aNV^f-bi#6nzXz@oAlg%u_9%L^-tXOxu`#+w(UAj7HTa>HQGTq-#JHh}qz z`(@JK9HSKT$$iXpcT(e30%+oFxo1o5xr3}2!iR96s_j}Y_Kfyy`H6Uqx*3vmkXC^MC=?$hqa zgw-U^ohKx_UGm#>ay{QeBzau6N&Y;-dcU6cIYgLbwq;oSx2|vrv}}Bc^B!s3GX7@V zFj|dE#^=UqTg!4tFM4-2pN&K3&@Gcd>D8d}iiIq+Mbni< z0;8Ha{R9)dx#+!Y*_hAeWQiq-JY73R@Vdd3%e33;R*PN-c?S$xH1D__oI`cLkR^j{ znC%oeLG%WY7x5~IaSP5|xN*zUo5^*f@m8fA(Ane2=8P=IM@pLfoffDqbXU3_R4*z& zy3d-C)nR6Ob(pSikl%5gcE9S3m!0Z_#s$^aMSuNGv*3wNjnlS08|u`c*Ma15(^)gO zp*D&*d{q@vNg|EiA!fRKRZBp-WV$9%@B&$kq{$|W7%{sXK~Rn$Vi5~jXos|9u#g2v z>TELKCdJ?J7*mF1b-9=cx)il{F^ivPd$lQ|7bY;5wak_v44H#&!An@k{iq9VJsb6I zTbH120}a8mK)YPjJ&;XhCX&huMrPO~vIOpeuc{b{v6PV_B(iy(T~{H39X7a+0ortz z&3-zP*kvqanoYXutg`|nO*Wazh<*#@JIBbbEXoDC*2K*!iqo`7WG za(2PvQCqeihx#sPxX63$h!u0$MUF+Xbp<11Z1Pf1Hm`gn5f3slnh~>WI1ZnOpw0%l z2wYTeVV#Xa;$6u?MzRpPLS-Ze$x$E>KLT~|DyD~{E(8q|%eEudek9!qQrw_zAnxtjGb6!rU{Atn>OTr~bC-dpL`9_5m_eZ=vzzSDVB{#m)A)EX7)8+s@A z2KO*>oS*KnT+`GgY7GC3tE2peyhM(1U2)aAk2?BkK4SoPm%plXR0@QBLWO!qh}FN6 zzLa)IQ^-c=25z5om=q-35s#28eVVwzu}Jjs!N!|UzOzJv*6yM6foB!ct}D`GCs*lyN#kUX9YP>wEP|eS{vU zeX2d9m1!RJj{3e@txi$9D_<+GE31`k#enQx>z?OMlyA$2DQcU`C-*fx@wY?V0CzsP@A+7q=%U^TG4qRX!>+3&NdO{Stb)u-u?ou@hD@y zMi~dv{NeQkM^dbq2$O4I)&Xdpvj=z#s+v78aDPyod1em`&<`ZteF-Pr7p?T*H5|7O z`fl9|*4}8{c7+FHH2My?!h^LJ^Nm@kelk6h(@((~7OmDWCr-F9Zyu^4V_Bnup#U^JLbZ$j6d znEV-KN9N{#h`=oG0Zr2{V4p$Eqxr3PI%N|{kph`l>_tA_s@_C`h{K~Whb;#n%ni~! zb|8TUZoz?FjAR~+w<@=gRRkaT(CA&we1KEa1Gx}6i#h{HJiM7{vXvD|njAui)=Hg` zB%*`SQ4cX5(TOotYt=UzJB-8N_L^q3#*of@NQi!lGYq4%vC??k_{rE~d}Ew5a*R)` z$T(7?`|G<{r_xCb0Y9IhKdwJ#BpJ^d-y448qH$QiW*oF4GYA2{XfaqwBs6e339<@C zlNTUDQw6PBdsW|U%rq_=!;C)}yYxQBqgLb?Qm6XsGsP$&kI+R8B+`nTPEK~P#AE!= z#%{8f1WZwUTpve1r!3ZoJMy(Nj>oi8ZJ^^r^<8y~I!TRGt~#Acoij(#oDaGG;GX4< zmRsdUd6k?c>#kF-8rNJ`g7cR1knw@>m{9<4PS^B3>TUNY+D^Fko061?4;MXfO-L|T z?^UG~d;-nWdpu$)Jgck?&7ixeDuxZjYFhCxHf3pRUyGWf9aCBGl$>`GB3O~ z=%2O1r8HdO=C=(gQW~yr+5n4MnYFm2c>a>#R=JdltDH`Sr6`xrU9iNHkIi}4aXJ37 z&P6?d8{n_)E2ZI5qIWOzDPjsNcUt>}km#zIo$$X}q4UB`R{97@{Ga3 z`m>q*y2eF)4VUb%g@|9)HyyEsq=VcFL8j8XkCL=PY%kj zm>hxf^p`@ywi*)ENtKnqC^7Es;t6*+_nG{P9O9~SerFA;A-##{o+6Yt)}AjDgmrol z-SHxcqHA6x;q>s6e4aJyIkJUsjJXoS(})+zAP20qVUUSh?vMxzyz+=S`s+1T&dcPj z9zthwh&qoEPebh^L|7+zC^<;?~Ll6UYi{*S|fI~gT8LRXwda-s`D^QQYzhl2@9ox<) z2TAw9BN9VZ`26b=3o;IlL^$w^ED4UmaHPSJ4u=;G6^;QGd@a6URQ}(-D02Q6Qvd(H zDLTkO_?B!nyL>$2fBd!>&h5sJL@oeNocdqCvuRkQ@PwEGuj=NS$V{g%8DH9E8s1Oz zI(S8k$S{gIQ%})A=ckq1Y~MqeO6Vqf15%^dX~q7?lgvkr)VbGFP+f z3Gj5Fb=m;1O3X_CHUs~EBAQzVK$w6kJ{A;@YI$sCrH?Szs70ky7f%{lGOo0EhHu!2 zWFI`H-l_~Zr&qb)oVI=poCmKDfpgNjA~>h6>ka3`ayZ4Mu(FK(a1Z%M)gf`7*i-yL zeV4l``<%PnK}v%#QE5yqI{14fqj**_8u)9;DB*WXMxI|wMlrvXjQanhl2MBNUHMzd zDEW6vMuTi8EE)0S#ch#7!@t(#zt*Ju&t8)fTa#u}UFPe8SVP5nVVQ_^D0(Fw%RB2? z6)M(?<(>6*6$%Q9SOi+n%1})}Kw}w-ZVg~wScHQ8ByA@1!ZH+%2xJ6{P(X@H8DV9p zI-6h_3draO8Nosn^>$z}?PaL#hZw;!6g>(A#$-jP;2@@15vtJEScIaxZJmL-4K&Q& z3mV3#&ciz8`gFUs4rU3hA$BWw9@Yxi55_2?Ba2D{Ez5MpQ8xY{Bs*-9%3{n_XD|e} zQySZeO$Ikq`hcx*Kc!8!#_g0kgP9NRrZgWk433*AOsr)v8v-{}dd?=ep#o7G*tBp{ zr3*t?O#8O#pUw#GtMsl-+PBoO1z1E}k9#WJ8p>kYx6~C2**LhT(umHC;I0beoIS}1 z?yR&92*l&YN`JI9?yJ<>g+<`L3jdbeJQjf)D?JJXB5)1U;4tRZzO%MuGcVj)>24t4 zg_|pFv%PS8h0*hdGcVj?X=PXDgpH8zPTVE1Y@5^n;#j#V~Ee}~1aL~_(7 z4>Drr2IEa!fuJyvg)Fy2nseCgeE>-t5b#=tI(Z<|OHo&XhR3S{G~6n+m<_T7iQ!>h zi&0Oq^&-?eKtn`1X#9`eVG~}6BsPgfEI|E$t>>d|0u2#mEW#Xh7N=W^AU~Obc??kX zI2(K}l5;@7YYyt@6y|k5^D_NdU0**Nfdv3`3F^DHo`rgNDznc-y%jW!Jp(k{k=#!) zxEMjiAO?yUpex}u2}mK5Iv}9$L;a(zr=#|!v509b!t}GtC_r%322&ZJ{(0;&rXVRC z%t9vHWE7Oiq2ozN+JJzbh&p))(-Tlvf`<8yXAx%8XBaRJfdQ!&z`YF62MgJJ$0FGQ z#D0n~lfhNy9EPYWOl5S(8tl3X6B)f?YfNJ_wi0`*!XyT@__akiu_{bsv zVP19;ql2L44}@j0h_Q@d7K4YN+gNcR)lUlwV3y44Y>deaaKl*9LyxuyZon+3dGBS> z?K!RZY4+;@<}{c~OCPob+p`+9JaqIp5kpyOD;&o{+f!TdI2af{NO546-`Z^4p5Lm! z#s5+j%WswASzvp9J8%CM!t$Fjfsyw7w)saE!}8k>n_zx}%P4!BT|diku@hMgW;h_% z;R;|Jmf@Ogf*B4-KD^8W!5l~PC$SjJa6p>8EQaN{b3niga~zGH%rwhz3vJCZoMmg4 z;qKZRGaMa0h557mwiPtoRm^WN!kxuzgb?(Kn94}7O>UI3ACEdAsk2E(n>3ZNn0t_T z3s_7LBW80bUPuQ7M{N*jhqNgKNdS_Nzo7K(ZqQV;2-tC#b<^C`^-zhUf~ zowqPMK7QCRM;GZTlvf@iI+xAUmI%>H&s7L6dZb#&AQJmwmTvNi+168j;jZLR?YHek zA>emlu4r0|o)i=jsvJbO)@~R6O|Zl`HfWJh6#l9Frm|C+rUbiBxHq}8-Q1k~DWxOh zrYz&|mu;)ENSI29leT;$WLXh2gbUi { + await discord.cloud.connect() + console.log("Discord gateway started") + + const f = event => onPacket(discord, event, () => discord.cloud.off("event", f)) + discord.cloud.on("event", f) +})() + +const expectedGuilds = new Set() + +const prepared = db.prepare("UPDATE channel_room SET name = ? WHERE channel_id = ?") + +/** @param {DiscordClient} discord */ +function onPacket(discord, event, unsubscribe) { + if (event.t === "READY") { + for (const obj of event.d.guilds) { + expectedGuilds.add(obj.id) + } + + } else if (event.t === "GUILD_CREATE") { + expectedGuilds.delete(event.d.id) + + // Store the channel. + for (const channel of event.d.channels || []) { + prepared.run(channel.name, channel.id) + } + + // Checked them all? + if (expectedGuilds.size === 0) { + discord.cloud.disconnect() + unsubscribe() + + // I don't know why node keeps running. + setTimeout(() => { + console.log("Stopping now.") + process.exit() + }, 1500).unref() + } + } +} diff --git a/test/data.js b/test/data.js index 52b8770..d2c586a 100644 --- a/test/data.js +++ b/test/data.js @@ -216,6 +216,63 @@ module.exports = { flags: 0, components: [] }, + simple_room_mention: { + type: 0, + tts: false, + timestamp: "2023-07-10T20:04:25.939000+00:00", + referenced_message: null, + pinned: false, + nonce: "1128054139385806848", + mentions: [], + mention_roles: [], + mention_everyone: false, + member: { + roles: [ + "112767366235959296", "118924814567211009", + "204427286542417920", "199995902742626304", + "222168467627835392", "238028326281805825", + "259806643414499328", "265239342648131584", + "271173313575780353", "287733611912757249", + "225744901915148298", "305775031223320577", + "318243902521868288", "348651574924541953", + "349185088157777920", "378402925128712193", + "392141548932038658", "393912152173576203", + "482860581670486028", "495384759074160642", + "638988388740890635", "373336013109461013", + "530220455085473813", "454567553738473472", + "790724320824655873", "1123518980456452097", + "1040735082610167858", "695946570482450442", + "1123460940935991296", "849737964090556488" + ], + premium_since: null, + pending: false, + nick: null, + mute: false, + joined_at: "2015-11-11T09:55:40.321000+00:00", + flags: 0, + deaf: false, + communication_disabled_until: null, + avatar: null + }, + id: "1128054143064494233", + flags: 0, + embeds: [], + edited_timestamp: null, + content: "<#112760669178241024>", + components: [], + channel_id: "266767590641238027", + author: { + username: "kumaccino", + public_flags: 128, + id: "113340068197859328", + global_name: "kumaccino", + discriminator: "0", + avatar_decoration: null, + avatar: "b48302623a12bc7c59a71328f72ccb39" + }, + attachments: [], + guild_id: "112760669178241024" + }, simple_message_link: { id: "1126788210308161626", type: 0, From 00bdab713a9d1b2f7232c593773f8798743e69c5 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Tue, 11 Jul 2023 16:51:30 +1200 Subject: [PATCH 2/2] support rich replies, support basic m.mentions --- d2m/actions/send-message.js | 2 +- d2m/converters/message-to-event.js | 120 ++++++- d2m/converters/message-to-event.test.js | 126 +++++++ db/ooye.db | Bin 303104 -> 303104 bytes matrix/api.js | 22 ++ package.json | 2 +- test/data.js | 428 ++++++++++++++++++++++++ types.d.ts | 5 + 8 files changed, 689 insertions(+), 16 deletions(-) diff --git a/d2m/actions/send-message.js b/d2m/actions/send-message.js index f5fe5ef..ff3c1de 100644 --- a/d2m/actions/send-message.js +++ b/d2m/actions/send-message.js @@ -27,7 +27,7 @@ async function sendMessage(message, guild) { await registerUser.syncUser(message.author, message.member, message.guild_id, roomID) } - const events = await messageToEvent.messageToEvent(message, guild) + const events = await messageToEvent.messageToEvent(message, guild, api) const eventIDs = [] let eventPart = 0 // 0 is primary, 1 is supporting for (const event of events) { diff --git a/d2m/converters/message-to-event.js b/d2m/converters/message-to-event.js index 9999df9..0e94a70 100644 --- a/d2m/converters/message-to-event.js +++ b/d2m/converters/message-to-event.js @@ -2,6 +2,7 @@ const assert = require("assert").strict const markdown = require("discord-markdown") +const DiscordTypes = require("discord-api-types/v10") const passthrough = require("../../passthrough") const { sync, db, discord } = passthrough @@ -39,10 +40,56 @@ function getDiscordParseCallbacks(message, useHTML) { /** * @param {import("discord-api-types/v10").APIMessage} message * @param {import("discord-api-types/v10").APIGuild} guild + * @param {import("../../matrix/api")} api simple-as-nails dependency injection for the matrix API */ -async function messageToEvent(message, guild) { +async function messageToEvent(message, guild, api) { const events = [] + /** + @type {{room?: boolean, user_ids?: string[]}} + We should consider the following scenarios for mentions: + 1. TODO A discord user rich-replies to a matrix user with a text post + + The matrix user needs to be m.mentioned in the text event + + The matrix user needs to have their name/mxid/link in the text event (notification fallback) + - So prepend their `@name:` to the start of the plaintext body + 2. TODO A discord user rich-replies to a matrix user with an image event only + + The matrix user needs to be m.mentioned in the image event + + The matrix user needs to have their name/mxid in the image event's body field, alongside the filename (notification fallback) + - So append their name to the filename body, I guess!!! + 3. TODO A discord user `@`s a matrix user in the text body of their text box + + The matrix user needs to be m.mentioned in the text event + + No change needed to the text event content: it already has their name + - So make sure we don't do anything in this case. + */ + const mentions = {} + let repliedToEventId = null + let repliedToEventRoomId = null + let repliedToEventSenderMxid = null + let repliedToEventOriginallyFromMatrix = false + + function addMention(mxid) { + if (!mentions.user_ids) mentions.user_ids = [] + mentions.user_ids.push(mxid) + } + + // Mentions scenarios 1 and 2, part A. i.e. translate relevant message.mentions to m.mentions + // (Still need to do scenarios 1 and 2 part B, and scenario 3.) + if (message.type === DiscordTypes.MessageType.Reply && message.message_reference?.message_id) { + const row = db.prepare("SELECT event_id, room_id, source FROM event_message INNER JOIN channel_room USING (channel_id) WHERE message_id = ? AND part = 0").get(message.message_reference.message_id) + if (row) { + repliedToEventId = row.event_id + repliedToEventRoomId = row.room_id + repliedToEventOriginallyFromMatrix = row.source === 0 // source 0 = matrix + } + } + if (repliedToEventOriginallyFromMatrix) { + // Need to figure out who sent that event... + const event = await api.getEvent(repliedToEventRoomId, repliedToEventId) + repliedToEventSenderMxid = event.sender + // Need to add the sender to m.mentions + addMention(repliedToEventSenderMxid) + } + // Text content appears first if (message.content) { let content = message.content @@ -55,33 +102,63 @@ async function messageToEvent(message, guild) { } }) - const html = markdown.toHTML(content, { + let html = markdown.toHTML(content, { discordCallback: getDiscordParseCallbacks(message, true) }, null, null) - const body = markdown.toHTML(content, { + let body = markdown.toHTML(content, { discordCallback: getDiscordParseCallbacks(message, false), discordOnly: true, escapeHTML: false, }, null, null) + // Fallback body/formatted_body for replies + if (repliedToEventId) { + let repliedToDisplayName + let repliedToUserHtml + if (repliedToEventOriginallyFromMatrix && repliedToEventSenderMxid) { + const match = repliedToEventSenderMxid.match(/^@([^:]*)/) + assert(match) + repliedToDisplayName = match[1] || "a Matrix user" // grab the localpart as the display name, whatever + repliedToUserHtml = `${repliedToDisplayName}` + } else { + repliedToDisplayName = message.referenced_message?.author.global_name || message.referenced_message?.author.username || "a Discord user" + repliedToUserHtml = repliedToDisplayName + } + const repliedToContent = message.referenced_message?.content || "[Replied-to message content wasn't provided by Discord]" + const repliedToHtml = markdown.toHTML(repliedToContent, { + discordCallback: getDiscordParseCallbacks(message, true) + }, null, null) + const repliedToBody = markdown.toHTML(repliedToContent, { + discordCallback: getDiscordParseCallbacks(message, false), + discordOnly: true, + escapeHTML: false, + }, null, null) + html = `
In reply to ${repliedToUserHtml}` + + `
${repliedToHtml}
` + + html + body = (`${repliedToDisplayName}: ` // scenario 1 part B for mentions + + repliedToBody).split("\n").map(line => "> " + line).join("\n") + + "\n\n" + body + } + + const newTextMessageEvent = { + $type: "m.room.message", + "m.mentions": mentions, + msgtype: "m.text", + body: body + } + const isPlaintext = body === html - if (isPlaintext) { - events.push({ - $type: "m.room.message", - msgtype: "m.text", - body: body - }) - } else { - events.push({ - $type: "m.room.message", - msgtype: "m.text", - body: body, + if (!isPlaintext) { + Object.assign(newTextMessageEvent, { format: "org.matrix.custom.html", formatted_body: html }) } + + events.push(newTextMessageEvent) } // Then attachments @@ -90,6 +167,7 @@ async function messageToEvent(message, guild) { if (attachment.content_type?.startsWith("image/") && attachment.width && attachment.height) { return { $type: "m.room.message", + "m.mentions": mentions, msgtype: "m.image", url: await file.uploadDiscordFileToMxc(attachment.url), external_url: attachment.url, @@ -105,6 +183,7 @@ async function messageToEvent(message, guild) { } else { return { $type: "m.room.message", + "m.mentions": mentions, msgtype: "m.text", body: "Unsupported attachment:\n" + JSON.stringify(attachment, null, 2) } @@ -122,6 +201,7 @@ async function messageToEvent(message, guild) { if (sticker && sticker.description) body += ` - ${sticker.description}` return { $type: "m.sticker", + "m.mentions": mentions, body, info: { mimetype: format.mime @@ -131,6 +211,7 @@ async function messageToEvent(message, guild) { } else { return { $type: "m.room.message", + "m.mentions": mentions, msgtype: "m.text", body: "Unsupported sticker format. Name: " + stickerItem.name } @@ -139,6 +220,17 @@ async function messageToEvent(message, guild) { events.push(...stickerEvents) } + // Rich replies + if (repliedToEventId) { + Object.assign(events[0], { + "m.relates_to": { + "m.in_reply_to": { + event_id: repliedToEventId + } + } + }) + } + return events } diff --git a/d2m/converters/message-to-event.test.js b/d2m/converters/message-to-event.test.js index e3fcb06..5fa16f8 100644 --- a/d2m/converters/message-to-event.test.js +++ b/d2m/converters/message-to-event.test.js @@ -1,11 +1,39 @@ const {test} = require("supertape") const {messageToEvent} = require("./message-to-event") const data = require("../../test/data") +const Ty = require("../../types") + +/** + * @param {string} roomID + * @param {string} eventID + * @returns {(roomID: string, eventID: string) => Promise>} + */ +function mockGetEvent(t, roomID_in, eventID_in, outer) { + return async function(roomID, eventID) { + t.equal(roomID, roomID_in) + t.equal(eventID, eventID_in) + return new Promise(resolve => { + setTimeout(() => { + resolve({ + event_id: eventID_in, + room_id: roomID_in, + origin_server_ts: 1680000000000, + unsigned: { + age: 2245, + transaction_id: "$local.whatever" + }, + ...outer + }) + }) + }) + } +} test("message2event: simple plaintext", async t => { const events = await messageToEvent(data.message.simple_plaintext, data.guild.general) t.deepEqual(events, [{ $type: "m.room.message", + "m.mentions": {}, msgtype: "m.text", body: "ayy lmao" }]) @@ -15,6 +43,7 @@ test("message2event: simple user mention", async t => { const events = await messageToEvent(data.message.simple_user_mention, data.guild.general) t.deepEqual(events, [{ $type: "m.room.message", + "m.mentions": {}, msgtype: "m.text", body: "@crunch god: Tell me about Phil, renowned martial arts master and creator of the Chin Trick", format: "org.matrix.custom.html", @@ -26,6 +55,7 @@ test("message2event: simple room mention", async t => { const events = await messageToEvent(data.message.simple_room_mention, data.guild.general) t.deepEqual(events, [{ $type: "m.room.message", + "m.mentions": {}, msgtype: "m.text", body: "#main", format: "org.matrix.custom.html", @@ -37,6 +67,7 @@ test("message2event: simple message link", async t => { const events = await messageToEvent(data.message.simple_message_link, data.guild.general) t.deepEqual(events, [{ $type: "m.room.message", + "m.mentions": {}, msgtype: "m.text", body: "https://matrix.to/#/!kLRqKKUQXcibIMtOpl:cadence.moe/$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg", format: "org.matrix.custom.html", @@ -48,6 +79,7 @@ test("message2event: attachment with no content", async t => { const events = await messageToEvent(data.message.attachment_no_content, data.guild.general) t.deepEqual(events, [{ $type: "m.room.message", + "m.mentions": {}, msgtype: "m.image", url: "mxc://cadence.moe/qXoZktDqNtEGuOCZEADAMvhM", body: "image.png", @@ -65,10 +97,12 @@ test("message2event: stickers", async t => { const events = await messageToEvent(data.message.sticker, data.guild.general) t.deepEqual(events, [{ $type: "m.room.message", + "m.mentions": {}, msgtype: "m.text", body: "can have attachments too" }, { $type: "m.room.message", + "m.mentions": {}, msgtype: "m.image", url: "mxc://cadence.moe/ZDCNYnkPszxGKgObUIFmvjus", body: "image.png", @@ -81,6 +115,7 @@ test("message2event: stickers", async t => { }, }, { $type: "m.sticker", + "m.mentions": {}, body: "pomu puff - damn that tiny lil bitch really chuffing. puffing that fat ass dart", info: { mimetype: "image/png" @@ -90,3 +125,94 @@ test("message2event: stickers", async t => { url: "mxc://cadence.moe/UuUaLwXhkxFRwwWCXipDlBHn" }]) }) + +test("message2event: skull webp attachment with content", async t => { + const events = await messageToEvent(data.message.skull_webp_attachment_with_content, data.guild.general) + t.deepEqual(events, [{ + $type: "m.room.message", + "m.mentions": {}, + msgtype: "m.text", + body: "Image" + }, { + $type: "m.room.message", + "m.mentions": {}, + msgtype: "m.image", + body: "skull.webp", + info: { + w: 1200, + h: 628, + mimetype: "image/webp", + size: 74290 + }, + external_url: "https://cdn.discordapp.com/attachments/112760669178241024/1128084747910918195/skull.webp", + url: "mxc://cadence.moe/sDxWmDErBhYBxtDcJQgBETes" + }]) +}) + +test("message2event: reply to skull webp attachment with content", async t => { + const events = await messageToEvent(data.message.reply_to_skull_webp_attachment_with_content, data.guild.general) + t.deepEqual(events, [{ + $type: "m.room.message", + "m.relates_to": { + "m.in_reply_to": { + event_id: "$oLyUTyZ_7e_SUzGNWZKz880ll9amLZvXGbArJCKai2Q" + } + }, + "m.mentions": {}, + msgtype: "m.text", + body: "> Extremity: Image\n\nReply", + format: "org.matrix.custom.html", + formatted_body: + '
In reply to Extremity' + + '
Image
' + + 'Reply' + }, { + $type: "m.room.message", + "m.mentions": {}, + msgtype: "m.image", + body: "RDT_20230704_0936184915846675925224905.jpg", + info: { + w: 2048, + h: 1536, + mimetype: "image/jpeg", + size: 85906 + }, + external_url: "https://cdn.discordapp.com/attachments/112760669178241024/1128084851023675515/RDT_20230704_0936184915846675925224905.jpg", + url: "mxc://cadence.moe/WlAbFSiNRIHPDEwKdyPeGywa" + }]) +}) + +test("message2event: simple reply to matrix user", async t => { + const events = await messageToEvent(data.message.simple_reply_to_matrix_user, data.guild.general, { + getEvent: mockGetEvent(t, "!kLRqKKUQXcibIMtOpl:cadence.moe", "$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe4", { + type: "m.room.message", + content: { + msgtype: "m.text", + body: "so can you reply to my webhook uwu" + }, + sender: "@cadence:cadence.moe" + }) + }) + t.deepEqual(events, [{ + $type: "m.room.message", + "m.relates_to": { + "m.in_reply_to": { + event_id: "$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe4" + } + }, + "m.mentions": { + user_ids: [ + "@cadence:cadence.moe" + ] + }, + msgtype: "m.text", + body: "> cadence: so can you reply to my webhook uwu\n\nReply", + format: "org.matrix.custom.html", + formatted_body: + '
In reply to cadence' + + '
so can you reply to my webhook uwu
' + + 'Reply' + }]) +}) + +// TODO: read "edits of replies" in the spec diff --git a/db/ooye.db b/db/ooye.db index 560fa72042d091d7c598c89ce57ae3556dd5c227..8856af2938f5c59d796cdae940a01b59bbfe66d9 100644 GIT binary patch delta 2781 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 mB|eZx} */ + const root = await mreq.mreq("GET", `/client/v3/rooms/${roomID}/event/${eventID}`) + return root +} + /** * @param {string} roomID * @returns {Promise} @@ -73,6 +84,15 @@ function getAllState(roomID) { return mreq.mreq("GET", `/client/v3/rooms/${roomID}/state`) } +/** + * "Any of the AS's users must be in the room. This API is primarily for Application Services and should be faster to respond than /members as it can be implemented more efficiently on the server." + * @param {string} roomID + * @returns {Promise<{joined: {[mxid: string]: Ty.R.RoomMember}}>} + */ +function getJoinedMembers(roomID) { + return mreq.mreq("GET", `/client/v3/rooms/${roomID}/joined_members`) +} + /** * @param {string} roomID * @param {string} type @@ -114,7 +134,9 @@ module.exports.createRoom = createRoom module.exports.joinRoom = joinRoom module.exports.inviteToRoom = inviteToRoom module.exports.leaveRoom = leaveRoom +module.exports.getEvent = getEvent module.exports.getAllState = getAllState +module.exports.getJoinedMembers = getJoinedMembers module.exports.sendState = sendState module.exports.sendEvent = sendEvent module.exports.profileSetDisplayname = profileSetDisplayname diff --git a/package.json b/package.json index 7fb8cc6..8604330 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,6 @@ "tap-dot": "github:cloudrac3r/tap-dot#223a4e67a6f7daf015506a12a7af74605f06c7f4" }, "scripts": { - "test": "cross-env FORCE_COLOR=true supertape --format tap test/test.js | tap-dot" + "test": "cross-env FORCE_COLOR=true supertape --no-check-assertions-count --format tap test/test.js | tap-dot" } } diff --git a/test/data.js b/test/data.js index d2c586a..7c8fadc 100644 --- a/test/data.js +++ b/test/data.js @@ -423,6 +423,434 @@ module.exports = { flags: 0, components: [] }, + skull_webp_attachment_with_content: { + type: 0, + tts: false, + timestamp: "2023-07-10T22:06:02.805000+00:00", + referenced_message: null, + pinned: false, + nonce: "1128084721398448128", + mentions: [], + mention_roles: [], + mention_everyone: false, + member: { + roles: [ + "112767366235959296", + "118924814567211009", + "199995902742626304", + "204427286542417920", + "222168467627835392", + "271173313575780353", + "392141548932038658", + "1040735082610167858", + "372954403902193689", + "1124134606514442300", + "585531096071012409" + ], + premium_since: "2022-04-20T21:11:14.016000+00:00", + pending: false, + nick: "Tap to add a nickname", + mute: false, + joined_at: "2022-04-20T20:16:02.828000+00:00", + flags: 0, + deaf: false, + communication_disabled_until: null, + avatar: "a_4ea72c7b058ad848c9d9d35479fac26e" + }, + id: "1128084748338741392", + flags: 0, + embeds: [], + edited_timestamp: null, + content: "Image", + components: [], + channel_id: "112760669178241024", + author: { + username: "extremity", + public_flags: 768, + id: "114147806469554185", + global_name: "Extremity", + discriminator: "0", + avatar_decoration: null, + avatar: "6628aaf6b27219c36e2d3b5cfd6d0ee6" + }, + attachments: [ + { + width: 1200, + url: "https://cdn.discordapp.com/attachments/112760669178241024/1128084747910918195/skull.webp", + size: 74290, + proxy_url: "https://media.discordapp.net/attachments/112760669178241024/1128084747910918195/skull.webp", + id: "1128084747910918195", + height: 628, + filename: "skull.webp", + content_type: "image/webp" + } + ], + guild_id: "112760669178241024" + }, + reply_to_skull_webp_attachment_with_content: { + type: 19, + tts: false, + timestamp: "2023-07-10T22:06:27.348000+00:00", + referenced_message: { + type: 0, + tts: false, + timestamp: "2023-07-10T22:06:02.805000+00:00", + pinned: false, + mentions: [], + mention_roles: [], + mention_everyone: false, + id: "1128084748338741392", + flags: 0, + embeds: [], + edited_timestamp: null, + content: "Image", + components: [], + channel_id: "112760669178241024", + author: { + username: "extremity", + public_flags: 768, + id: "114147806469554185", + global_name: "Extremity", + discriminator: "0", + avatar_decoration: null, + avatar: "6628aaf6b27219c36e2d3b5cfd6d0ee6" + }, + attachments: [ + { + width: 1200, + url: "https://cdn.discordapp.com/attachments/112760669178241024/1128084747910918195/skull.webp", + size: 74290, + proxy_url: "https://media.discordapp.net/attachments/112760669178241024/1128084747910918195/skull.webp", + id: "1128084747910918195", + height: 628, + filename: "skull.webp", + content_type: "image/webp" + } + ] + }, + pinned: false, + nonce: "1128084845403045888", + message_reference: { + message_id: "1128084748338741392", + guild_id: "112760669178241024", + channel_id: "112760669178241024" + }, + mentions: [ + { + username: "extremity", + public_flags: 768, + member: { + roles: [ + "112767366235959296", + "118924814567211009", + "199995902742626304", + "204427286542417920", + "222168467627835392", + "271173313575780353", + "392141548932038658", + "1040735082610167858", + "372954403902193689", + "1124134606514442300", + "585531096071012409" + ], + premium_since: "2022-04-20T21:11:14.016000+00:00", + pending: false, + nick: "Tap to add a nickname", + mute: false, + joined_at: "2022-04-20T20:16:02.828000+00:00", + flags: 0, + deaf: false, + communication_disabled_until: null, + avatar: "a_4ea72c7b058ad848c9d9d35479fac26e" + }, + id: "114147806469554185", + global_name: "Extremity", + discriminator: "0", + avatar_decoration: null, + avatar: "6628aaf6b27219c36e2d3b5cfd6d0ee6" + } + ], + mention_roles: [], + mention_everyone: false, + member: { + roles: [ + "112767366235959296", + "118924814567211009", + "199995902742626304", + "204427286542417920", + "222168467627835392", + "271173313575780353", + "392141548932038658", + "1040735082610167858", + "372954403902193689", + "1124134606514442300", + "585531096071012409" + ], + premium_since: "2022-04-20T21:11:14.016000+00:00", + pending: false, + nick: "Tap to add a nickname", + mute: false, + joined_at: "2022-04-20T20:16:02.828000+00:00", + flags: 0, + deaf: false, + communication_disabled_until: null, + avatar: "a_4ea72c7b058ad848c9d9d35479fac26e" + }, + id: "1128084851279536279", + flags: 0, + embeds: [], + edited_timestamp: null, + content: "Reply", + components: [], + channel_id: "112760669178241024", + author: { + username: "extremity", + public_flags: 768, + id: "114147806469554185", + global_name: "Extremity", + discriminator: "0", + avatar_decoration: null, + avatar: "6628aaf6b27219c36e2d3b5cfd6d0ee6" + }, + attachments: [ + { + width: 2048, + url: "https://cdn.discordapp.com/attachments/112760669178241024/1128084851023675515/RDT_20230704_0936184915846675925224905.jpg", + size: 85906, + proxy_url: "https://media.discordapp.net/attachments/112760669178241024/1128084851023675515/RDT_20230704_0936184915846675925224905.jpg", + id: "1128084851023675515", + height: 1536, + filename: "RDT_20230704_0936184915846675925224905.jpg", + content_type: "image/jpeg" + } + ], + guild_id: "112760669178241024" + }, + simple_reply_to_matrix_user: { + type: 19, + tts: false, + timestamp: "2023-07-11T00:19:04.358000+00:00", + referenced_message: { + webhook_id: "703458020193206272", + type: 0, + tts: false, + timestamp: "2023-07-11T00:18:52.856000+00:00", + pinned: false, + mentions: [], + mention_roles: [], + mention_everyone: false, + id: "1128118177155526666", + flags: 0, + embeds: [], + edited_timestamp: null, + content: "so can you reply to my webhook uwu", + components: [], + channel_id: "112760669178241024", + author: { + username: "cadence", + id: "703458020193206272", + discriminator: "0000", + bot: true, + avatar: "ea5413d310c85eb9edaa9db865e80155" + }, + attachments: [], + application_id: "684280192553844747" + }, + pinned: false, + nonce: "1128118222315323392", + message_reference: { + message_id: "1128118177155526666", + guild_id: "112760669178241024", + channel_id: "112760669178241024" + }, + mentions: [], + mention_roles: [], + mention_everyone: false, + member: { + roles: [ + "112767366235959296", "118924814567211009", + "204427286542417920", "199995902742626304", + "222168467627835392", "238028326281805825", + "259806643414499328", "265239342648131584", + "271173313575780353", "287733611912757249", + "225744901915148298", "305775031223320577", + "318243902521868288", "348651574924541953", + "349185088157777920", "378402925128712193", + "392141548932038658", "393912152173576203", + "482860581670486028", "495384759074160642", + "638988388740890635", "373336013109461013", + "530220455085473813", "454567553738473472", + "790724320824655873", "1123518980456452097", + "1040735082610167858", "695946570482450442", + "1123460940935991296", "849737964090556488" + ], + premium_since: null, + pending: false, + nick: null, + mute: false, + joined_at: "2015-11-11T09:55:40.321000+00:00", + flags: 0, + deaf: false, + communication_disabled_until: null, + avatar: null + }, + id: "1128118225398407228", + flags: 0, + embeds: [], + edited_timestamp: null, + content: "Reply", + components: [], + channel_id: "112760669178241024", + author: { + username: "kumaccino", + public_flags: 128, + id: "113340068197859328", + global_name: "kumaccino", + discriminator: "0", + avatar_decoration: null, + avatar: "b48302623a12bc7c59a71328f72ccb39" + }, + attachments: [], + guild_id: "112760669178241024" + }, + edit_of_reply_to_skull_webp_attachment_with_content: { + type: 19, + tts: false, + timestamp: "2023-07-10T22:06:27.348000+00:00", + referenced_message: { + type: 0, + tts: false, + timestamp: "2023-07-10T22:06:02.805000+00:00", + pinned: false, + mentions: [], + mention_roles: [], + mention_everyone: false, + id: "1128084748338741392", + flags: 0, + embeds: [], + edited_timestamp: null, + content: "Image", + components: [], + channel_id: "112760669178241024", + author: { + username: "extremity", + public_flags: 768, + id: "114147806469554185", + global_name: "Extremity", + discriminator: "0", + avatar_decoration: null, + avatar: "6628aaf6b27219c36e2d3b5cfd6d0ee6" + }, + attachments: [ + { + width: 1200, + url: "https://cdn.discordapp.com/attachments/112760669178241024/1128084747910918195/skull.webp", + size: 74290, + proxy_url: "https://media.discordapp.net/attachments/112760669178241024/1128084747910918195/skull.webp", + id: "1128084747910918195", + height: 628, + filename: "skull.webp", + content_type: "image/webp" + } + ] + }, + pinned: false, + message_reference: { + message_id: "1128084748338741392", + guild_id: "112760669178241024", + channel_id: "112760669178241024" + }, + mentions: [ + { + username: "extremity", + public_flags: 768, + member: { + roles: [ + "112767366235959296", + "118924814567211009", + "199995902742626304", + "204427286542417920", + "222168467627835392", + "271173313575780353", + "392141548932038658", + "1040735082610167858", + "372954403902193689", + "1124134606514442300", + "585531096071012409" + ], + premium_since: "2022-04-20T21:11:14.016000+00:00", + pending: false, + nick: "Tap to add a nickname", + mute: false, + joined_at: "2022-04-20T20:16:02.828000+00:00", + flags: 0, + deaf: false, + communication_disabled_until: null, + avatar: "a_4ea72c7b058ad848c9d9d35479fac26e" + }, + id: "114147806469554185", + global_name: "Extremity", + discriminator: "0", + avatar_decoration: null, + avatar: "6628aaf6b27219c36e2d3b5cfd6d0ee6" + } + ], + mention_roles: [], + mention_everyone: false, + member: { + roles: [ + "112767366235959296", + "118924814567211009", + "199995902742626304", + "204427286542417920", + "222168467627835392", + "271173313575780353", + "392141548932038658", + "1040735082610167858", + "372954403902193689", + "1124134606514442300", + "585531096071012409" + ], + premium_since: "2022-04-20T21:11:14.016000+00:00", + pending: false, + nick: "Tap to add a nickname", + mute: false, + joined_at: "2022-04-20T20:16:02.828000+00:00", + flags: 0, + deaf: false, + communication_disabled_until: null, + avatar: "a_4ea72c7b058ad848c9d9d35479fac26e" + }, + id: "1128084851279536279", + flags: 0, + embeds: [], + edited_timestamp: "2023-07-10T22:08:57.442417+00:00", + content: "Edit", + components: [], + channel_id: "112760669178241024", + author: { + username: "extremity", + public_flags: 768, + id: "114147806469554185", + global_name: "Extremity", + discriminator: "0", + avatar_decoration: null, + avatar: "6628aaf6b27219c36e2d3b5cfd6d0ee6" + }, + attachments: [ + { + width: 2048, + url: "https://cdn.discordapp.com/attachments/112760669178241024/1128084851023675515/RDT_20230704_0936184915846675925224905.jpg", + size: 85906, + proxy_url: "https://media.discordapp.net/attachments/112760669178241024/1128084851023675515/RDT_20230704_0936184915846675925224905.jpg", + id: "1128084851023675515", + height: 1536, + filename: "RDT_20230704_0936184915846675925224905.jpg", + content_type: "image/jpeg" + } + ], + guild_id: "112760669178241024" + }, sticker: { id: "1106366167788044450", type: 0, diff --git a/types.d.ts b/types.d.ts index 01ff6a1..3ed3975 100644 --- a/types.d.ts +++ b/types.d.ts @@ -81,6 +81,11 @@ namespace R { room_id: string } + export type RoomMember = { + avatar_url: string + display_name: string + } + export type FileUploaded = { content_uri: string }