fix checks for memberships

This commit is contained in:
Henry Hiles 2026-04-04 17:52:42 -04:00
commit 185ee37f04
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
3 changed files with 35 additions and 14 deletions

View file

@ -21,22 +21,40 @@ class PowerLevelController extends Notifier<bool> {
final users = (event.content["users"] as Map<String, dynamic>? ?? {}); final users = (event.content["users"] as Map<String, dynamic>? ?? {});
final events = (event.content["events"] as Map<String, dynamic>? ?? {}); final events = (event.content["events"] as Map<String, dynamic>? ?? {});
final userLevel = users.containsKey(user) int powerLevelOf(String userId) => users.containsKey(userId)
? (users[user] as int) ? (users[userId] as int)
: (event.content["users_default"] as int? ?? 0); : (event.content["users_default"] as int? ?? 0);
final requiredLevel = switch (config.action) { final userLevel = powerLevelOf(user);
MembershipAction.ban || final targetLevel = config.targetUser != null
MembershipAction.unban => (event.content["ban"] as int? ?? 50), ? powerLevelOf(config.targetUser!)
MembershipAction.kick => (event.content["kick"] as int? ?? 50), : null;
MembershipAction.invite => (event.content["invite"] as int? ?? 0),
null => if (config.action != null) {
events.containsKey(config.eventType) return switch (config.action!) {
MembershipAction.invite =>
userLevel >= (event.content["invite"] as int? ?? 0),
MembershipAction.kick =>
targetLevel != null &&
userLevel >= (event.content["kick"] as int? ?? 50) &&
userLevel > targetLevel,
MembershipAction.ban =>
targetLevel != null &&
userLevel >= (event.content["ban"] as int? ?? 50) &&
userLevel > targetLevel,
MembershipAction.unban =>
userLevel >= (event.content["ban"] as int? ?? 50),
};
}
final requiredLevel = events.containsKey(config.eventType)
? (events[config.eventType] as int) ? (events[config.eventType] as int)
: (config.isStateEvent : (config.isStateEvent
? (event.content["state_default"] as int? ?? 50) ? (event.content["state_default"] as int? ?? 50)
: (event.content["events_default"] as int? ?? 0)), : (event.content["events_default"] as int? ?? 0));
};
return userLevel >= requiredLevel; return userLevel >= requiredLevel;
} }

View file

@ -9,6 +9,7 @@ abstract class PowerLevelConfig with _$PowerLevelConfig {
@Default(false) bool isStateEvent, @Default(false) bool isStateEvent,
required String eventType, required String eventType,
MembershipAction? action, MembershipAction? action,
String? targetUser,
}) = _PowerLevelConfig; }) = _PowerLevelConfig;
factory PowerLevelConfig.fromJson(Map<String, Object?> json) => factory PowerLevelConfig.fromJson(Map<String, Object?> json) =>

View file

@ -160,6 +160,7 @@ class UserPopover extends ConsumerWidget {
eventType: "m.room.member", eventType: "m.room.member",
action: MembershipAction.kick, action: MembershipAction.kick,
isStateEvent: true, isStateEvent: true,
targetUser: member.userId,
), ),
), ),
) && ) &&
@ -183,6 +184,7 @@ class UserPopover extends ConsumerWidget {
eventType: "m.room.member", eventType: "m.room.member",
action: MembershipAction.ban, action: MembershipAction.ban,
isStateEvent: true, isStateEvent: true,
targetUser: member.userId,
), ),
), ),
)) ))