From d8b83759091cd9314ed9b73719fe35ebb8e115f4 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Wed, 28 Jun 2023 23:38:58 +1200 Subject: [PATCH 1/2] fix a variety of bugs that snuck in --- d2m/actions/create-room.js | 6 ++++-- d2m/actions/send-message.js | 6 +++--- d2m/event-dispatcher.js | 2 +- db/ooye.db | Bin 94208 -> 106496 bytes matrix/api.js | 2 +- package-lock.json | 6 +++--- test/data.js | 2 +- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/d2m/actions/create-room.js b/d2m/actions/create-room.js index 96a9671..c4baa2d 100644 --- a/d2m/actions/create-room.js +++ b/d2m/actions/create-room.js @@ -58,7 +58,7 @@ async function channelToKState(channel, guild) { "m.room.join_rules/": { join_rule: "restricted", allow: [{ - type: "m.room.membership", + type: "m.room_membership", room_id: spaceID }] } @@ -179,7 +179,9 @@ async function createAllForGuild(guildID) { const channelIDs = discord.guildChannelMap.get(guildID) assert.ok(channelIDs) for (const channelID of channelIDs) { - await syncRoom(channelID).then(r => console.log(`synced ${channelID}:`, r)) + if (discord.channels.get(channelID)?.type === DiscordTypes.ChannelType.GuildText) { // TODO: guild sync thread channels and such. maybe make a helper function to check if a given channel is syncable? + await syncRoom(channelID).then(r => console.log(`synced ${channelID}:`, r)) + } } } diff --git a/d2m/actions/send-message.js b/d2m/actions/send-message.js index 738c59a..897f7c0 100644 --- a/d2m/actions/send-message.js +++ b/d2m/actions/send-message.js @@ -15,14 +15,14 @@ const createRoom = sync.require("../actions/create-room") /** * @param {import("discord-api-types/v10").GatewayMessageCreateDispatchData} message + * @param {import("discord-api-types/v10").APIGuild} guild */ -async function sendMessage(message) { - assert.ok(message.member) - +async function sendMessage(message, guild) { const roomID = await createRoom.ensureRoom(message.channel_id) 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) } diff --git a/d2m/event-dispatcher.js b/d2m/event-dispatcher.js index eeee451..baf19a8 100644 --- a/d2m/event-dispatcher.js +++ b/d2m/event-dispatcher.js @@ -24,7 +24,7 @@ module.exports = { * @param {import("discord-api-types/v10").GatewayMessageReactionAddDispatchData} data */ onReactionAdd(client, data) { - if (data.emoji.id !== null) return // TOOD: image emoji reactions + if (data.emoji.id !== null) return // TODO: image emoji reactions console.log(data) addReaction.addReaction(data) } diff --git a/db/ooye.db b/db/ooye.db index e62e0afe3a346783156dfc1c0677d063c496ed73..7d323c81fa70762b9aba35f54f9fda885d6c6bac 100644 GIT binary patch delta 19330 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 E2jqTg2mk;8 delta 3183 zcmeH}drXv97QpYF@BQ8T-OEsA08x+@v5LGLR746mRl)JmZe#jVrqt3^R1n0Jx?5n3 zudeJ?yt^Ii3rSW@+oX$`C`y|~t4&RVE$EINV^^2o<6AD4X6S~GH|NSpa;pF`%MSW87bz{j(Q zbB=Ye*XVc7L8p->lQetC{)^pVeQzDJRMJP znwV`>GFk0pbRnz0;^mcL)hcz_>>AqZ89NpSe<_%ifMdjXE0vc#s(Th?VYIyZmCA;a zbWu(cvl;?xYFEA-sIOeLIsoaFft*0je<_cwS131u!hNI%+rh_l!;_YV*AwxA*(}ac zF7B92pK9tJf10>S;zc)cM&vGCR#9DDxiU~!Q?tsLYCN!*XeqLo8Lb#$95-naF~0|b z@_X`FZn2NpCiWCdbiQ^za2lMM4yEVmK3YY+WQd$5+sR@w&c11P*&FNycD!}fdf!@W z6kZc&mm6Qe`*97<#|k>z+McI*OO+gdsJjj4Xx=%1pN9Zv1L7Tkvm}b_ zh@>Y$)iwJ zHpnv|^Rkr5e$n?suI9}IIeiaAP6DirVg@8_yCda9ke8!!0>~kdkAs}Q7m~({!g8PmD!M@i?n{aRdK-uXodse*>Q9m!paLKYR0l+W-UYIOt^ip; zo*_vl&;lR>Xd{pg^bwE-bQ?$onlLO$0jdCU0qp?7K;6Sxv82?NmvFuni>zYDbSlZG zhhuTC+1ioV8EfHwJ&d!5v$hwj%6x57$XJbE3pc*BiN{&?Fyb}rE9R5eHGys*{baK} z9Cl}aV~2;=X+tFe{0}cPFWs#y= z>;=SUh2ysk(nB53V&UEs7hb)08*XxBbEW7k;-B;1^YVv-;^Cl>|F;hZ#s7Cugu36t zx$t76vB=LiaS2an5qX&}GtE0+j*`%a(J?;{@D^a6AExi)Z7_Z3f~|=DoR$IZkZ8cg zPBQC-(UC9Tcf4k}{%DI)46`W7-jCSp&NIBwKF>UK5;b%h^B- zT27X8$}X@{UQO;hsbr_q!_Uc6i7mE9R6T_FTm0_LqBA*}q zD@s)Ttx;zq(OQ3#XuBRSVtO-#uXkd2$@QaHXQ$B`|C&%^HJ&bx^iB?MxzT{Vuv-*^ z5I@N`@gjQ!J8HGF>CS+2#Hn|t(fjncl|i4RIyq_XCWXXhe`e;&V;M5^WpQeOe|f02 z3QzfGPioMK)x@s8QP8p(T2+O|h`T*07>R_&3Hll)6aK9)y;fI!545DORn@2ct3;%C zwiwYrQ76r4h95;gLR`9bOs5+j-0jaFpqIGSvi~>&l{KIlqT+g@Jb*F(*!%!0mZhSb z-*UsJ%#kUP-V#yNelI*#PDJ^$d0ksS%EX?bUJIDeEJhTK{wJ_)F7uwkUY^j z<0ZVsJk)U>ceYgFdM(9aZbWGp;^+BxK9j3#KYP*njCq_EnLI$d=DyDO6x_~QJN%tPnOMh3l-D8tEB*-|`W+q{+km7nDw^D6!ZpUoHZbQxywQ2IiAF^RIR3OmS`@*eKvr}+W? r8}8z%>=gT!ZIxjwm^w-+z@e*2*wcBS9GBw>adr#hr}*ao{Sf{RZUCG= diff --git a/matrix/api.js b/matrix/api.js index 846ea64..3ec014d 100644 --- a/matrix/api.js +++ b/matrix/api.js @@ -78,7 +78,7 @@ function getAllState(roomID) { async function sendState(roomID, type, stateKey, content, mxid) { console.log(`[api] state: ${roomID}: ${type}/${stateKey}`) assert.ok(type) - assert.ok(stateKey) + assert.ok(typeof stateKey === "string") /** @type {import("../types").R.EventSent} */ const root = await mreq.mreq("PUT", path(`/client/v3/rooms/${roomID}/state/${type}/${stateKey}`, mxid), content) return root.event_id diff --git a/package-lock.json b/package-lock.json index 9556331..224e232 100644 --- a/package-lock.json +++ b/package-lock.json @@ -478,9 +478,9 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/better-sqlite3": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.3.0.tgz", - "integrity": "sha512-JTmvBZL/JLTc+3Msbvq6gK6elbU9/wVMqiudplHrVJpr7sVMR9KJrNhZAbW+RhXKlpMcuEhYkdcHa3TXKNXQ1w==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.4.0.tgz", + "integrity": "sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==", "hasInstallScript": true, "dependencies": { "bindings": "^1.5.0", diff --git a/test/data.js b/test/data.js index 9704c8d..6a65b5f 100644 --- a/test/data.js +++ b/test/data.js @@ -33,7 +33,7 @@ module.exports = { "m.room.join_rules/": { join_rule: "restricted", allow: [{ - type: "m.room.membership", + type: "m.room_membership", room_id: "!jjWAGMeQdNrVZSSfvz:cadence.moe" }] }, From 5b15f710d7c811c7c1f4f684234b85f87bab10bd Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Thu, 29 Jun 2023 00:06:56 +1200 Subject: [PATCH 2/2] support d->m stickers --- d2m/actions/create-room.js | 33 +++++++++++++++++++----- d2m/actions/send-message.js | 2 +- d2m/converters/message-to-event.js | 31 ++++++++++++++++++++-- d2m/converters/message-to-event.test.js | 4 +-- d2m/event-dispatcher.js | 8 +++--- db/ooye.db | Bin 106496 -> 106496 bytes matrix/file.js | 3 ++- test/data.js | 4 +-- 8 files changed, 67 insertions(+), 18 deletions(-) diff --git a/d2m/actions/create-room.js b/d2m/actions/create-room.js index c4baa2d..479bb79 100644 --- a/d2m/actions/create-room.js +++ b/d2m/actions/create-room.js @@ -32,12 +32,13 @@ function applyKStateDiffToRoom(roomID, kstate) { } /** - * @param {import("discord-api-types/v10").APIGuildTextChannel} channel - * @param {import("discord-api-types/v10").APIGuild} guild + * @param {DiscordTypes.APIGuildTextChannel} channel + * @param {DiscordTypes.APIGuild} guild */ async function channelToKState(channel, guild) { const spaceID = db.prepare("SELECT space_id FROM guild_space WHERE guild_id = ?").pluck().get(guild.id) assert.ok(typeof spaceID === "string") + const customName = db.prepare("SELECT nick FROM channel_room WHERE channel_id = ?").pluck().get(channel.id) const avatarEventContent = {} if (guild.icon) { @@ -45,9 +46,27 @@ async function channelToKState(channel, guild) { avatarEventContent.url = await file.uploadDiscordFileToMxc(avatarEventContent.discord_path) // TODO: somehow represent future values in kstate (callbacks?), while still allowing for diffing, so test cases don't need to touch the media API } + // TODO: Improve nasty nested ifs + let convertedName, convertedTopic + if (customName) { + convertedName = customName + if (channel.topic) { + convertedTopic = `${channel.name} | ${channel.topic}\n\nChannel ID: ${channel.id}\nGuild ID: ${guild.id}` + } else { + convertedTopic = `${channel.name}\n\nChannel ID: ${channel.id}\nGuild ID: ${guild.id}` + } + } else { + convertedName = channel.name + if (channel.topic) { + convertedTopic = `${channel.topic}\n\nChannel ID: ${channel.id}\nGuild ID: ${guild.id}` + } else { + convertedTopic = `Channel ID: ${channel.id}\nGuild ID: ${guild.id}` + } + } + const channelKState = { - "m.room.name/": {name: channel.name}, - "m.room.topic/": {$if: channel.topic, topic: channel.topic}, + "m.room.name/": {name: convertedName}, + "m.room.topic/": {topic: convertedTopic}, "m.room.avatar/": avatarEventContent, "m.room.guest_access/": {guest_access: "can_join"}, "m.room.history_visibility/": {history_visibility: "invited"}, @@ -69,7 +88,7 @@ async function channelToKState(channel, guild) { /** * Create a bridge room, store the relationship in the database, and add it to the guild's space. - * @param {import("discord-api-types/v10").APIGuildTextChannel} channel + * @param {DiscordTypes.APIGuildTextChannel} channel * @param guild * @param {string} spaceID * @param {any} kstate @@ -96,7 +115,7 @@ async function createRoom(channel, guild, spaceID, kstate) { } /** - * @param {import("discord-api-types/v10").APIGuildChannel} channel + * @param {DiscordTypes.APIGuildChannel} channel */ function channelToGuild(channel) { const guildID = channel.guild_id @@ -129,7 +148,7 @@ function channelToGuild(channel) { * @returns {Promise} room ID */ async function _syncRoom(channelID, shouldActuallySync) { - /** @ts-ignore @type {import("discord-api-types/v10").APIGuildChannel} */ + /** @ts-ignore @type {DiscordTypes.APIGuildChannel} */ const channel = discord.channels.get(channelID) assert.ok(channel) const guild = channelToGuild(channel) diff --git a/d2m/actions/send-message.js b/d2m/actions/send-message.js index 897f7c0..24a825a 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) + const events = await messageToEvent.messageToEvent(message, guild) 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 86be8ac..549d104 100644 --- a/d2m/converters/message-to-event.js +++ b/d2m/converters/message-to-event.js @@ -1,16 +1,18 @@ // @ts-check +const assert = require("assert").strict const markdown = require("discord-markdown") const passthrough = require("../../passthrough") -const { sync, db } = passthrough +const { sync, db, discord } = passthrough /** @type {import("../../matrix/file")} */ const file = sync.require("../../matrix/file") /** * @param {import("discord-api-types/v10").APIMessage} message + * @param {import("discord-api-types/v10").APIGuild} guild */ -async function messageToEvent(message) { +async function messageToEvent(message, guild) { const events = [] // Text content appears first @@ -87,6 +89,31 @@ async function messageToEvent(message) { events.push(...attachmentEvents) // Then stickers + if (message.sticker_items) { + const stickerEvents = await Promise.all(message.sticker_items.map(async stickerItem => { + const format = file.stickerFormat.get(stickerItem.format_type) + if (format?.mime) { + let body = stickerItem.name + const sticker = guild.stickers.find(sticker => sticker.id === stickerItem.id) + if (sticker && sticker.description) body += ` - ${sticker.description}` + return { + $type: "m.sticker", + body, + info: { + mimetype: format.mime + }, + url: await file.uploadDiscordFileToMxc(file.sticker(stickerItem)) + } + } else { + return { + $type: "m.room.message", + msgtype: "m.text", + body: "Unsupported sticker format. Name: " + stickerItem.name + } + } + })) + events.push(...stickerEvents) + } return events } diff --git a/d2m/converters/message-to-event.test.js b/d2m/converters/message-to-event.test.js index 323dc78..c92cd85 100644 --- a/d2m/converters/message-to-event.test.js +++ b/d2m/converters/message-to-event.test.js @@ -4,7 +4,7 @@ const {messageToEvent} = require("./message-to-event") const data = require("../../test/data") test("message2event: stickers", async t => { - const events = await messageToEvent(data.message.sticker) + const events = await messageToEvent(data.message.sticker, data.guild.general) t.deepEqual(events, [{ $type: "m.room.message", msgtype: "m.text", @@ -29,6 +29,6 @@ test("message2event: stickers", async t => { // thumbnail_url // thumbnail_info }, - url: "mxc://" + url: "mxc://cadence.moe/UuUaLwXhkxFRwwWCXipDlBHn" }]) }) diff --git a/d2m/event-dispatcher.js b/d2m/event-dispatcher.js index baf19a8..fbcdca0 100644 --- a/d2m/event-dispatcher.js +++ b/d2m/event-dispatcher.js @@ -1,5 +1,4 @@ -// @ts-check - +const assert = require("assert").strict const {sync} = require("../passthrough") /** @type {import("./actions/send-message")}) */ @@ -15,8 +14,11 @@ module.exports = { * @param {import("discord-api-types/v10").GatewayMessageCreateDispatchData} message */ onMessageCreate(client, message) { + /** @ts-ignore @type {import("discord-api-types/v10").APIGuildChannel} */ + const channel = client.channels.get(message.channel_id) + const guild = client.guilds.get(channel.guild_id) if (message.guild_id !== "112760669178241024") return // TODO: activate on other servers (requires the space creation flow to be done first) - sendMessage.sendMessage(message) + sendMessage.sendMessage(message, guild) }, /** diff --git a/db/ooye.db b/db/ooye.db index 7d323c81fa70762b9aba35f54f9fda885d6c6bac..5168a0f57405b2bfa3d220e31089a5c75bca3e6c 100644 GIT binary patch delta 1757 zcmb7^%}?8Q9L8}7F#(d0c0xj+X-sTllfwM+b8Ks`iOD zJ8S}3RaI5ca+x-1(u%Tr>)YoKVXMmHfhGN!?aSt$*1S@{rdMj&v*No zY5SRJcMh7_n`g#mMwY8T9_9CKlZNVu1G+h4?HL}b6VpqtK|k9b!6)#&@g>9emZ#9o zu>kai`pNX%ke_CtO=PqHEw0r$xsvX;Hd9K3ZI>BwMcnc^gUVJEaI0Xg9jv=EfoM!n zgi=NqxRv#4Fdp|uwx|q3`zj)%5TfjGb8FIimI=gAr0WezF1eTxQ|kDQ0)(o_*Vu*w z^h?EXcq{3a`~|t{$~#<12kY{+y=EipFpn2h4^Jk@Be) zFZ#TW0`KyslPu~8)ciHkFLZMqvg%B9+M=VIDN3Xu093uN1a~2B=51cXBGOL8K7)mjY-SLjZvg6vC|Qlxui#4#5D0 zq1rau;~*51)giC+XYgNxbP7omDDK2)gdkBAFd3b4jrd(av_ByU3?l%7;7nSBm=_CT zt5@yv7-;%9&7U}#8bpwqD;vv|GNpEeQ2IzIPy0*$iaT~e!EuTpfD@seG+yrs z)YJaV>mH%iOG~kGijOzCY*rLjwNI;8*_oa;?!?Xz>R)$fhaYuL#z*aDS%tS33}$&~ zM|@`E$7e$pKAV5z6+@P#M#(-r`ZQshvQIr9v3V?Zi#YXsXx;s3O11CL%wD#DeQ4kR z)9^N8Ivuh7U^{?MY<1fQwn^(R)~~ExtIs-P`5k^?I<-+a6{4I3ux=HFo4 z{KPykhvED%`dBdy^b2#1<8Vh8T;mXI=z_~SKX^&$Z|jPy7F_H1EnV>c>|YxFv@SS{ z`Bihy>WXWmF*#iN^4C8Mlg;CaUFgF}XnF7OUDNwZMl>|53NKJoUKHzv=J7WVA1OjRRVv}L4GLziVF_R4vU;&epFsw3@pwcV^1783!lhD$SvtJXX3g!U(heC4tNen4i*jN4YUX-lPaJj3JMVk;R&z_e+f>rUZ8UZv9M(UvnZ(G=K>CX ow+fH}JqrPAk)da|ubTm30+&dR0XUaPo&h$KX7@O^ww?h>0h8NdzyJUM diff --git a/matrix/file.js b/matrix/file.js index a373676..64cd492 100644 --- a/matrix/file.js +++ b/matrix/file.js @@ -83,10 +83,11 @@ function emoji(emojiID, animated) { const stickerFormat = new Map([ [1, {label: "PNG", ext: "png", mime: "image/png"}], [2, {label: "APNG", ext: "png", mime: "image/apng"}], - [3, {label: "LOTTIE", ext: "json", mime: "application/json"}], + [3, {label: "LOTTIE", ext: "json", mime: null}], [4, {label: "GIF", ext: "gif", mime: "image/gif"}] ]) +/** @param {{id: string, format_type: number}} sticker */ function sticker(sticker) { const format = stickerFormat.get(sticker.format_type) if (!format) throw new Error(`No such format ${sticker.format_type} for sticker ${JSON.stringify(sticker)}`) diff --git a/test/data.js b/test/data.js index 6a65b5f..bb70cbe 100644 --- a/test/data.js +++ b/test/data.js @@ -22,8 +22,8 @@ module.exports = { }, room: { general: { - "m.room.name/": {name: "collective-unconscious"}, - "m.room.topic/": {topic: "https://docs.google.com/document/d/blah/edit | I spread, pipe, and whip because it is my will. :headstone:"}, + "m.room.name/": {name: "main"}, + "m.room.topic/": {topic: "collective-unconscious | https://docs.google.com/document/d/blah/edit | I spread, pipe, and whip because it is my will. :headstone:\n\nChannel ID: 112760669178241024\nGuild ID: 112760669178241024"}, "m.room.guest_access/": {guest_access: "can_join"}, "m.room.history_visibility/": {history_visibility: "invited"}, "m.space.parent/!jjWAGMeQdNrVZSSfvz:cadence.moe": {