From 053dddb76d829b29d3a8aeba8aba826d0bc99336 Mon Sep 17 00:00:00 2001 From: The one with the braid Date: Fri, 22 Sep 2023 09:42:07 +0200 Subject: [PATCH] chore: incrementally add left rooms to archive - store left rooms in archive during sync (as well as they are removed on join already) - refactor room archive code - fix typo Internal reference: SMC-385 Signed-off-by: The one with the braid --- lib/src/client.dart | 117 ++++++++++++++++++++++++-------------------- 1 file changed, 64 insertions(+), 53 deletions(-) diff --git a/lib/src/client.dart b/lib/src/client.dart index 23fa4769..61470a12 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -261,7 +261,7 @@ class Client extends MatrixApi { bool enableDehydratedDevices = false; - /// Wether read receipts are sent as public receipts by default or just as private receipts. + /// Whether read receipts are sent as public receipts by default or just as private receipts. bool receiptsPublicByDefault = true; /// Whether this client supports end-to-end encryption using olm. @@ -933,60 +933,66 @@ class Client extends MatrixApi { final leave = syncResp.rooms?.leave; if (leave != null) { for (final entry in leave.entries) { - final id = entry.key; - final room = entry.value; - final leftRoom = Room( - id: id, - membership: Membership.leave, - client: this, - roomAccountData: - room.accountData?.asMap().map((k, v) => MapEntry(v.type, v)) ?? - {}, - ); - - final timeline = Timeline( - room: leftRoom, - chunk: TimelineChunk( - events: room.timeline?.events?.reversed - .toList() // we display the event in the other sence - .map((e) => Event.fromMatrixEvent(e, leftRoom)) - .toList() ?? - [])); - - leftRoom.prev_batch = room.timeline?.prevBatch; - room.state?.forEach((event) { - leftRoom.setState(Event.fromMatrixEvent( - event, - leftRoom, - )); - }); - - room.timeline?.events?.forEach((event) { - leftRoom.setState(Event.fromMatrixEvent( - event, - leftRoom, - )); - }); - - for (var i = 0; i < timeline.events.length; i++) { - // Try to decrypt encrypted events but don't update the database. - if (leftRoom.encrypted && leftRoom.client.encryptionEnabled) { - if (timeline.events[i].type == EventTypes.Encrypted) { - timeline.events[i] = - await leftRoom.client.encryption!.decryptRoomEvent( - leftRoom.id, - timeline.events[i], - ); - } - } - } - - _archivedRooms.add(ArchivedRoom(room: leftRoom, timeline: timeline)); + await _storeArchivedRoom(entry.key, entry.value); } } return _archivedRooms; } + Future _storeArchivedRoom(String id, LeftRoomUpdate update) async { + final room = update; + final leftRoom = Room( + id: id, + membership: Membership.leave, + client: this, + roomAccountData: + room.accountData?.asMap().map((k, v) => MapEntry(v.type, v)) ?? + {}, + ); + + final timeline = Timeline( + room: leftRoom, + chunk: TimelineChunk( + events: room.timeline?.events?.reversed + .toList() // we display the event in the other sence + .map((e) => Event.fromMatrixEvent(e, leftRoom)) + .toList() ?? + [])); + + leftRoom.prev_batch = room.timeline?.prevBatch; + room.state?.forEach((event) { + leftRoom.setState(Event.fromMatrixEvent( + event, + leftRoom, + )); + }); + + room.timeline?.events?.forEach((event) { + leftRoom.setState(Event.fromMatrixEvent( + event, + leftRoom, + )); + }); + + for (var i = 0; i < timeline.events.length; i++) { + // Try to decrypt encrypted events but don't update the database. + if (leftRoom.encrypted && leftRoom.client.encryptionEnabled) { + if (timeline.events[i].type == EventTypes.Encrypted) { + await leftRoom.client.encryption! + .decryptRoomEvent( + leftRoom.id, + timeline.events[i], + ) + .then( + (decrypted) => timeline.events[i] = decrypted, + ); + } + } + } + + _archivedRooms.add(ArchivedRoom(room: leftRoom, timeline: timeline)); + } + /// Uploads a file and automatically caches it in the database, if it is small enough /// and returns the mxc url. @override @@ -1885,7 +1891,7 @@ class Client extends MatrixApi { final syncRoomUpdate = entry.value; await database?.storeRoomUpdate(id, syncRoomUpdate, this); - final room = _updateRoomsByRoomUpdate(id, syncRoomUpdate); + final room = await _updateRoomsByRoomUpdate(id, syncRoomUpdate); final timelineUpdateType = direction != null ? (direction == Direction.b @@ -2125,7 +2131,8 @@ class Client extends MatrixApi { } } - Room _updateRoomsByRoomUpdate(String roomId, SyncRoomUpdate chatUpdate) { + Future _updateRoomsByRoomUpdate( + String roomId, SyncRoomUpdate chatUpdate) async { // Update the chat list item. // Search the room in the rooms final roomIndex = rooms.indexWhere((r) => r.id == roomId); @@ -2169,7 +2176,7 @@ class Client extends MatrixApi { rooms.removeAt(roomIndex); } - // Update notification, highlight count and/or additional informations + // Update notification, highlight count and/or additional information else if (found && chatUpdate is JoinedRoomUpdate && (rooms[roomIndex].membership != membership || @@ -2202,6 +2209,10 @@ class Client extends MatrixApi { runInRoot(rooms[roomIndex].requestHistory); } } + // in order to keep the archive in sync, add left room to archive + if (chatUpdate is LeftRoomUpdate) { + await _storeArchivedRoom(room.id, chatUpdate); + } return room; }