From 0823473bdf5b7dade05078d35c5956625d012031 Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 11 Jul 2019 22:17:40 +0200 Subject: [PATCH 1/2] [Event] load reply event when loading timeline [Room] load creator user [Timeline] fix sendUser not being passed, fix stateKeyUser not being resolved Took 46 minutes --- lib/src/Event.dart | 9 +++++++-- lib/src/Room.dart | 31 +++++++++++++++++++++++++++---- lib/src/Timeline.dart | 38 +++++++++++++++++++++++++++++++++----- pubspec.lock | 10 +++++----- 4 files changed, 72 insertions(+), 16 deletions(-) diff --git a/lib/src/Event.dart b/lib/src/Event.dart index cbf7b6b..4c06f7f 100644 --- a/lib/src/Event.dart +++ b/lib/src/Event.dart @@ -22,11 +22,13 @@ */ import 'dart:convert'; + +import 'package:famedlysdk/src/Client.dart'; import 'package:famedlysdk/src/sync/EventUpdate.dart'; import 'package:famedlysdk/src/utils/ChatTime.dart'; -import 'package:famedlysdk/src/Client.dart'; -import './User.dart'; + import './Room.dart'; +import './User.dart'; /// A single Matrix event, e.g. a message in a chat. class Event { @@ -48,6 +50,8 @@ class Event { /// The type of this event. Mostly this is 'timeline'. final String environment; + Event replyEvent; + /// The status of this event. /// -1=ERROR /// 0=SENDING @@ -67,6 +71,7 @@ class Event { this.status = 2, this.environment, this.content, + this.replyEvent, }); /// Returns the body of this event if it has a body. diff --git a/lib/src/Room.dart b/lib/src/Room.dart index be7291b..0e82768 100644 --- a/lib/src/Room.dart +++ b/lib/src/Room.dart @@ -22,11 +22,12 @@ */ import 'package:famedlysdk/src/Client.dart'; -import 'package:famedlysdk/src/utils/ChatTime.dart'; -import 'package:famedlysdk/src/utils/MxContent.dart'; +import 'package:famedlysdk/src/Event.dart'; import 'package:famedlysdk/src/responses/ErrorResponse.dart'; import 'package:famedlysdk/src/sync/EventUpdate.dart'; -import 'package:famedlysdk/src/Event.dart'; +import 'package:famedlysdk/src/utils/ChatTime.dart'; +import 'package:famedlysdk/src/utils/MxContent.dart'; + import './User.dart'; import 'Timeline.dart'; @@ -86,6 +87,9 @@ class Room { Event lastEvent; + // The user who created the room based on m.create events + User creator; + /// Your current client instance. final Client client; @@ -118,6 +122,7 @@ class Room { this.joinRules, this.powerLevels, this.lastEvent, + this.creator, this.client, }); @@ -365,6 +370,13 @@ class Room { return resp; } + /// Load the creator event of this room + Future getCreatorEvent(Client matrix) async { + List events = await this.loadEvents(); + return events.firstWhere((event) => event.type == EventTypes.RoomCreate, + orElse: null); + } + /// Returns a Room from a json String which comes normally from the store. static Future getRoomFromTableRow( Map row, Client matrix) async { @@ -376,7 +388,7 @@ class Room { if (avatarUrl == "") avatarUrl = await matrix.store?.getAvatarFromSingleChat(row["id"]) ?? ""; - return Room( + Room room = Room( id: row["id"], name: name, membership: row["membership"], @@ -411,6 +423,17 @@ class Room { lastEvent: Event.fromJson(row, null), client: matrix, ); + + // Lets get the creator too if not a test as tests cant use the stpre :( + if (matrix.homeserver != "https://fakeServer.notExisting") { + Event creatorEvent = await room.getCreatorEvent(matrix); + if (creatorEvent != null) { + room.creator = await matrix.store + ?.getUser(matrixID: creatorEvent.id, room: row["id"]); + } + } + + return room; } @Deprecated("Use client.store.getRoomById(String id) instead!") diff --git a/lib/src/Timeline.dart b/lib/src/Timeline.dart index 9933bad..6c8d5bd 100644 --- a/lib/src/Timeline.dart +++ b/lib/src/Timeline.dart @@ -22,6 +22,7 @@ */ import 'dart:async'; + import 'Event.dart'; import 'Room.dart'; import 'User.dart'; @@ -79,14 +80,41 @@ class Timeline { events[i] = Event.fromJson(eventUpdate.content, room); } } else { - User user = await room.client.store + Event newEvent; + User senderUser = await room.client.store ?.getUser(matrixID: eventUpdate.content["sender"], room: room); - if (user != null) { - eventUpdate.content["displayname"] = user.displayName; - eventUpdate.content["avatar_url"] = user.avatarUrl.mxc; + if (senderUser != null) { + eventUpdate.content["displayname"] = senderUser.displayName; + eventUpdate.content["avatar_url"] = senderUser.avatarUrl.mxc; } - Event newEvent = Event.fromJson(eventUpdate.content, room); + User stateKeyUser; + if (eventUpdate.content.containsKey("state_key")) { + stateKeyUser = await room.client.store?.getUser( + matrixID: eventUpdate.content["state_key"], room: room); + } + + if (senderUser != null && stateKeyUser != null) { + newEvent = Event.fromJson(eventUpdate.content, room, + senderUser: senderUser, stateKeyUser: stateKeyUser); + } else if (senderUser != null) { + newEvent = Event.fromJson(eventUpdate.content, room, + senderUser: senderUser); + } else if (stateKeyUser != null) { + newEvent = Event.fromJson(eventUpdate.content, room, + stateKeyUser: stateKeyUser); + } else { + newEvent = Event.fromJson(eventUpdate.content, room); + } + + // TODO update to type check when https://gitlab.com/famedly/famedlysdk/merge_requests/28/ is merged + if (newEvent.content.containsKey("m.relates_to")) { + Map relates_to = newEvent.content["m.relates_to"]; + if (relates_to.containsKey("m.in_reply_to")) { + newEvent.replyEvent = await room.getEventById(newEvent + .content["m.relates_to"]["m.in_reply_to"]["event_id"]); + } + } events.insert(0, newEvent); if (onInsert != null) onInsert(0); diff --git a/pubspec.lock b/pubspec.lock index ad155ed..ef602eb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,5 +1,5 @@ # Generated by pub -# See https://www.dartlang.org/tools/pub/glossary#lockfile +# See https://dart.dev/tools/pub/glossary#lockfile packages: analyzer: dependency: transitive @@ -21,7 +21,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" boolean_selector: dependency: transitive description: @@ -297,7 +297,7 @@ packages: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.5.0" + version: "1.7.0" pool: dependency: transitive description: @@ -325,7 +325,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" shelf: dependency: transitive description: @@ -414,7 +414,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.4" + version: "0.2.5" timing: dependency: transitive description: From 84900f2c305329f0d8aec789f7c0cfaa5ebe81d3 Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 12 Jul 2019 20:54:31 +0200 Subject: [PATCH 2/2] [Room] revert creator user Took 12 minutes --- lib/src/Room.dart | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/lib/src/Room.dart b/lib/src/Room.dart index 0e82768..3251fb7 100644 --- a/lib/src/Room.dart +++ b/lib/src/Room.dart @@ -87,9 +87,6 @@ class Room { Event lastEvent; - // The user who created the room based on m.create events - User creator; - /// Your current client instance. final Client client; @@ -122,7 +119,6 @@ class Room { this.joinRules, this.powerLevels, this.lastEvent, - this.creator, this.client, }); @@ -370,13 +366,6 @@ class Room { return resp; } - /// Load the creator event of this room - Future getCreatorEvent(Client matrix) async { - List events = await this.loadEvents(); - return events.firstWhere((event) => event.type == EventTypes.RoomCreate, - orElse: null); - } - /// Returns a Room from a json String which comes normally from the store. static Future getRoomFromTableRow( Map row, Client matrix) async { @@ -388,7 +377,7 @@ class Room { if (avatarUrl == "") avatarUrl = await matrix.store?.getAvatarFromSingleChat(row["id"]) ?? ""; - Room room = Room( + return Room( id: row["id"], name: name, membership: row["membership"], @@ -423,17 +412,6 @@ class Room { lastEvent: Event.fromJson(row, null), client: matrix, ); - - // Lets get the creator too if not a test as tests cant use the stpre :( - if (matrix.homeserver != "https://fakeServer.notExisting") { - Event creatorEvent = await room.getCreatorEvent(matrix); - if (creatorEvent != null) { - room.creator = await matrix.store - ?.getUser(matrixID: creatorEvent.id, room: row["id"]); - } - } - - return room; } @Deprecated("Use client.store.getRoomById(String id) instead!")