Merge pull request #2117 from famedly/krille/restrict-can-send-event-to-joined-users

Krille/restrict can send event to joined users
This commit is contained in:
Krille-chan 2025-07-17 10:21:25 +02:00 committed by GitHub
commit 092eb0a931
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 16 deletions

View File

@ -1980,15 +1980,18 @@ class Room {
} }
/// The level required to ban a user. /// The level required to ban a user.
bool get canBan => bool get canBan {
(getState(EventTypes.RoomPowerLevels)?.content.tryGet<int>('ban') ?? if (membership != Membership.join) return false;
50) <= return (getState(EventTypes.RoomPowerLevels)?.content.tryGet<int>('ban') ??
ownPowerLevel; 50) <=
ownPowerLevel;
}
/// returns if user can change a particular state event by comparing `ownPowerLevel` /// returns if user can change a particular state event by comparing `ownPowerLevel`
/// with possible overrides in `events`, if not present compares `ownPowerLevel` /// with possible overrides in `events`, if not present compares `ownPowerLevel`
/// with state_default /// with state_default
bool canChangeStateEvent(String action) { bool canChangeStateEvent(String action) {
if (membership != Membership.join) return false;
return powerForChangingStateEvent(action) <= ownPowerLevel; return powerForChangingStateEvent(action) <= ownPowerLevel;
} }
@ -2060,22 +2063,32 @@ class Room {
} }
/// The level required to invite a user. /// The level required to invite a user.
bool get canInvite => bool get canInvite {
(getState(EventTypes.RoomPowerLevels)?.content.tryGet<int>('invite') ?? if (membership != Membership.join) return false;
0) <= return (getState(EventTypes.RoomPowerLevels)
ownPowerLevel; ?.content
.tryGet<int>('invite') ??
0) <=
ownPowerLevel;
}
/// The level required to kick a user. /// The level required to kick a user.
bool get canKick => bool get canKick {
(getState(EventTypes.RoomPowerLevels)?.content.tryGet<int>('kick') ?? if (membership != Membership.join) return false;
50) <= return (getState(EventTypes.RoomPowerLevels)?.content.tryGet<int>('kick') ??
ownPowerLevel; 50) <=
ownPowerLevel;
}
/// The level required to redact an event. /// The level required to redact an event.
bool get canRedact => bool get canRedact {
(getState(EventTypes.RoomPowerLevels)?.content.tryGet<int>('redact') ?? if (membership != Membership.join) return false;
50) <= return (getState(EventTypes.RoomPowerLevels)
ownPowerLevel; ?.content
.tryGet<int>('redact') ??
50) <=
ownPowerLevel;
}
/// The default level required to send state events. Can be overridden by the events key. /// The default level required to send state events. Can be overridden by the events key.
bool get canSendDefaultStates { bool get canSendDefaultStates {
@ -2094,6 +2107,7 @@ class Room {
/// The level required to send a certain event. Defaults to 0 if there is no /// The level required to send a certain event. Defaults to 0 if there is no
/// 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) {
if (membership != Membership.join) return false;
final powerLevelsMap = getState(EventTypes.RoomPowerLevels)?.content; final powerLevelsMap = getState(EventTypes.RoomPowerLevels)?.content;
final pl = powerLevelsMap final pl = powerLevelsMap

View File

@ -80,6 +80,9 @@ class Timeline {
bool _fetchedAllDatabaseEvents = false; bool _fetchedAllDatabaseEvents = false;
bool get canRequestHistory { bool get canRequestHistory {
if (!{Membership.join, Membership.leave}.contains(room.membership)) {
return false;
}
if (events.isEmpty) return true; if (events.isEmpty) return true;
return !_fetchedAllDatabaseEvents || return !_fetchedAllDatabaseEvents ||
(room.prev_batch != null && events.last.type != EventTypes.RoomCreate); (room.prev_batch != null && events.last.type != EventTypes.RoomCreate);