Merge pull request #1638 from famedly/krille/fix-can-send-default-messages

fix: canSendDefaultMessage ignores overwritten events
This commit is contained in:
Krille-chan 2023-12-15 12:26:18 +01:00 committed by GitHub
commit f423c2f387
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 27 additions and 19 deletions

View File

@ -1788,14 +1788,18 @@ class Room {
/// level of 100, and all other users have a power level of 0. /// level of 100, and all other users have a power level of 0.
int getPowerLevelByUserId(String userId) { int getPowerLevelByUserId(String userId) {
final powerLevelMap = getState(EventTypes.RoomPowerLevels)?.content; final powerLevelMap = getState(EventTypes.RoomPowerLevels)?.content;
if (powerLevelMap == null) {
return getState(EventTypes.RoomCreate)?.senderId == userId ? 100 : 0; final userSpecificPowerLevel =
} powerLevelMap?.tryGetMap<String, Object?>('users')?.tryGet<int>(userId);
return powerLevelMap
.tryGetMap<String, Object?>('users') final defaultUserPowerLevel = powerLevelMap?.tryGet<int>('users_default');
?.tryGet<int>(userId) ??
powerLevelMap.tryGet<int>('users_default') ?? final fallbackPowerLevel =
0; getState(EventTypes.RoomCreate)?.senderId == userId ? 100 : 0;
return userSpecificPowerLevel ??
defaultUserPowerLevel ??
fallbackPowerLevel;
} }
/// Returns the user's own power level. /// Returns the user's own power level.
@ -1900,14 +1904,17 @@ class Room {
return powerLevelMap.tryGet('users_default') ?? 0; return powerLevelMap.tryGet('users_default') ?? 0;
} }
/// The default level required to send message events. Can be overridden by the events key. /// The default level required to send message events. This checks if the
bool get canSendDefaultMessages => /// user is capable of sending `m.room.message` events.
(getState(EventTypes.RoomPowerLevels) /// Please be aware that this also returns false
?.content /// if the room is encrypted but the client is not able to use encryption.
.tryGet<int>('events_default') ?? /// If you do not want this check or want to check other events like
0) <= /// `m.sticker` use `canSendEvent('<event-type>')`.
ownPowerLevel && bool get canSendDefaultMessages {
(!encrypted || client.encryptionEnabled); if (encrypted && !client.encryptionEnabled) return false;
return canSendEvent(encrypted ? EventTypes.Encrypted : EventTypes.Message);
}
/// The level required to invite a user. /// The level required to invite a user.
bool get canInvite => bool get canInvite =>
@ -1945,12 +1952,13 @@ class Room {
/// events_default set or there is no power level state in the room. /// events_default set or there is no power level state in the room.
bool canSendEvent(String eventType) { bool canSendEvent(String eventType) {
final powerLevelsMap = getState(EventTypes.RoomPowerLevels)?.content; final powerLevelsMap = getState(EventTypes.RoomPowerLevels)?.content;
if (powerLevelsMap == null) return 0 <= ownPowerLevel;
final pl = powerLevelsMap final pl = powerLevelsMap
.tryGetMap<String, Object?>('events') ?.tryGetMap<String, Object?>('events')
?.tryGet<int>(eventType) ?? ?.tryGet<int>(eventType) ??
powerLevelsMap.tryGet<int>('events_default') ?? powerLevelsMap?.tryGet<int>('events_default') ??
0; 0;
return ownPowerLevel >= pl; return ownPowerLevel >= pl;
} }