From 5c35799e18fea4e2bad0849791fe7867989c843d Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Mon, 1 Mar 2021 08:32:50 +0100 Subject: [PATCH] refactor: Request user --- lib/src/room.dart | 38 +++++++++++++++++++++++++++++--------- test/room_test.dart | 2 +- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lib/src/room.dart b/lib/src/room.dart index d9c170d0..8018922e 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -1216,6 +1216,7 @@ class Room { /// Returns the [User] object for the given [mxID] or requests it from /// the homeserver and waits for a response. + @Deprecated('Use [requestUser] instead') Future getUserByMXID(String mxID) async { if (states[mxID] != null) return states[mxID].asUser; return requestUser(mxID); @@ -1224,8 +1225,8 @@ class Room { /// Returns the [User] object for the given [mxID] or requests it from /// the homeserver and returns a default [User] object while waiting. User getUserByMXIDSync(String mxID) { - if (states[mxID] != null) { - return states[mxID].asUser; + if (getState(EventTypes.RoomMember, mxID) != null) { + return getState(EventTypes.RoomMember, mxID).asUser; } else { requestUser(mxID, ignoreErrors: true); return User(mxID, room: this); @@ -1242,6 +1243,17 @@ class Room { bool ignoreErrors = false, bool requestProfile = true, }) async { + // TODO: Why is this bug happening at all? + if (mxID == null) { + // Show a warning but first generate a stacktrace. + try { + throw Exception(); + } catch (e, s) { + Logs().w('requestUser has been called with a null mxID', e, s); + } + return null; + } + if (getState(EventTypes.RoomMember, mxID) != null) { return getState(EventTypes.RoomMember, mxID).asUser; } @@ -1250,22 +1262,26 @@ class Room { final user = await client.database.getUser(client.id, mxID, this); if (user != null) { setState(user); - if (onUpdate != null) onUpdate.add(id); + onUpdate.add(id); return user; } } - if (mxID == null || !_requestingMatrixIds.add(mxID)) return null; + if (!_requestingMatrixIds.add(mxID)) return null; Map resp; try { + Logs().v( + 'Request missing user $mxID in room $displayname from the server...'); resp = await client.requestStateContent( id, EventTypes.RoomMember, mxID, ); - } catch (exception) { + } catch (e, s) { if (!ignoreErrors) { _requestingMatrixIds.remove(mxID); rethrow; + } else { + Logs().w('Unable to request the user $mxID from the server', e, s); } } if (resp == null && requestProfile) { @@ -1275,9 +1291,13 @@ class Room { 'displayname': profile.displayname, 'avatar_url': profile.avatarUrl.toString(), }; - } catch (exception) { + } catch (e, s) { _requestingMatrixIds.remove(mxID); - if (!ignoreErrors) rethrow; + if (!ignoreErrors) { + rethrow; + } else { + Logs().w('Unable to request the profile $mxID from the server', e, s); + } } } if (resp == null) { @@ -1287,7 +1307,7 @@ class Room { displayName: resp['displayname'], avatarUrl: resp['avatar_url'], room: this); - states[mxID] = user; + setState(user); await client.database?.transaction(() async { final content = { 'sender': mxID, @@ -1304,7 +1324,7 @@ class Room { sortOrder: 0.0), ); }); - if (onUpdate != null) onUpdate.add(id); + onUpdate.add(id); _requestingMatrixIds.remove(mxID); return user; } diff --git a/test/room_test.dart b/test/room_test.dart index 26c1c6e3..7270b666 100644 --- a/test/room_test.dart +++ b/test/room_test.dart @@ -354,7 +354,7 @@ void main() { test('getUserByMXID', () async { User user; try { - user = await room.getUserByMXID('@getme:example.com'); + user = await room.requestUser('@getme:example.com'); } catch (_) {} expect(user.stateKey, '@getme:example.com'); expect(user.calcDisplayname(), 'Getme');