diff --git a/lib/controllers/power_level_controller.dart b/lib/controllers/power_level_controller.dart index db57d4f..26221e1 100644 --- a/lib/controllers/power_level_controller.dart +++ b/lib/controllers/power_level_controller.dart @@ -21,22 +21,40 @@ class PowerLevelController extends Notifier { final users = (event.content["users"] as Map? ?? {}); final events = (event.content["events"] as Map? ?? {}); - final userLevel = users.containsKey(user) - ? (users[user] as int) + int powerLevelOf(String userId) => users.containsKey(userId) + ? (users[userId] as int) : (event.content["users_default"] as int? ?? 0); - final requiredLevel = switch (config.action) { - MembershipAction.ban || - MembershipAction.unban => (event.content["ban"] as int? ?? 50), - MembershipAction.kick => (event.content["kick"] as int? ?? 50), - MembershipAction.invite => (event.content["invite"] as int? ?? 0), - null => - events.containsKey(config.eventType) - ? (events[config.eventType] as int) - : (config.isStateEvent - ? (event.content["state_default"] as int? ?? 50) - : (event.content["events_default"] as int? ?? 0)), - }; + final userLevel = powerLevelOf(user); + final targetLevel = config.targetUser != null + ? powerLevelOf(config.targetUser!) + : null; + + if (config.action != null) { + 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) + : (config.isStateEvent + ? (event.content["state_default"] as int? ?? 50) + : (event.content["events_default"] as int? ?? 0)); return userLevel >= requiredLevel; } diff --git a/lib/models/configs/power_level_config.dart b/lib/models/configs/power_level_config.dart index c051fed..31cc08c 100644 --- a/lib/models/configs/power_level_config.dart +++ b/lib/models/configs/power_level_config.dart @@ -9,6 +9,7 @@ abstract class PowerLevelConfig with _$PowerLevelConfig { @Default(false) bool isStateEvent, required String eventType, MembershipAction? action, + String? targetUser, }) = _PowerLevelConfig; factory PowerLevelConfig.fromJson(Map json) => diff --git a/lib/widgets/chat_page/user_popover.dart b/lib/widgets/chat_page/user_popover.dart index 2f76d9f..a9a4799 100644 --- a/lib/widgets/chat_page/user_popover.dart +++ b/lib/widgets/chat_page/user_popover.dart @@ -160,6 +160,7 @@ class UserPopover extends ConsumerWidget { eventType: "m.room.member", action: MembershipAction.kick, isStateEvent: true, + targetUser: member.userId, ), ), ) && @@ -183,6 +184,7 @@ class UserPopover extends ConsumerWidget { eventType: "m.room.member", action: MembershipAction.ban, isStateEvent: true, + targetUser: member.userId, ), ), ))