From fd1b4eed920fe2cc07691c8b83deb066b2782b7f Mon Sep 17 00:00:00 2001 From: Krille Date: Fri, 8 Dec 2023 08:57:29 +0100 Subject: [PATCH] fix: canSendDefaultMessage ignores overwritten events This refactors three methods regarding powerlevels. It makes them a little bit more readable and removes unnecessary checks. it also changes the canSendDefaultMessage method in a way that it also checks the events map in the powerlevels so that it returns true if message events are overwritten there. It also improves the dart docs and explains in more detail what it does. --- lib/src/room.dart | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/lib/src/room.dart b/lib/src/room.dart index a2714710..11db7672 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -1788,14 +1788,18 @@ class Room { /// level of 100, and all other users have a power level of 0. int getPowerLevelByUserId(String userId) { final powerLevelMap = getState(EventTypes.RoomPowerLevels)?.content; - if (powerLevelMap == null) { - return getState(EventTypes.RoomCreate)?.senderId == userId ? 100 : 0; - } - return powerLevelMap - .tryGetMap('users') - ?.tryGet(userId) ?? - powerLevelMap.tryGet('users_default') ?? - 0; + + final userSpecificPowerLevel = + powerLevelMap?.tryGetMap('users')?.tryGet(userId); + + final defaultUserPowerLevel = powerLevelMap?.tryGet('users_default'); + + final fallbackPowerLevel = + getState(EventTypes.RoomCreate)?.senderId == userId ? 100 : 0; + + return userSpecificPowerLevel ?? + defaultUserPowerLevel ?? + fallbackPowerLevel; } /// Returns the user's own power level. @@ -1900,14 +1904,17 @@ class Room { return powerLevelMap.tryGet('users_default') ?? 0; } - /// The default level required to send message events. Can be overridden by the events key. - bool get canSendDefaultMessages => - (getState(EventTypes.RoomPowerLevels) - ?.content - .tryGet('events_default') ?? - 0) <= - ownPowerLevel && - (!encrypted || client.encryptionEnabled); + /// The default level required to send message events. This checks if the + /// user is capable of sending `m.room.message` events. + /// Please be aware that this also returns false + /// if the room is encrypted but the client is not able to use encryption. + /// If you do not want this check or want to check other events like + /// `m.sticker` use `canSendEvent('')`. + bool get canSendDefaultMessages { + if (encrypted && !client.encryptionEnabled) return false; + + return canSendEvent(encrypted ? EventTypes.Encrypted : EventTypes.Message); + } /// The level required to invite a user. bool get canInvite => @@ -1945,12 +1952,13 @@ class Room { /// events_default set or there is no power level state in the room. bool canSendEvent(String eventType) { final powerLevelsMap = getState(EventTypes.RoomPowerLevels)?.content; - if (powerLevelsMap == null) return 0 <= ownPowerLevel; + final pl = powerLevelsMap - .tryGetMap('events') + ?.tryGetMap('events') ?.tryGet(eventType) ?? - powerLevelsMap.tryGet('events_default') ?? + powerLevelsMap?.tryGet('events_default') ?? 0; + return ownPowerLevel >= pl; }