Merge pull request #1820 from famedly/krille/fix-request-profiles-for-users
fix: Requst profiles for left users
This commit is contained in:
commit
e207800c0f
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue