From 496349078b14e8990d0f15e47f4f959ae7932d9c Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Thu, 19 Dec 2019 11:26:21 +0000 Subject: [PATCH] [Archive] Fix requesting archive --- lib/src/Client.dart | 46 +++++++++++++++++++++++++++---- test/Client_test.dart | 16 +++++++---- test/FakeMatrixApi.dart | 60 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 110 insertions(+), 12 deletions(-) diff --git a/lib/src/Client.dart b/lib/src/Client.dart index 20d5df2..b61884b 100644 --- a/lib/src/Client.dart +++ b/lib/src/Client.dart @@ -24,6 +24,7 @@ import 'dart:async'; import 'dart:core'; +import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/src/AccountData.dart'; import 'package:famedlysdk/src/Presence.dart'; import 'package:famedlysdk/src/StoreAPI.dart'; @@ -34,6 +35,7 @@ import 'Connection.dart'; import 'Room.dart'; import 'RoomList.dart'; //import 'Store.dart'; +import 'RoomState.dart'; import 'User.dart'; import 'requests/SetPushersRequest.dart'; import 'responses/ErrorResponse.dart'; @@ -286,14 +288,48 @@ class Client { rooms: rooms); } - Future get archive async { - RoomList archiveList = RoomList(client: this, rooms: [], onlyLeft: true); + Future> get archive async { + List archiveList = []; String syncFilters = - '{"room":{"include_leave":true,"timeline":{"limit":1}}}'; + '{"room":{"include_leave":true,"timeline":{"limit":10}}}'; String action = "/client/r0/sync?filter=$syncFilters&timeout=0"; - final syncResp = + final sync = await connection.jsonRequest(type: HTTPType.GET, action: action); - if (!(syncResp is ErrorResponse)) await connection.handleSync(syncResp); + if (!(sync is ErrorResponse) && + sync["rooms"]["leave"] is Map) { + for (var entry in sync["rooms"]["leave"].entries) { + final String id = entry.key; + final dynamic room = entry.value; + print(id); + print(room.toString()); + Room leftRoom = Room( + id: id, + membership: Membership.leave, + client: this, + roomAccountData: {}, + mHeroes: []); + if (room["account_data"] is Map && + room["account_data"]["events"] is List) { + for (dynamic event in room["account_data"]["events"]) { + leftRoom.roomAccountData[event["type"]] = + RoomAccountData.fromJson(event, leftRoom); + } + } + if (room["timeline"] is Map && + room["timeline"]["events"] is List) { + for (dynamic event in room["timeline"]["events"]) { + leftRoom.setState(RoomState.fromJson(event, leftRoom)); + } + } + if (room["state"] is Map && + room["state"]["events"] is List) { + for (dynamic event in room["state"]["events"]) { + leftRoom.setState(RoomState.fromJson(event, leftRoom)); + } + } + archiveList.add(leftRoom); + } + } return archiveList; } diff --git a/test/Client_test.dart b/test/Client_test.dart index 3e1d74e..d646ff5 100644 --- a/test/Client_test.dart +++ b/test/Client_test.dart @@ -27,7 +27,7 @@ import 'package:famedlysdk/src/AccountData.dart'; import 'package:famedlysdk/src/Client.dart'; import 'package:famedlysdk/src/Connection.dart'; import 'package:famedlysdk/src/Presence.dart'; -import 'package:famedlysdk/src/RoomList.dart'; +import 'package:famedlysdk/src/Room.dart'; import 'package:famedlysdk/src/User.dart'; import 'package:famedlysdk/src/requests/SetPushersRequest.dart'; import 'package:famedlysdk/src/responses/ErrorResponse.dart'; @@ -363,12 +363,18 @@ void main() { }); test('get archive', () async { - RoomList archive = await matrix.archive; + List archive = await matrix.archive; await new Future.delayed(new Duration(milliseconds: 50)); - expect(archive.rooms.length, 1); - expect(archive.rooms[0].id, "!5345234234:example.com"); - expect(archive.rooms[0].membership, Membership.leave); + expect(archive.length, 2); + expect(archive[0].id, "!5345234234:example.com"); + expect(archive[0].membership, Membership.leave); + expect(archive[0].name, "The room name"); + expect(archive[0].lastMessage, "This is an example text message"); + expect(archive[0].roomAccountData.length, 1); + expect(archive[1].id, "!5345234235:example.com"); + expect(archive[1].membership, Membership.leave); + expect(archive[1].name, "The room name 2"); }); test('getProfileFromUserId', () async { diff --git a/test/FakeMatrixApi.dart b/test/FakeMatrixApi.dart index ea3e275..745c0e6 100644 --- a/test/FakeMatrixApi.dart +++ b/test/FakeMatrixApi.dart @@ -393,7 +393,63 @@ class FakeMatrixApi extends MockClient { "invite": {}, "leave": { "!5345234234:example.com": { - "timeline": {"events": []} + "timeline": { + "events": [ + { + "content": { + "body": "This is an example text message", + "msgtype": "m.text", + "format": "org.matrix.custom.html", + "formatted_body": "This is an example text message" + }, + "type": "m.room.message", + "event_id": "143273582443PhrSn:example.org", + "room_id": "!5345234234:example.com", + "sender": "@example:example.org", + "origin_server_ts": 1432735824653, + "unsigned": {"age": 1234} + }, + ] + }, + "state": { + "events": [ + { + "content": {"name": "The room name"}, + "type": "m.room.name", + "event_id": "2143273582443PhrSn:example.org", + "room_id": "!5345234234:example.com", + "sender": "@example:example.org", + "origin_server_ts": 1432735824653, + "unsigned": {"age": 1234}, + "state_key": "" + }, + ] + }, + "account_data": { + "events": [ + { + "type": "test.type.data", + "content": {"foo": "bar"}, + }, + ], + }, + }, + "!5345234235:example.com": { + "timeline": {"events": []}, + "state": { + "events": [ + { + "content": {"name": "The room name 2"}, + "type": "m.room.name", + "event_id": "2143273582443PhrSn:example.org", + "room_id": "!5345234235:example.com", + "sender": "@example:example.org", + "origin_server_ts": 1432735824653, + "unsigned": {"age": 1234}, + "state_key": "" + }, + ] + } }, }, } @@ -680,7 +736,7 @@ class FakeMatrixApi extends MockClient { ] } }, - "/client/r0/sync?filter=%7B%22room%22:%7B%22include_leave%22:true,%22timeline%22:%7B%22limit%22:1%7D%7D%7D&timeout=0": + "/client/r0/sync?filter=%7B%22room%22:%7B%22include_leave%22:true,%22timeline%22:%7B%22limit%22:10%7D%7D%7D&timeout=0": (var req) => archiveSyncResponse, "/client/r0/sync?filter=%7B%22room%22:%7B%22state%22:%7B%22lazy_load_members%22:true%7D%7D%7D": (var req) => syncResponse,