diff --git a/jsconfig.json b/jsconfig.json deleted file mode 100644 index 4106061..0000000 --- a/jsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "target": "es2024", - "module": "nodenext", - "strict": true, - "noImplicitAny": false, - "useUnknownInCatchVariables": false - } -} diff --git a/src/d2m/converters/message-to-event.js b/src/d2m/converters/message-to-event.js index 93e120e..30a20fe 100644 --- a/src/d2m/converters/message-to-event.js +++ b/src/d2m/converters/message-to-event.js @@ -207,7 +207,6 @@ async function attachmentToEvent(mentions, attachment) { * - alwaysReturnFormattedBody: false - formatted_body will be skipped if it is the same as body because the message is plaintext. if you want the formatted_body to be returned anyway, for example to merge it with another message, then set this to true. * - scanTextForMentions: true - needs to be set to false when converting forwarded messages etc which may be from a different channel that can't be scanned. * @param {{api: import("../../matrix/api"), snow?: import("snowtransfer").SnowTransfer}} di simple-as-nails dependency injection for the matrix API - * @returns {Promise<{$type: string, $sender?: string, [x: string]: any}[]>} */ async function messageToEvent(message, guild, options = {}, di) { const events = [] diff --git a/src/matrix/api.js b/src/matrix/api.js index edffc45..709d70c 100644 --- a/src/matrix/api.js +++ b/src/matrix/api.js @@ -22,11 +22,7 @@ function path(p, mxid, otherParams = {}) { const u = new URL(p, "http://localhost") if (mxid) u.searchParams.set("user_id", mxid) for (const entry of Object.entries(otherParams)) { - if (Array.isArray(entry[1])) { - for (const element of entry[1]) { - u.searchParams.append(entry[0], element) - } - } else if (entry[1] != undefined) { + if (entry[1] != undefined) { u.searchParams.set(entry[0], entry[1]) } } @@ -66,14 +62,11 @@ async function createRoom(content) { } /** - * @param {string} roomIDOrAlias - * @param {string?} [mxid] - * @param {string[]?} [via] * @returns {Promise} room ID */ -async function joinRoom(roomIDOrAlias, mxid, via) { +async function joinRoom(roomIDOrAlias, mxid) { /** @type {Ty.R.RoomJoined} */ - const root = await mreq.mreq("POST", path(`/client/v3/join/${roomIDOrAlias}`, mxid, {via}), {}) + const root = await mreq.mreq("POST", path(`/client/v3/join/${roomIDOrAlias}`, mxid), {}) return root.room_id } diff --git a/src/types.d.ts b/src/types.d.ts index c7cb006..27dfddf 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -149,14 +149,6 @@ export namespace Event { prev_content?: any } - export type StrippedChildStateEvent = { - type: string - state_key: string - sender: string - origin_server_ts: number - content: any - } - export type M_Room_Message = { msgtype: "m.text" | "m.emote" body: string @@ -353,7 +345,7 @@ export namespace R { export type Hierarchy = { avatar_url?: string canonical_alias?: string - children_state: Event.StrippedChildStateEvent[] + children_state: {} guest_can_join: boolean join_rule?: string name?: string diff --git a/src/web/routes/link.js b/src/web/routes/link.js index 4698dfe..9ca62b7 100644 --- a/src/web/routes/link.js +++ b/src/web/routes/link.js @@ -133,15 +133,11 @@ as.router.post("/api/link-space", defineEventHandler(async event => { const existing = select("guild_space", "guild_id", {}, "WHERE guild_id = ? OR space_id = ?").get(guildID, spaceID) if (existing) throw createError({status: 400, message: "Bad Request", data: `Guild ID ${guildID} or space ID ${spaceID} are already bridged and cannot be reused`}) - const inviteSender = select("invite", "mxid", {mxid: session.data.mxid, room_id: spaceID}).pluck().get() - const inviteSenderServer = inviteSender?.match(/:(.*)/)?.[1] - const via = [inviteSenderServer || ""] - // Check space exists and bridge is joined try { - await api.joinRoom(parsedBody.space_id, null, via) + await api.joinRoom(parsedBody.space_id) } catch (e) { - throw createError({status: 400, message: "Unable To Join", data: `Unable to join the requested Matrix space. Please invite the bridge to the space and try again. (Server said: ${e.errcode} - ${e.message})`}) + throw createError({status: 403, message: e.errcode, data: `${e.errcode} - ${e.message}`}) } // Check bridge has PL 100 @@ -189,33 +185,19 @@ as.router.post("/api/link", defineEventHandler(async event => { if (row) throw createError({status: 400, message: "Bad Request", data: `Channel ID ${row.channel_id} or room ID ${parsedBody.matrix} are already bridged and cannot be reused`}) // Check room is part of the guild's space - let foundRoom = false - /** @type {string[]?} */ - let foundVia = null + let found = false for await (const room of api.generateFullHierarchy(spaceID)) { - // When finding a space during iteration, look at space's children state, because we need a `via` to join the room (when we find it later) - for (const state of room.children_state) { - if (state.type === "m.space.child" && state.state_key === parsedBody.matrix) { - foundVia = state.content.via - } - } - - // When finding a room during iteration, see if it was the requested room (to confirm that the room is in the space) if (room.room_id === parsedBody.matrix && !room.room_type) { - foundRoom = true + found = true + break } - - if (foundRoom && foundVia) break } - if (!foundRoom) throw createError({status: 400, message: "Bad Request", data: "Matrix room needs to be part of the bridged space"}) + if (!found) throw createError({status: 400, message: "Bad Request", data: "Matrix room needs to be part of the bridged space"}) // Check room exists and bridge is joined try { - await api.joinRoom(parsedBody.matrix, null, foundVia) + await api.joinRoom(parsedBody.matrix) } catch (e) { - if (!foundVia) { - throw createError({status: 400, message: "Unable To Join", data: `Unable to join the requested Matrix room. Please invite the bridge to the room and try again. (Server said: ${e.errcode} - ${e.message})`}) - } throw createError({status: 403, message: e.errcode, data: `${e.errcode} - ${e.message}`}) } diff --git a/src/web/routes/link.test.js b/src/web/routes/link.test.js index 4b29891..65f8b11 100644 --- a/src/web/routes/link.test.js +++ b/src/web/routes/link.test.js @@ -77,7 +77,7 @@ test("web link space: check that OOYE is joined", async t => { } } })) - t.equal(error.data, "Unable to join the requested Matrix space. Please invite the bridge to the space and try again. (Server said: M_FORBIDDEN - not allowed to join I guess)") + t.equal(error.data, "M_FORBIDDEN - not allowed to join I guess") t.equal(called, 1) }) @@ -360,7 +360,7 @@ test("web link room: check that room is part of space (not in hierarchy)", async t.equal(called, 1) }) -test("web link room: check that bridge can join room (notices lack of via and asks for invite instead)", async t => { +test("web link room: check that bridge can join room", async t => { let called = 0 const [error] = await tryToCatch(() => router.test("post", "/api/link", { sessionData: { @@ -381,55 +381,7 @@ test("web link room: check that bridge can join room (notices lack of via and as t.equal(spaceID, "!zTMspHVUBhFLLSdmnS:cadence.moe") yield { room_id: "!NDbIqNpJyPvfKRnNcr:cadence.moe", - children_state: [], - guest_can_join: false, - num_joined_members: 2 - } - /* c8 ignore next */ - } - } - })) - t.equal(error.data, "Unable to join the requested Matrix room. Please invite the bridge to the room and try again. (Server said: M_FORBIDDEN - not allowed to join I guess)") - t.equal(called, 2) -}) - -test("web link room: check that bridge can join room (uses via for join attempt)", async t => { - let called = 0 - const [error] = await tryToCatch(() => router.test("post", "/api/link", { - sessionData: { - managedGuilds: ["665289423482519565"] - }, - body: { - discord: "665310973967597573", - matrix: "!NDbIqNpJyPvfKRnNcr:cadence.moe", - guild_id: "665289423482519565" - }, - api: { - async joinRoom(roomID, _, via) { - called++ - t.deepEqual(via, ["cadence.moe", "hashi.re"]) - throw new MatrixServerError({errcode: "M_FORBIDDEN", error: "not allowed to join I guess"}) - }, - async *generateFullHierarchy(spaceID) { - called++ - t.equal(spaceID, "!zTMspHVUBhFLLSdmnS:cadence.moe") - yield { - room_id: "!NDbIqNpJyPvfKRnNcr:cadence.moe", - children_state: [], - guest_can_join: false, - num_joined_members: 2 - } - yield { - room_id: "!zTMspHVUBhFLLSdmnS:cadence.moe", - children_state: [{ - type: "m.space.child", - state_key: "!NDbIqNpJyPvfKRnNcr:cadence.moe", - sender: "@elliu:hashi.re", - content: { - via: ["cadence.moe", "hashi.re"] - }, - origin_server_ts: 0 - }], + children_state: {}, guest_can_join: false, num_joined_members: 2 } @@ -462,7 +414,7 @@ test("web link room: check that bridge has PL 100 in target room (event missing) t.equal(spaceID, "!zTMspHVUBhFLLSdmnS:cadence.moe") yield { room_id: "!NDbIqNpJyPvfKRnNcr:cadence.moe", - children_state: [], + children_state: {}, guest_can_join: false, num_joined_members: 2 } @@ -502,7 +454,7 @@ test("web link room: check that bridge has PL 100 in target room (users default) t.equal(spaceID, "!zTMspHVUBhFLLSdmnS:cadence.moe") yield { room_id: "!NDbIqNpJyPvfKRnNcr:cadence.moe", - children_state: [], + children_state: {}, guest_can_join: false, num_joined_members: 2 } @@ -542,7 +494,7 @@ test("web link room: successfully calls createRoom", async t => { t.equal(spaceID, "!zTMspHVUBhFLLSdmnS:cadence.moe") yield { room_id: "!NDbIqNpJyPvfKRnNcr:cadence.moe", - children_state: [], + children_state: {}, guest_can_join: false, num_joined_members: 2 }