diff --git a/.gitignore b/.gitignore index 3781b9b..9c175d8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,6 @@ node_modules config.js registration.yaml coverage -src/db/ooye.db* +db/ooye.db* test/res/* !test/res/lottie* diff --git a/src/d2m/actions/add-reaction.js b/d2m/actions/add-reaction.js similarity index 100% rename from src/d2m/actions/add-reaction.js rename to d2m/actions/add-reaction.js diff --git a/src/d2m/actions/announce-thread.js b/d2m/actions/announce-thread.js similarity index 100% rename from src/d2m/actions/announce-thread.js rename to d2m/actions/announce-thread.js diff --git a/src/d2m/actions/create-room.js b/d2m/actions/create-room.js similarity index 100% rename from src/d2m/actions/create-room.js rename to d2m/actions/create-room.js diff --git a/src/d2m/actions/create-room.test.js b/d2m/actions/create-room.test.js similarity index 99% rename from src/d2m/actions/create-room.test.js rename to d2m/actions/create-room.test.js index a1766dd..d4391a9 100644 --- a/src/d2m/actions/create-room.test.js +++ b/d2m/actions/create-room.test.js @@ -4,7 +4,7 @@ const mixin = require("@cloudrac3r/mixin-deep") const {channelToKState, _convertNameAndTopic} = require("./create-room") const {kstateStripConditionals} = require("../../matrix/kstate") const {test} = require("supertape") -const testData = require("../../../test/data") +const testData = require("../../test/data") const passthrough = require("../../passthrough") const {db} = passthrough diff --git a/src/d2m/actions/create-space.js b/d2m/actions/create-space.js similarity index 100% rename from src/d2m/actions/create-space.js rename to d2m/actions/create-space.js diff --git a/src/d2m/actions/create-space.test.js b/d2m/actions/create-space.test.js similarity index 95% rename from src/d2m/actions/create-space.test.js rename to d2m/actions/create-space.test.js index cb4d90a..c4111db 100644 --- a/src/d2m/actions/create-space.test.js +++ b/d2m/actions/create-space.test.js @@ -4,7 +4,7 @@ const mixin = require("@cloudrac3r/mixin-deep") const {guildToKState, ensureSpace} = require("./create-space") const {kstateStripConditionals, kstateUploadMxc} = require("../../matrix/kstate") const {test} = require("supertape") -const testData = require("../../../test/data") +const testData = require("../../test/data") const passthrough = require("../../passthrough") const {db} = passthrough diff --git a/src/d2m/actions/delete-message.js b/d2m/actions/delete-message.js similarity index 100% rename from src/d2m/actions/delete-message.js rename to d2m/actions/delete-message.js diff --git a/src/d2m/actions/edit-message.js b/d2m/actions/edit-message.js similarity index 100% rename from src/d2m/actions/edit-message.js rename to d2m/actions/edit-message.js diff --git a/src/d2m/actions/expression.js b/d2m/actions/expression.js similarity index 98% rename from src/d2m/actions/expression.js rename to d2m/actions/expression.js index b81f4ed..b7b5d5a 100644 --- a/src/d2m/actions/expression.js +++ b/d2m/actions/expression.js @@ -66,7 +66,7 @@ async function stickersToState(stickers) { while (shortcodes.includes(shortcode)) shortcode = shortcode + "~" shortcodes.push(shortcode) - result.images[shortcode] = { + result.images[shortcodes] = { info: { mimetype: file.stickerFormat.get(sticker.format_type)?.mime || "image/png" }, diff --git a/src/d2m/actions/lottie.js b/d2m/actions/lottie.js similarity index 100% rename from src/d2m/actions/lottie.js rename to d2m/actions/lottie.js diff --git a/src/d2m/actions/register-pk-user.js b/d2m/actions/register-pk-user.js similarity index 100% rename from src/d2m/actions/register-pk-user.js rename to d2m/actions/register-pk-user.js diff --git a/src/d2m/actions/register-user.js b/d2m/actions/register-user.js similarity index 100% rename from src/d2m/actions/register-user.js rename to d2m/actions/register-user.js diff --git a/src/d2m/actions/register-user.test.js b/d2m/actions/register-user.test.js similarity index 97% rename from src/d2m/actions/register-user.test.js rename to d2m/actions/register-user.test.js index 353c89f..96c73aa 100644 --- a/src/d2m/actions/register-user.test.js +++ b/d2m/actions/register-user.test.js @@ -1,6 +1,6 @@ const {_memberToStateContent} = require("./register-user") const {test} = require("supertape") -const testData = require("../../../test/data") +const testData = require("../../test/data") test("member2state: without member nick or avatar", async t => { t.deepEqual( diff --git a/src/d2m/actions/remove-reaction.js b/d2m/actions/remove-reaction.js similarity index 100% rename from src/d2m/actions/remove-reaction.js rename to d2m/actions/remove-reaction.js diff --git a/src/d2m/actions/retrigger.js b/d2m/actions/retrigger.js similarity index 100% rename from src/d2m/actions/retrigger.js rename to d2m/actions/retrigger.js diff --git a/src/d2m/actions/send-message.js b/d2m/actions/send-message.js similarity index 100% rename from src/d2m/actions/send-message.js rename to d2m/actions/send-message.js diff --git a/src/d2m/actions/speedbump.js b/d2m/actions/speedbump.js similarity index 100% rename from src/d2m/actions/speedbump.js rename to d2m/actions/speedbump.js diff --git a/src/d2m/actions/update-pins.js b/d2m/actions/update-pins.js similarity index 100% rename from src/d2m/actions/update-pins.js rename to d2m/actions/update-pins.js diff --git a/src/d2m/converters/edit-to-changes.js b/d2m/converters/edit-to-changes.js similarity index 100% rename from src/d2m/converters/edit-to-changes.js rename to d2m/converters/edit-to-changes.js diff --git a/src/d2m/converters/edit-to-changes.test.js b/d2m/converters/edit-to-changes.test.js similarity index 99% rename from src/d2m/converters/edit-to-changes.test.js rename to d2m/converters/edit-to-changes.test.js index b561bb1..effb777 100644 --- a/src/d2m/converters/edit-to-changes.test.js +++ b/d2m/converters/edit-to-changes.test.js @@ -1,6 +1,6 @@ const {test} = require("supertape") const {editToChanges} = require("./edit-to-changes") -const data = require("../../../test/data") +const data = require("../../test/data") const Ty = require("../../types") test("edit2changes: edit by webhook", async t => { diff --git a/src/d2m/converters/emoji-to-key.js b/d2m/converters/emoji-to-key.js similarity index 100% rename from src/d2m/converters/emoji-to-key.js rename to d2m/converters/emoji-to-key.js diff --git a/src/d2m/converters/emoji-to-key.test.js b/d2m/converters/emoji-to-key.test.js similarity index 94% rename from src/d2m/converters/emoji-to-key.test.js rename to d2m/converters/emoji-to-key.test.js index 544eada..5af046c 100644 --- a/src/d2m/converters/emoji-to-key.test.js +++ b/d2m/converters/emoji-to-key.test.js @@ -2,7 +2,7 @@ const {test} = require("supertape") const {emojiToKey} = require("./emoji-to-key") -const data = require("../../../test/data") +const data = require("../../test/data") const Ty = require("../../types") test("emoji2key: unicode emoji works", async t => { diff --git a/src/d2m/converters/lottie.js b/d2m/converters/lottie.js similarity index 100% rename from src/d2m/converters/lottie.js rename to d2m/converters/lottie.js diff --git a/src/d2m/converters/lottie.test.js b/d2m/converters/lottie.test.js similarity index 100% rename from src/d2m/converters/lottie.test.js rename to d2m/converters/lottie.test.js diff --git a/src/d2m/converters/message-to-event.embeds.test.js b/d2m/converters/message-to-event.embeds.test.js similarity index 99% rename from src/d2m/converters/message-to-event.embeds.test.js rename to d2m/converters/message-to-event.embeds.test.js index ef7e9b8..05e3b5d 100644 --- a/src/d2m/converters/message-to-event.embeds.test.js +++ b/d2m/converters/message-to-event.embeds.test.js @@ -1,6 +1,6 @@ const {test} = require("supertape") const {messageToEvent} = require("./message-to-event") -const data = require("../../../test/data") +const data = require("../../test/data") const Ty = require("../../types") test("message2event embeds: nothing but a field", async t => { diff --git a/src/d2m/converters/message-to-event.js b/d2m/converters/message-to-event.js similarity index 100% rename from src/d2m/converters/message-to-event.js rename to d2m/converters/message-to-event.js diff --git a/src/d2m/converters/message-to-event.pk.test.js b/d2m/converters/message-to-event.pk.test.js similarity index 98% rename from src/d2m/converters/message-to-event.pk.test.js rename to d2m/converters/message-to-event.pk.test.js index ce83d54..c490469 100644 --- a/src/d2m/converters/message-to-event.pk.test.js +++ b/d2m/converters/message-to-event.pk.test.js @@ -1,6 +1,6 @@ const {test} = require("supertape") const {messageToEvent} = require("./message-to-event") -const data = require("../../../test/data") +const data = require("../../test/data") const Ty = require("../../types") /** diff --git a/src/d2m/converters/message-to-event.test.js b/d2m/converters/message-to-event.test.js similarity index 99% rename from src/d2m/converters/message-to-event.test.js rename to d2m/converters/message-to-event.test.js index 3df1130..02fb4bb 100644 --- a/src/d2m/converters/message-to-event.test.js +++ b/d2m/converters/message-to-event.test.js @@ -1,6 +1,6 @@ const {test} = require("supertape") const {messageToEvent} = require("./message-to-event") -const data = require("../../../test/data") +const data = require("../../test/data") const Ty = require("../../types") /** diff --git a/src/d2m/converters/pins-to-list.js b/d2m/converters/pins-to-list.js similarity index 100% rename from src/d2m/converters/pins-to-list.js rename to d2m/converters/pins-to-list.js diff --git a/src/d2m/converters/pins-to-list.test.js b/d2m/converters/pins-to-list.test.js similarity index 89% rename from src/d2m/converters/pins-to-list.test.js rename to d2m/converters/pins-to-list.test.js index 7ee89b6..8a6daea 100644 --- a/src/d2m/converters/pins-to-list.test.js +++ b/d2m/converters/pins-to-list.test.js @@ -1,5 +1,5 @@ const {test} = require("supertape") -const data = require("../../../test/data") +const data = require("../../test/data") const {pinsToList} = require("./pins-to-list") test("pins2list: converts known IDs, ignores unknown IDs", t => { diff --git a/src/d2m/converters/remove-reaction.js b/d2m/converters/remove-reaction.js similarity index 100% rename from src/d2m/converters/remove-reaction.js rename to d2m/converters/remove-reaction.js diff --git a/src/d2m/converters/remove-reaction.test.js b/d2m/converters/remove-reaction.test.js similarity index 100% rename from src/d2m/converters/remove-reaction.test.js rename to d2m/converters/remove-reaction.test.js diff --git a/src/d2m/converters/rlottie-wasm.js b/d2m/converters/rlottie-wasm.js similarity index 100% rename from src/d2m/converters/rlottie-wasm.js rename to d2m/converters/rlottie-wasm.js diff --git a/src/d2m/converters/rlottie-wasm.license b/d2m/converters/rlottie-wasm.license similarity index 100% rename from src/d2m/converters/rlottie-wasm.license rename to d2m/converters/rlottie-wasm.license diff --git a/src/d2m/converters/rlottie-wasm.wasm b/d2m/converters/rlottie-wasm.wasm old mode 100644 new mode 100755 similarity index 100% rename from src/d2m/converters/rlottie-wasm.wasm rename to d2m/converters/rlottie-wasm.wasm diff --git a/src/d2m/converters/thread-to-announcement.js b/d2m/converters/thread-to-announcement.js similarity index 100% rename from src/d2m/converters/thread-to-announcement.js rename to d2m/converters/thread-to-announcement.js diff --git a/src/d2m/converters/thread-to-announcement.test.js b/d2m/converters/thread-to-announcement.test.js similarity index 99% rename from src/d2m/converters/thread-to-announcement.test.js rename to d2m/converters/thread-to-announcement.test.js index 471cd94..3bbca20 100644 --- a/src/d2m/converters/thread-to-announcement.test.js +++ b/d2m/converters/thread-to-announcement.test.js @@ -1,6 +1,6 @@ const {test} = require("supertape") const {threadToAnnouncement} = require("./thread-to-announcement") -const data = require("../../../test/data") +const data = require("../../test/data") const Ty = require("../../types") /** diff --git a/src/d2m/converters/user-to-mxid.js b/d2m/converters/user-to-mxid.js similarity index 100% rename from src/d2m/converters/user-to-mxid.js rename to d2m/converters/user-to-mxid.js diff --git a/src/d2m/converters/user-to-mxid.test.js b/d2m/converters/user-to-mxid.test.js similarity index 98% rename from src/d2m/converters/user-to-mxid.test.js rename to d2m/converters/user-to-mxid.test.js index 86f151b..5787b64 100644 --- a/src/d2m/converters/user-to-mxid.test.js +++ b/d2m/converters/user-to-mxid.test.js @@ -1,7 +1,7 @@ const {test} = require("supertape") const tryToCatch = require("try-to-catch") const assert = require("assert") -const data = require("../../../test/data") +const data = require("../../test/data") const {userToSimName} = require("./user-to-mxid") test("user2name: cannot create user for a webhook", async t => { diff --git a/src/d2m/discord-client.js b/d2m/discord-client.js similarity index 100% rename from src/d2m/discord-client.js rename to d2m/discord-client.js diff --git a/src/d2m/discord-packets.js b/d2m/discord-packets.js similarity index 100% rename from src/d2m/discord-packets.js rename to d2m/discord-packets.js diff --git a/src/d2m/event-dispatcher.js b/d2m/event-dispatcher.js similarity index 100% rename from src/d2m/event-dispatcher.js rename to d2m/event-dispatcher.js diff --git a/src/db/migrate.js b/db/migrate.js similarity index 100% rename from src/db/migrate.js rename to db/migrate.js diff --git a/src/db/migrations/.baby b/db/migrations/.baby similarity index 100% rename from src/db/migrations/.baby rename to db/migrations/.baby diff --git a/src/db/migrations/0001-schema.sql b/db/migrations/0001-schema.sql similarity index 100% rename from src/db/migrations/0001-schema.sql rename to db/migrations/0001-schema.sql diff --git a/src/db/migrations/0002-optimise-profile-content.sql b/db/migrations/0002-optimise-profile-content.sql similarity index 100% rename from src/db/migrations/0002-optimise-profile-content.sql rename to db/migrations/0002-optimise-profile-content.sql diff --git a/src/db/migrations/0002-optimise-profile-content.up.js b/db/migrations/0002-optimise-profile-content.up.js similarity index 100% rename from src/db/migrations/0002-optimise-profile-content.up.js rename to db/migrations/0002-optimise-profile-content.up.js diff --git a/src/db/migrations/0003-distinguish-column-names.sql b/db/migrations/0003-distinguish-column-names.sql similarity index 100% rename from src/db/migrations/0003-distinguish-column-names.sql rename to db/migrations/0003-distinguish-column-names.sql diff --git a/src/db/migrations/0004-auto-emoji-guild.sql b/db/migrations/0004-auto-emoji-guild.sql similarity index 100% rename from src/db/migrations/0004-auto-emoji-guild.sql rename to db/migrations/0004-auto-emoji-guild.sql diff --git a/src/db/migrations/0005-clear-member-cache.sql b/db/migrations/0005-clear-member-cache.sql similarity index 100% rename from src/db/migrations/0005-clear-member-cache.sql rename to db/migrations/0005-clear-member-cache.sql diff --git a/src/db/migrations/0006-add-privacy-to-space.sql b/db/migrations/0006-add-privacy-to-space.sql similarity index 100% rename from src/db/migrations/0006-add-privacy-to-space.sql rename to db/migrations/0006-add-privacy-to-space.sql diff --git a/src/db/migrations/0007-split-part-and-reaction-part.sql b/db/migrations/0007-split-part-and-reaction-part.sql similarity index 100% rename from src/db/migrations/0007-split-part-and-reaction-part.sql rename to db/migrations/0007-split-part-and-reaction-part.sql diff --git a/src/db/migrations/0008-add-last-bridged-pin-timestamp.sql b/db/migrations/0008-add-last-bridged-pin-timestamp.sql similarity index 100% rename from src/db/migrations/0008-add-last-bridged-pin-timestamp.sql rename to db/migrations/0008-add-last-bridged-pin-timestamp.sql diff --git a/src/db/migrations/0009-add-speedbump-id.sql b/db/migrations/0009-add-speedbump-id.sql similarity index 100% rename from src/db/migrations/0009-add-speedbump-id.sql rename to db/migrations/0009-add-speedbump-id.sql diff --git a/src/db/migrations/0010-add-sim-proxy.sql b/db/migrations/0010-add-sim-proxy.sql similarity index 100% rename from src/db/migrations/0010-add-sim-proxy.sql rename to db/migrations/0010-add-sim-proxy.sql diff --git a/src/db/migrations/0011-move-bridge-bot-to-real-id.up.js b/db/migrations/0011-move-bridge-bot-to-real-id.up.js similarity index 91% rename from src/db/migrations/0011-move-bridge-bot-to-real-id.up.js rename to db/migrations/0011-move-bridge-bot-to-real-id.up.js index 6bcf2c7..1808fcd 100644 --- a/src/db/migrations/0011-move-bridge-bot-to-real-id.up.js +++ b/db/migrations/0011-move-bridge-bot-to-real-id.up.js @@ -10,7 +10,7 @@ */ module.exports = async function(db) { - const config = require("../../../config") + const config = require("../../config") const id = Buffer.from(config.discordToken.split(".")[0], "base64").toString() db.prepare("UPDATE OR REPLACE sim SET user_id = ? WHERE user_id = '0'").run(id) } diff --git a/src/db/migrations/0012-add-member-power.sql b/db/migrations/0012-add-member-power.sql similarity index 100% rename from src/db/migrations/0012-add-member-power.sql rename to db/migrations/0012-add-member-power.sql diff --git a/src/db/orm-defs.d.ts b/db/orm-defs.d.ts similarity index 100% rename from src/db/orm-defs.d.ts rename to db/orm-defs.d.ts diff --git a/src/db/orm-defs.js b/db/orm-defs.js similarity index 100% rename from src/db/orm-defs.js rename to db/orm-defs.js diff --git a/src/db/orm.js b/db/orm.js similarity index 100% rename from src/db/orm.js rename to db/orm.js diff --git a/src/db/orm.test.js b/db/orm.test.js similarity index 98% rename from src/db/orm.test.js rename to db/orm.test.js index a53cc66..3d4e8ef 100644 --- a/src/db/orm.test.js +++ b/db/orm.test.js @@ -1,7 +1,7 @@ // @ts-check const {test} = require("supertape") -const data = require("../../test/data") +const data = require("../test/data") const {db, select, from} = require("../passthrough") diff --git a/src/discord/discord-command-handler.js b/discord/discord-command-handler.js similarity index 97% rename from src/discord/discord-command-handler.js rename to discord/discord-command-handler.js index f0a4b49..a434bf9 100644 --- a/src/discord/discord-command-handler.js +++ b/discord/discord-command-handler.js @@ -4,15 +4,13 @@ const assert = require("assert").strict const util = require("util") const DiscordTypes = require("discord-api-types/v10") const {reg} = require("../matrix/read-registration") -const {addbot} = require("../../addbot") +const {addbot} = require("../addbot") const {discord, sync, db, select} = require("../passthrough") /** @type {import("../matrix/api")}) */ const api = sync.require("../matrix/api") /** @type {import("../matrix/file")} */ const file = sync.require("../matrix/file") -/** @type {import("../m2d/converters/utils")} */ -const mxUtils = sync.require("../m2d/converters/utils") /** @type {import("../d2m/actions/create-space")} */ const createSpace = sync.require("../d2m/actions/create-space") /** @type {import("./utils")} */ @@ -93,8 +91,9 @@ const commands = [{ // Current avatar const avatarEvent = await api.getStateEvent(roomID, "m.room.avatar", "") + const avatarURLParts = avatarEvent?.url.match(/^mxc:\/\/([^/]+)\/(\w+)$/) let currentAvatarMessage = - ( avatarEvent.url ? `Current room-specific avatar: ${mxUtils.getPublicUrlForMxc(avatarEvent.url)}` + ( avatarURLParts ? `Current room-specific avatar: ${reg.ooye.server_origin}/_matrix/media/r0/download/${avatarURLParts[1]}/${avatarURLParts[2]}` : "No avatar. Now's your time to strike. Use `//icon` again with a link or upload to set the room-specific avatar.") // Next potential avatar diff --git a/src/discord/interactions/bridge.js b/discord/interactions/bridge.js similarity index 100% rename from src/discord/interactions/bridge.js rename to discord/interactions/bridge.js diff --git a/src/discord/interactions/invite.js b/discord/interactions/invite.js similarity index 100% rename from src/discord/interactions/invite.js rename to discord/interactions/invite.js diff --git a/src/discord/interactions/matrix-info.js b/discord/interactions/matrix-info.js similarity index 100% rename from src/discord/interactions/matrix-info.js rename to discord/interactions/matrix-info.js diff --git a/src/discord/interactions/permissions.js b/discord/interactions/permissions.js similarity index 100% rename from src/discord/interactions/permissions.js rename to discord/interactions/permissions.js diff --git a/src/discord/interactions/reactions.js b/discord/interactions/reactions.js similarity index 100% rename from src/discord/interactions/reactions.js rename to discord/interactions/reactions.js diff --git a/src/discord/register-interactions.js b/discord/register-interactions.js similarity index 98% rename from src/discord/register-interactions.js rename to discord/register-interactions.js index c66bef3..026ac7a 100644 --- a/src/discord/register-interactions.js +++ b/discord/register-interactions.js @@ -2,7 +2,7 @@ const DiscordTypes = require("discord-api-types/v10") const {discord, sync, db, select} = require("../passthrough") -const {id} = require("../../addbot") +const {id} = require("../addbot") const matrixInfo = sync.require("./interactions/matrix-info.js") const invite = sync.require("./interactions/invite.js") diff --git a/src/discord/utils.js b/discord/utils.js similarity index 100% rename from src/discord/utils.js rename to discord/utils.js diff --git a/src/discord/utils.test.js b/discord/utils.test.js similarity index 98% rename from src/discord/utils.test.js rename to discord/utils.test.js index 7c5f0c8..815c0a1 100644 --- a/src/discord/utils.test.js +++ b/discord/utils.test.js @@ -1,6 +1,6 @@ const DiscordTypes = require("discord-api-types/v10") const {test} = require("supertape") -const data = require("../../test/data") +const data = require("../test/data") const utils = require("./utils") test("is webhook message: identifies bot interaction response as not a message", t => { diff --git a/src/m2d/actions/add-reaction.js b/m2d/actions/add-reaction.js similarity index 100% rename from src/m2d/actions/add-reaction.js rename to m2d/actions/add-reaction.js diff --git a/src/m2d/actions/channel-webhook.js b/m2d/actions/channel-webhook.js similarity index 100% rename from src/m2d/actions/channel-webhook.js rename to m2d/actions/channel-webhook.js diff --git a/src/m2d/actions/emoji-sheet.js b/m2d/actions/emoji-sheet.js similarity index 100% rename from src/m2d/actions/emoji-sheet.js rename to m2d/actions/emoji-sheet.js diff --git a/src/m2d/actions/redact.js b/m2d/actions/redact.js similarity index 100% rename from src/m2d/actions/redact.js rename to m2d/actions/redact.js diff --git a/src/m2d/actions/send-event.js b/m2d/actions/send-event.js similarity index 100% rename from src/m2d/actions/send-event.js rename to m2d/actions/send-event.js diff --git a/src/m2d/converters/emoji-sheet.js b/m2d/converters/emoji-sheet.js similarity index 96% rename from src/m2d/converters/emoji-sheet.js rename to m2d/converters/emoji-sheet.js index db5b06f..4d9cc07 100644 --- a/src/m2d/converters/emoji-sheet.js +++ b/m2d/converters/emoji-sheet.js @@ -81,10 +81,9 @@ async function convertImageStream(streamIn, stopStream) { giframe.feed(chunk) }) const frame = await giframe.getFrame() - const pixels = Uint8Array.from(frame.pixels) stopStream() - const buffer = await sharp(pixels, {raw: {width: frame.width, height: frame.height, channels: 4}}) + const buffer = await sharp(frame.pixels, {raw: {width: frame.width, height: frame.height, channels: 4}}) .resize(SIZE, SIZE, {fit: "contain", background: {r: 0, g: 0, b: 0, alpha: 0}}) .png({compressionLevel: 0}) .toBuffer({resolveWithObject: true}) diff --git a/src/m2d/converters/emoji-sheet.test.js b/m2d/converters/emoji-sheet.test.js similarity index 100% rename from src/m2d/converters/emoji-sheet.test.js rename to m2d/converters/emoji-sheet.test.js diff --git a/src/m2d/converters/emoji.js b/m2d/converters/emoji.js similarity index 100% rename from src/m2d/converters/emoji.js rename to m2d/converters/emoji.js diff --git a/src/m2d/converters/event-to-message.js b/m2d/converters/event-to-message.js similarity index 99% rename from src/m2d/converters/event-to-message.js rename to m2d/converters/event-to-message.js index 76a32bc..5234755 100644 --- a/src/m2d/converters/event-to-message.js +++ b/m2d/converters/event-to-message.js @@ -15,8 +15,6 @@ const {sync, db, discord, select, from} = passthrough const mxUtils = sync.require("../converters/utils") /** @type {import("../../discord/utils")} */ const dUtils = sync.require("../../discord/utils") -/** @type {import("../../matrix/file")} */ -const file = sync.require("../../matrix/file") /** @type {import("./emoji-sheet")} */ const emojiSheet = sync.require("./emoji-sheet") diff --git a/src/m2d/converters/event-to-message.test.js b/m2d/converters/event-to-message.test.js similarity index 99% rename from src/m2d/converters/event-to-message.test.js rename to m2d/converters/event-to-message.test.js index b674845..d6a20cd 100644 --- a/src/m2d/converters/event-to-message.test.js +++ b/m2d/converters/event-to-message.test.js @@ -3,7 +3,7 @@ const fs = require("fs") const {test} = require("supertape") const {eventToMessage} = require("./event-to-message") const {convertImageStream} = require("./emoji-sheet") -const data = require("../../../test/data") +const data = require("../../test/data") const {MatrixServerError} = require("../../matrix/mreq") const {select, discord} = require("../../passthrough") diff --git a/src/m2d/converters/utils.js b/m2d/converters/utils.js similarity index 85% rename from src/m2d/converters/utils.js rename to m2d/converters/utils.js index c1f5f01..437b5c0 100644 --- a/src/m2d/converters/utils.js +++ b/m2d/converters/utils.js @@ -1,13 +1,8 @@ // @ts-check -const assert = require("assert").strict - -const passthrough = require("../../passthrough") -const {db} = passthrough - const {reg} = require("../../matrix/read-registration") const userRegex = reg.namespaces.users.map(u => new RegExp(u.regex)) - +const assert = require("assert").strict /** @type {import("xxhash-wasm").XXHashAPI} */ // @ts-ignore let hasher = null // @ts-ignore @@ -40,6 +35,16 @@ function eventSenderIsFromDiscord(sender) { return false } +/** + * @param {string} mxc + * @returns {string?} + */ +function getPublicUrlForMxc(mxc) { + const avatarURLParts = mxc?.match(/^mxc:\/\/([^/]+)\/(\w+)$/) + if (avatarURLParts) return `${reg.ooye.server_origin}/_matrix/media/r0/download/${avatarURLParts[1]}/${avatarURLParts[2]}` + else return null +} + /** * Event IDs are really big and have more entropy than we need. * If we want to store the event ID in the database, we can store a more compact version by hashing it with this. @@ -208,32 +213,6 @@ async function getViaServersQuery(roomID, api) { return qs } -/** - * Since the introduction of authenticated media, this can no longer just be the /_matrix/media/r0/download URL - * because Discord and Discord users cannot use those URLs. Media now has to be proxied through the bridge. - * To avoid the bridge acting as a proxy for *any* media, there is a list of permitted media stored in the database. - * (The other approach would be signing the URLs with a MAC (or similar) and adding the signature, but I'm not a - * cryptographer, so I don't want to.) To reduce database disk space usage, instead of storing each permitted URL, - * we just store its xxhash as a signed (as in +/-, not signature) 64-bit integer, which fits in an SQLite integer field. - * @see https://matrix.org/blog/2024/06/26/sunsetting-unauthenticated-media/ background - * @see https://matrix.org/blog/2024/06/20/matrix-v1.11-release/ implementation details - * @see https://www.sqlite.org/fileformat2.html#record_format SQLite integer field size - * @param {string} mxc - * @returns {string?} - */ -function getPublicUrlForMxc(mxc) { - assert(hasher, "xxhash is not ready yet") - const avatarURLParts = mxc?.match(/^mxc:\/\/([^/]+)\/(\w+)$/) - if (!avatarURLParts) return null - - const serverAndMediaID = `${avatarURLParts[1]}/${avatarURLParts[2]}` - const unsignedHash = hasher.h64(serverAndMediaID) - const signedHash = unsignedHash - 0x8000000000000000n // shifting down to signed 64-bit range - db.prepare("INSERT OR IGNORE INTO media_proxy (permitted_hash) VALUES (?)").run(signedHash) - - return `${reg.ooye.bridge_origin}/download/matrix/${serverAndMediaID}` -} - module.exports.BLOCK_ELEMENTS = BLOCK_ELEMENTS module.exports.eventSenderIsFromDiscord = eventSenderIsFromDiscord module.exports.getPublicUrlForMxc = getPublicUrlForMxc diff --git a/src/m2d/converters/utils.test.js b/m2d/converters/utils.test.js similarity index 100% rename from src/m2d/converters/utils.test.js rename to m2d/converters/utils.test.js diff --git a/src/m2d/event-dispatcher.js b/m2d/event-dispatcher.js similarity index 100% rename from src/m2d/event-dispatcher.js rename to m2d/event-dispatcher.js diff --git a/src/matrix/api.js b/matrix/api.js similarity index 100% rename from src/matrix/api.js rename to matrix/api.js diff --git a/src/matrix/api.test.js b/matrix/api.test.js similarity index 100% rename from src/matrix/api.test.js rename to matrix/api.test.js diff --git a/src/matrix/appservice.js b/matrix/appservice.js similarity index 100% rename from src/matrix/appservice.js rename to matrix/appservice.js diff --git a/src/matrix/file.js b/matrix/file.js similarity index 100% rename from src/matrix/file.js rename to matrix/file.js diff --git a/src/matrix/file.test.js b/matrix/file.test.js similarity index 100% rename from src/matrix/file.test.js rename to matrix/file.test.js diff --git a/src/matrix/kstate.js b/matrix/kstate.js similarity index 100% rename from src/matrix/kstate.js rename to matrix/kstate.js diff --git a/src/matrix/kstate.test.js b/matrix/kstate.test.js similarity index 100% rename from src/matrix/kstate.test.js rename to matrix/kstate.test.js diff --git a/src/matrix/matrix-command-handler.js b/matrix/matrix-command-handler.js similarity index 100% rename from src/matrix/matrix-command-handler.js rename to matrix/matrix-command-handler.js diff --git a/src/matrix/mreq.js b/matrix/mreq.js similarity index 100% rename from src/matrix/mreq.js rename to matrix/mreq.js diff --git a/src/matrix/power.js b/matrix/power.js similarity index 100% rename from src/matrix/power.js rename to matrix/power.js diff --git a/src/matrix/power.test.js b/matrix/power.test.js similarity index 100% rename from src/matrix/power.test.js rename to matrix/power.test.js diff --git a/src/matrix/read-registration.js b/matrix/read-registration.js similarity index 100% rename from src/matrix/read-registration.js rename to matrix/read-registration.js diff --git a/src/matrix/read-registration.test.js b/matrix/read-registration.test.js similarity index 100% rename from src/matrix/read-registration.test.js rename to matrix/read-registration.test.js diff --git a/src/matrix/txnid.js b/matrix/txnid.js similarity index 100% rename from src/matrix/txnid.js rename to matrix/txnid.js diff --git a/src/matrix/txnid.test.js b/matrix/txnid.test.js similarity index 100% rename from src/matrix/txnid.test.js rename to matrix/txnid.test.js diff --git a/package.json b/package.json index 8fccd08..8c800e1 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,6 @@ "addbot": "node addbot.js", "test": "cross-env FORCE_COLOR=true supertape --no-check-assertions-count --format tap test/test.js | tap-dot", "test-slow": "cross-env FORCE_COLOR=true supertape --no-check-assertions-count --format tap --no-worker test/test.js -- --slow | tap-dot", - "cover": "c8 -o test/coverage --skip-full -x db/migrations -x matrix/file.js -x matrix/api.js -x matrix/mreq.js -x d2m/converters/rlottie-wasm.js -r html -r text supertape --no-check-assertions-count --format fail --no-worker test/test.js -- --slow" + "cover": "c8 --skip-full -x db/migrations -x matrix/file.js -x matrix/api.js -x matrix/mreq.js -x d2m/converters/rlottie-wasm.js -r html -r text supertape --no-check-assertions-count --format fail --no-worker test/test.js -- --slow" } } diff --git a/src/passthrough.js b/passthrough.js similarity index 100% rename from src/passthrough.js rename to passthrough.js diff --git a/src/db/migrations/0013-media-proxy.sql b/src/db/migrations/0013-media-proxy.sql deleted file mode 100644 index d55f059..0000000 --- a/src/db/migrations/0013-media-proxy.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE "media_proxy" ( - "permitted_hash" INTEGER NOT NULL, - PRIMARY KEY("permitted_hash") -) WITHOUT ROWID; - -COMMIT; diff --git a/start.js b/start.js index d6bd4c9..1ece1dd 100644 --- a/start.js +++ b/start.js @@ -1,32 +1,32 @@ // @ts-check const sqlite = require("better-sqlite3") -const migrate = require("./src/db/migrate") +const migrate = require("./db/migrate") const HeatSync = require("heatsync") const config = require("./config") -const passthrough = require("./src/passthrough") -const db = new sqlite("src/db/ooye.db") +const passthrough = require("./passthrough") +const db = new sqlite("db/ooye.db") /** @type {import("heatsync").default} */ // @ts-ignore const sync = new HeatSync() Object.assign(passthrough, {config, sync, db}) -const DiscordClient = require("./src/d2m/discord-client") +const DiscordClient = require("./d2m/discord-client") const discord = new DiscordClient(config.discordToken, "full") passthrough.discord = discord -const {as} = require("./src/matrix/appservice") +const {as} = require("./matrix/appservice") passthrough.as = as -const orm = sync.require("./src/db/orm") +const orm = sync.require("./db/orm") passthrough.from = orm.from passthrough.select = orm.select -const power = require("./src/matrix/power.js") -sync.require("./src/m2d/event-dispatcher") +const power = require("./matrix/power.js") +sync.require("./m2d/event-dispatcher") ;(async () => { await migrate.migrate(db) @@ -34,5 +34,5 @@ sync.require("./src/m2d/event-dispatcher") console.log("Discord gateway started") await power.applyPower() - require("./src/stdin") + require("./stdin") })() diff --git a/src/stdin.js b/stdin.js similarity index 93% rename from src/stdin.js rename to stdin.js index cabd8ce..5e23f72 100644 --- a/src/stdin.js +++ b/stdin.js @@ -2,12 +2,12 @@ const repl = require("repl") const util = require("util") -const {addbot} = require("../addbot") +const {addbot} = require("./addbot") const passthrough = require("./passthrough") const {discord, config, sync, db} = passthrough -const data = sync.require("../test/data") +const data = sync.require("./test/data") const createSpace = sync.require("./d2m/actions/create-space") const createRoom = sync.require("./d2m/actions/create-room") const registerUser = sync.require("./d2m/actions/register-user") @@ -32,6 +32,7 @@ if (process.stdin.isTTY) { } else { Object.assign(passthrough.repl.context, extraContext) } + // @ts-expect-error Says exit isn't assignable to a string sync.addTemporaryListener(passthrough.repl, "exit", () => process.exit()) }) } diff --git a/test/test.js b/test/test.js index c898ad1..1941ea2 100644 --- a/test/test.js +++ b/test/test.js @@ -4,7 +4,7 @@ const fs = require("fs") const {join} = require("path") const stp = require("stream").promises const sqlite = require("better-sqlite3") -const migrate = require("../src/db/migrate") +const migrate = require("../db/migrate") const HeatSync = require("heatsync") const {test} = require("supertape") const data = require("./data") @@ -14,16 +14,15 @@ const fetch = require("node-fetch") const {green} = require("colorette") const config = require("../config") -const passthrough = require("../src/passthrough") +const passthrough = require("../passthrough") const db = new sqlite(":memory:") -const {reg} = require("../src/matrix/read-registration") +const {reg} = require("../matrix/read-registration") reg.ooye.server_origin = "https://matrix.cadence.moe" // so that tests will pass even when hard-coded reg.ooye.server_name = "cadence.moe" reg.id = "baby" // don't actually take authenticated actions on the server reg.as_token = "baby" reg.hs_token = "baby" -reg.ooye.bridge_origin = "https://bridge.example.org" reg.ooye.invite = [] const sync = new HeatSync({watchFS: false}) @@ -48,11 +47,11 @@ const discord = { Object.assign(passthrough, { discord, config, sync, db }) -const orm = sync.require("../src/db/orm") +const orm = sync.require("../db/orm") passthrough.from = orm.from passthrough.select = orm.select -const file = sync.require("../src/matrix/file") +const file = sync.require("../matrix/file") /* c8 ignore next */ file._actuallyUploadDiscordFileToMxc = function(url, res) { throw new Error(`Not allowed to upload files during testing.\nURL: ${url}`) } @@ -113,28 +112,28 @@ file._actuallyUploadDiscordFileToMxc = function(url, res) { throw new Error(`Not db.exec(fs.readFileSync(join(__dirname, "ooye-test-data.sql"), "utf8")) - require("../src/db/orm.test") - require("../src/discord/utils.test") - require("../src/matrix/kstate.test") - require("../src/matrix/api.test") - require("../src/matrix/file.test") - require("../src/matrix/power.test") - require("../src/matrix/read-registration.test") - require("../src/matrix/txnid.test") - require("../src/d2m/actions/create-room.test") - require("../src/d2m/actions/create-space.test") - require("../src/d2m/actions/register-user.test") - require("../src/d2m/converters/edit-to-changes.test") - require("../src/d2m/converters/emoji-to-key.test") - require("../src/d2m/converters/lottie.test") - require("../src/d2m/converters/message-to-event.test") - require("../src/d2m/converters/message-to-event.embeds.test") - require("../src/d2m/converters/message-to-event.pk.test") - require("../src/d2m/converters/pins-to-list.test") - require("../src/d2m/converters/remove-reaction.test") - require("../src/d2m/converters/thread-to-announcement.test") - require("../src/d2m/converters/user-to-mxid.test") - require("../src/m2d/converters/event-to-message.test") - require("../src/m2d/converters/utils.test") - require("../src/m2d/converters/emoji-sheet.test") + require("../db/orm.test") + require("../discord/utils.test") + require("../matrix/kstate.test") + require("../matrix/api.test") + require("../matrix/file.test") + //require("../matrix/power.test") + require("../matrix/read-registration.test") + require("../matrix/txnid.test") + require("../d2m/actions/create-room.test") + require("../d2m/actions/create-space.test") + require("../d2m/actions/register-user.test") + require("../d2m/converters/edit-to-changes.test") + require("../d2m/converters/emoji-to-key.test") + require("../d2m/converters/lottie.test") + require("../d2m/converters/message-to-event.test") + require("../d2m/converters/message-to-event.embeds.test") + require("../d2m/converters/message-to-event.pk.test") + require("../d2m/converters/pins-to-list.test") + require("../d2m/converters/remove-reaction.test") + require("../d2m/converters/thread-to-announcement.test") + require("../d2m/converters/user-to-mxid.test") + require("../m2d/converters/event-to-message.test") + require("../m2d/converters/utils.test") + require("../m2d/converters/emoji-sheet.test") })() diff --git a/src/types.d.ts b/types.d.ts similarity index 99% rename from src/types.d.ts rename to types.d.ts index 93bfc75..8eeda6c 100644 --- a/src/types.d.ts +++ b/types.d.ts @@ -21,7 +21,6 @@ export type AppServiceRegistrationConfig = { max_file_size: number server_name: string server_origin: string - bridge_origin: string content_length_workaround: boolean include_user_id_in_mxid: boolean invite: string[] diff --git a/src/types.js b/types.js similarity index 100% rename from src/types.js rename to types.js