From ab40600746945db7f7bd8e92eaffa19f3ee166f9 Mon Sep 17 00:00:00 2001 From: istalri Date: Wed, 17 Jun 2026 23:16:51 -0400 Subject: [PATCH] Take into account creators when checking power levels (#44) Fixes #40. Reviewed-on: https://git.federated.nexus/Nexus/nexus/pulls/44 Reviewed-by: Henry Hiles --- .../members_grouped_controller.dart | 16 +++------ lib/controllers/power_level_controller.dart | 10 +++++- lib/controllers/room_creators_controller.dart | 33 +++++++++++++++++++ lib/pages/login_page.dart | 2 +- 4 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 lib/controllers/room_creators_controller.dart diff --git a/lib/controllers/members_grouped_controller.dart b/lib/controllers/members_grouped_controller.dart index e07bcf3..85fddb0 100644 --- a/lib/controllers/members_grouped_controller.dart +++ b/lib/controllers/members_grouped_controller.dart @@ -1,10 +1,10 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/members_by_status_controller.dart"; +import "package:nexus/controllers/room_creators_controller.dart"; import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/models/configs/members_by_status_config.dart"; import "package:nexus/models/content/content.dart"; -import "package:nexus/models/content/create.dart"; import "package:nexus/models/content/power_levels.dart"; import "package:nexus/models/event.dart"; @@ -19,15 +19,9 @@ class MembersGroupedController RoomsController.provider.select((value) => value[config.roomId]), ); - final createRowId = room?.state[EventType.create.type]?[""]; - final createEvent = createRowId == null ? null : room?.events[createRowId]; - final createEventContent = switch (createEvent?.content) { - CreateContent content => content, - _ => null, - }; - final creators = createEventContent?.additionalCreatorIds.add( - createEvent!.sender, - ); + final roomCreators = room == null + ? null + : ref.watch((RoomCreatorsController.provider(room))); final powerLevelsRowId = room?.state[EventType.powerLevels.type]?[""]; final powerLevelsEvent = powerLevelsRowId == null @@ -45,7 +39,7 @@ class MembersGroupedController return members .fold>>(.new(), (result, event) { - final groupKey = creators?.contains(event.stateKey!) == true + final groupKey = roomCreators?.contains(event.stateKey!) == true ? null : content.users[event.stateKey!] ?? content.usersDefault; diff --git a/lib/controllers/power_level_controller.dart b/lib/controllers/power_level_controller.dart index 917ee31..7c40a6d 100644 --- a/lib/controllers/power_level_controller.dart +++ b/lib/controllers/power_level_controller.dart @@ -1,5 +1,6 @@ import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/client_state_controller.dart"; +import "package:nexus/controllers/room_creators_controller.dart"; import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/models/configs/power_level_config.dart"; import "package:nexus/models/content/content.dart"; @@ -22,6 +23,10 @@ class PowerLevelController extends Notifier { RoomsController.provider.select((value) => value[config.roomId]), ); + final roomCreators = room == null + ? null + : ref.watch(RoomCreatorsController.provider(room)); + final eventRowId = room?.state[EventType.powerLevels.type]?[""]; final event = eventRowId == null ? null : room?.events[eventRowId]; @@ -37,7 +42,10 @@ class PowerLevelController extends Notifier { int powerLevelOf(String userId) => content.users[userId] ?? content.usersDefault; - final userLevel = powerLevelOf(user); + // room creators get power level infinite + final userLevel = roomCreators?.contains(user) == true + ? double.infinity + : powerLevelOf(user); return switch (config) { EventPowerLevelConfig(:final eventType) => diff --git a/lib/controllers/room_creators_controller.dart b/lib/controllers/room_creators_controller.dart new file mode 100644 index 0000000..7db72c2 --- /dev/null +++ b/lib/controllers/room_creators_controller.dart @@ -0,0 +1,33 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; +import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:nexus/models/content/content.dart"; +import "package:nexus/models/content/create.dart"; +import "package:nexus/models/room.dart"; + +class RoomCreatorsController extends Notifier> { + final Room room; + RoomCreatorsController(this.room); + + @override + IList build() { + final createRowId = room.state[EventType.create.type]?[""]; + final createEvent = createRowId == null ? null : room.events[createRowId]; + + if (createEvent == null) return .new(); + + final createEventContent = switch (createEvent.content) { + CreateContent content => content, + _ => null, + }; + + return switch (createEventContent?.additionalCreatorIds) { + IList creators => creators.add(createEvent.sender), + _ => .new([createEvent.sender]), + }; + } + + static final provider = + NotifierProvider.family, Room>( + RoomCreatorsController.new, + ); +} diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 5c9d53d..f7a3f1a 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -96,4 +96,4 @@ class LoginPage extends HookConsumerWidget { ), ); } -} +} \ No newline at end of file