diff --git a/src/MatrixClient.ts b/src/MatrixClient.ts index dbef443d..b7e303ff 100644 --- a/src/MatrixClient.ts +++ b/src/MatrixClient.ts @@ -827,19 +827,18 @@ export class MatrixClient extends EventEmitter { for (const event of room['timeline']['events']) { if (event['type'] !== 'm.room.member') continue; if (event['state_key'] !== await this.getUserId()) continue; - - const membership = event["content"]?.["membership"]; - if (membership !== "leave" && membership !== "ban") continue; - - const oldAge = leaveEvent && leaveEvent['unsigned'] && leaveEvent['unsigned']['age'] ? leaveEvent['unsigned']['age'] : 0; - const newAge = event['unsigned'] && event['unsigned']['age'] ? event['unsigned']['age'] : 0; - if (leaveEvent && oldAge < newAge) continue; - - leaveEvent = event; + switch (event["content"]?.["membership"]) { + case "leave": + case "ban": { + const oldAge = leaveEvent && leaveEvent['unsigned'] && leaveEvent['unsigned']['age'] ? leaveEvent['unsigned']['age'] : 0; + const newAge = event['unsigned'] && event['unsigned']['age'] ? event['unsigned']['age'] : 0; + if (leaveEvent && oldAge < newAge) continue; + leaveEvent = event; + } + } } - if (!leaveEvent) { - LogService.warn("MatrixClientLite", "Left room " + roomId + " without receiving an event"); + LogService.error("MatrixClientLite", "Left room " + roomId + " without receiving an event"); continue; } diff --git a/test/MatrixClientTest.ts b/test/MatrixClientTest.ts index 377d9ad1..6bc6b376 100644 --- a/test/MatrixClientTest.ts +++ b/test/MatrixClientTest.ts @@ -1457,6 +1457,35 @@ describe('MatrixClient', () => { expect(spy.callCount).toBe(1); }); + it('should process banned rooms as left rooms', async () => { + const { client: realClient } = createTestClient(); + const client = (realClient); + + const userId = "@syncing:example.org"; + const roomId = "!testing:example.org"; + const events = [ + { + type: "m.room.member", + state_key: userId, + unsigned: { age: 0 }, + content: { membership: "ban" }, + }, + ]; + + client.userId = userId; + + const spy = simple.stub().callFn((rid, ev) => { + expect(ev).toMatchObject(events[0]); + expect(rid).toEqual(roomId); + }); + realClient.on("room.leave", spy); + + const roomsObj = {}; + roomsObj[roomId] = { timeline: { events: events } }; + await client.processSync({ rooms: { leave: roomsObj } }); + expect(spy.callCount).toBe(1); + }); + it('should process left rooms account data', async () => { const { client: realClient } = createTestClient(); const client = (realClient);