Merge pull request #1820 from famedly/krille/fix-request-profiles-for-users

fix: Requst profiles for left users
This commit is contained in:
Krille-chan 2024-05-29 10:14:53 +02:00 committed by GitHub
commit e207800c0f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 61 additions and 72 deletions

View File

@ -18,7 +18,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:typed_data';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:html_unescape/html_unescape.dart'; import 'package:html_unescape/html_unescape.dart';
@ -26,7 +25,6 @@ import 'package:html_unescape/html_unescape.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'package:matrix/src/models/timeline_chunk.dart'; import 'package:matrix/src/models/timeline_chunk.dart';
import 'package:matrix/src/utils/cached_stream_controller.dart'; import 'package:matrix/src/utils/cached_stream_controller.dart';
import 'package:matrix/src/utils/crypto/crypto.dart';
import 'package:matrix/src/utils/file_send_request_credentials.dart'; import 'package:matrix/src/utils/file_send_request_credentials.dart';
import 'package:matrix/src/utils/markdown.dart'; import 'package:matrix/src/utils/markdown.dart';
import 'package:matrix/src/utils/marked_unread.dart'; import 'package:matrix/src/utils/marked_unread.dart';
@ -1644,7 +1642,6 @@ class Room {
requestUser( requestUser(
mxID, mxID,
ignoreErrors: true, ignoreErrors: true,
requestProfile: false,
); );
} }
return User(mxID, room: this); return User(mxID, room: this);
@ -1663,54 +1660,74 @@ class Room {
}) async { }) async {
assert(mxID.isValidMatrixId); assert(mxID.isValidMatrixId);
// Checks if the user is really missing // Is user already in cache?
final stateUser = getState(EventTypes.RoomMember, mxID); var foundUser = getState(EventTypes.RoomMember, mxID)?.asUser(this);
if (stateUser != null) {
return stateUser.asUser(this);
}
// it may be in the database // If not, is it in the database?
final dbuser = await client.database?.getUser(mxID, this); foundUser ??= await client.database?.getUser(mxID, this);
if (dbuser != null) {
setState(dbuser);
// ignore: deprecated_member_use_from_same_package
onUpdate.add(id);
return dbuser;
}
if (!_requestingMatrixIds.add(mxID)) return null; // If not, can we request it from the server?
Map<String, dynamic>? resp; if (foundUser == null) {
try { if (!_requestingMatrixIds.add(mxID)) return null;
Logs().v( Map<String, dynamic>? resp;
'Request missing user $mxID in room ${getLocalizedDisplayname()} from the server...'); try {
resp = await client.getRoomStateWithKey( Logs().v(
id, 'Request missing user $mxID in room ${getLocalizedDisplayname()} from the server...');
EventTypes.RoomMember, resp = await client.getRoomStateWithKey(
mxID, id,
); EventTypes.RoomMember,
} on MatrixException catch (_) { mxID,
// Ignore if we have no permission );
} catch (e, s) { foundUser = User(
if (!ignoreErrors) { mxID,
room: this,
displayName: resp['displayname'],
avatarUrl: resp['avatar_url'],
membership: resp['membership'],
);
_requestingMatrixIds.remove(mxID); _requestingMatrixIds.remove(mxID);
rethrow;
} else { // Store user in database:
Logs().w('Unable to request the user $mxID from the server', e, s); await client.database?.transaction(() async {
await client.database?.storeEventUpdate(
EventUpdate(
content: foundUser!.toJson(),
roomID: id,
type: EventUpdateType.state,
),
client,
);
});
} on MatrixException catch (_) {
// Ignore if we have no permission
} 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) {
// User not found anywhere? Set a blank one:
foundUser ??= User(mxID, room: this, membership: 'leave');
// Is it a left user without any displayname/avatar info? Try fetch profile:
if (requestProfile &&
{Membership.ban, Membership.leave}.contains(foundUser.membership) &&
foundUser.displayName == null &&
foundUser.avatarUrl == null) {
try { try {
final profile = await client.getUserProfile(mxID); final profile = await client.getProfileFromUserId(mxID);
_requestingMatrixIds.remove(mxID); foundUser = User(
return User(
mxID, mxID,
displayName: profile.displayname, displayName: profile.displayName,
avatarUrl: profile.avatarUrl?.toString(), avatarUrl: profile.avatarUrl?.toString(),
membership: Membership.leave.name, membership: Membership.leave.name,
room: this, room: this,
); );
} catch (e, s) { } catch (e, s) {
_requestingMatrixIds.remove(mxID);
if (!ignoreErrors) { if (!ignoreErrors) {
rethrow; rethrow;
} else { } else {
@ -1718,41 +1735,13 @@ class Room {
} }
} }
} }
if (resp == null) {
return null; // Set user in the local state
} setState(foundUser!);
final user = User(mxID,
displayName: resp['displayname'],
avatarUrl: resp['avatar_url'],
room: this);
setState(user);
await client.database?.transaction(() async {
final fakeEventId = String.fromCharCodes(
await sha256(
Uint8List.fromList(
(id + mxID + client.generateUniqueTransactionId()).codeUnits),
),
);
await client.database?.storeEventUpdate(
EventUpdate(
content: MatrixEvent(
type: EventTypes.RoomMember,
content: resp!,
stateKey: mxID,
originServerTs: DateTime.now(),
senderId: mxID,
eventId: fakeEventId,
).toJson(),
roomID: id,
type: EventUpdateType.state,
),
client,
);
});
// ignore: deprecated_member_use_from_same_package // ignore: deprecated_member_use_from_same_package
onUpdate.add(id); onUpdate.add(id);
_requestingMatrixIds.remove(mxID);
return user; return foundUser;
} }
/// Searches for the event in the local cache and then on the server if not /// Searches for the event in the local cache and then on the server if not