From 90d5fee1736d6f636c42f23a8f1c02d0941b6b3d Mon Sep 17 00:00:00 2001 From: Timo Date: Mon, 27 Jan 2025 14:58:27 +0100 Subject: [PATCH] Add back pickRooms, readStateEvents and readRoomEvents Those methods got deprecated but are still used in the case where the widget does not define a `set` room and also does not pass the roomId of which room it wants to read the events from in the widget action. --- package.json | 2 +- src/stores/widgets/StopGapWidgetDriver.ts | 85 +++++++++++++++++++++++ yarn.lock | 21 ++++-- 3 files changed, 101 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index df4e0801d3..f3558745a8 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", - "matrix-widget-api": "^1.10.0", + "matrix-widget-api": "^1.13.0", "memoize-one": "^6.0.0", "mime": "^4.0.4", "oidc-client-ts": "^3.0.1", diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index 7f5affab0d..a53b63d8a6 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -27,6 +27,7 @@ import { ISearchUserDirectoryResult, IGetMediaConfigResult, UpdateDelayedEventAction, + Symbols, } from "matrix-widget-api"; import { ClientEvent, @@ -40,6 +41,7 @@ import { SendDelayedEventResponse, StateEvents, TimelineEvents, + Room, } from "matrix-js-sdk/src/matrix"; import { logger } from "matrix-js-sdk/src/logger"; import { @@ -711,4 +713,87 @@ export class StopGapWidgetDriver extends WidgetDriver { public processError(error: unknown): IWidgetApiErrorResponseDataDetails | undefined { return error instanceof MatrixError ? { matrix_api_error: error.asWidgetApiErrorData() } : undefined; } + + // DEPRECATED FOR BACKWARDS COMPATIBILITY + + /** + * Picks the rooms where the widget can read events from. If no ids are passed it will use the currently viewed room of EW to + * get the matrix room used for event reading. + * @param roomIds optional room ids. (this version of the api allows to not pass a room id. This is deprecated now. ) + * @returns The matrix room where the widget will get events from. + * @deprecated it is recommended to use: readRoomTimeline and readRoomState where an explicit room id is required. + */ + private pickRooms(roomIds?: (string | Symbols.AnyRoom)[]): Room[] { + const client = MatrixClientPeg.get(); + if (!client) throw new Error("Not attached to a client"); + + const targetRooms = roomIds + ? roomIds.includes(Symbols.AnyRoom) + ? client.getVisibleRooms(SettingsStore.getValue("feature_dynamic_room_predecessors")) + : roomIds.map((r) => client.getRoom(r)) + : [client.getRoom(SdkContextClass.instance.roomViewStore.getRoomId()!)]; + return targetRooms.filter((r) => !!r) as Room[]; + } + + /** + * Reads state events from the room. Uses the `pickRooms` method and hence has roomIds is optional. + * @deprecated it is recommended to use: `readRoomState` where an explicit room id is required. + */ + public async readStateEvents( + eventType: string, + stateKey: string | undefined, + limitPerRoom: number, + roomIds?: (string | Symbols.AnyRoom)[], + ): Promise { + limitPerRoom = limitPerRoom > 0 ? Math.min(limitPerRoom, Number.MAX_SAFE_INTEGER) : Number.MAX_SAFE_INTEGER; // relatively arbitrary + + const rooms = this.pickRooms(roomIds); + const allResults: IRoomEvent[] = []; + for (const room of rooms) { + const results: MatrixEvent[] = []; + const state = room.currentState.events.get(eventType); + if (state) { + if (stateKey === "" || !!stateKey) { + const forKey = state.get(stateKey); + if (forKey) results.push(forKey); + } else { + results.push(...Array.from(state.values())); + } + } + + results.slice(0, limitPerRoom).forEach((e) => allResults.push(e.getEffectiveEvent() as IRoomEvent)); + } + return allResults; + } + + /** + * Reads timeline events from the room. Uses the `pickRooms` method and hence has roomIds is optional. + * @deprecated it is recommended to use: `readRoomTimeline` where an explicit room id is required. + */ + public async readRoomEvents( + eventType: string, + msgtype: string | undefined, + limitPerRoom: number, + roomIds?: (string | Symbols.AnyRoom)[], + ): Promise { + limitPerRoom = limitPerRoom > 0 ? Math.min(limitPerRoom, Number.MAX_SAFE_INTEGER) : Number.MAX_SAFE_INTEGER; // relatively arbitrary + + const rooms = this.pickRooms(roomIds); + const allResults: IRoomEvent[] = []; + for (const room of rooms) { + const results: MatrixEvent[] = []; + const events = room.getLiveTimeline().getEvents(); // timelines are most recent last + for (let i = events.length - 1; i > 0; i--) { + if (results.length >= limitPerRoom) break; + + const ev = events[i]; + if (ev.getType() !== eventType || ev.isState()) continue; + if (eventType === EventType.RoomMessage && msgtype && msgtype !== ev.getContent()["msgtype"]) continue; + results.push(ev); + } + + results.forEach((e) => allResults.push(e.getEffectiveEvent() as IRoomEvent)); + } + return allResults; + } } diff --git a/yarn.lock b/yarn.lock index 6e44e5c0b6..044fdf5c90 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3483,15 +3483,16 @@ ts-xor "^1.3.0" vaul "^1.0.0" -"@vector-im/matrix-wysiwyg-wasm@link:../../../.cache/yarn/v6/npm-@vector-im-matrix-wysiwyg-2.38.0-af862ffd231dc0a6b8d6f2cb3601e68456c0ff24-integrity/node_modules/bindings/wysiwyg-wasm": +"@vector-im/matrix-wysiwyg-wasm@link:../../.cache/yarn/v6/npm-@vector-im-matrix-wysiwyg-2.38.0-af862ffd231dc0a6b8d6f2cb3601e68456c0ff24-integrity/node_modules/bindings/wysiwyg-wasm": version "0.0.0" + uid "" "@vector-im/matrix-wysiwyg@2.38.0": version "2.38.0" resolved "https://registry.yarnpkg.com/@vector-im/matrix-wysiwyg/-/matrix-wysiwyg-2.38.0.tgz#af862ffd231dc0a6b8d6f2cb3601e68456c0ff24" integrity sha512-cMEVicFYVzFxuSyWON0aVGjAJMcgJZ+LxuLTEp8EGuu8cRacuh0RN5rapb11YVZygzFvE7X1cMedJ/fKd5vRLA== dependencies: - "@vector-im/matrix-wysiwyg-wasm" "link:../../../.cache/yarn/v6/npm-@vector-im-matrix-wysiwyg-2.38.0-af862ffd231dc0a6b8d6f2cb3601e68456c0ff24-integrity/node_modules/bindings/wysiwyg-wasm" + "@vector-im/matrix-wysiwyg-wasm" "link:../../.cache/yarn/v6/npm-@vector-im-matrix-wysiwyg-2.38.0-af862ffd231dc0a6b8d6f2cb3601e68456c0ff24-integrity/node_modules/bindings/wysiwyg-wasm" "@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" @@ -8657,7 +8658,7 @@ matrix-events-sdk@0.0.1: "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "36.0.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/07f97d724f755a131571511af6662d4e3b345728" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/161da0597201dc3eb6870bc7e8b702948ba856e5" dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^12.1.0" @@ -8694,6 +8695,14 @@ matrix-widget-api@^1.10.0: "@types/events" "^3.0.0" events "^3.2.0" +matrix-widget-api@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/matrix-widget-api/-/matrix-widget-api-1.13.0.tgz#40344b264b08d6d98ab9d547a41eb74dd6d8c3f7" + integrity sha512-+LrvwkR1izL4h2euX8PDrvG/3PZZDEd6As+lmnR3jAVwbFJtU5iTnwmZGnCca9ddngCvXvAHkcpJBEPyPTZneQ== + dependencies: + "@types/events" "^3.0.0" + events "^3.2.0" + mdn-data@2.0.28: version "2.0.28" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" @@ -10970,9 +10979,9 @@ schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0: ajv-keywords "^5.1.0" sdp-transform@^2.14.1: - version "2.14.2" - resolved "https://registry.yarnpkg.com/sdp-transform/-/sdp-transform-2.14.2.tgz#d2cee6a1f7abe44e6332ac6cbb94e8600f32d813" - integrity sha512-icY6jVao7MfKCieyo1AyxFYm1baiM+fA00qW/KrNNVlkxHAd34riEKuEkUe4bBb3gJwLJZM+xT60Yj1QL8rHiA== + version "2.15.0" + resolved "https://registry.yarnpkg.com/sdp-transform/-/sdp-transform-2.15.0.tgz#79d37a2481916f36a0534e07b32ceaa87f71df42" + integrity sha512-KrOH82c/W+GYQ0LHqtr3caRpM3ITglq3ljGUIb8LTki7ByacJZ9z+piSGiwZDsRyhQbYBOBJgr2k6X4BZXi3Kw== seedrandom@^3.0.5: version "3.0.5"