Merge pull request #1638 from famedly/krille/fix-can-send-default-messages
fix: canSendDefaultMessage ignores overwritten events
This commit is contained in:
commit
f423c2f387
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue