Take into account creators when checking power levels #44

Merged
Henry-Hiles merged 2 commits from istalri/nexus:creator-power-level-infinite into main 2026-06-17 23:16:52 -04:00
2 changed files with 18 additions and 32 deletions
Showing only changes of commit a13d850a27 - Show all commits

Clean Up

double.infinity instead of null is clearer in it's intend
non nullable IList is also clearer
fix comment to reflect changes
istalri 2026-06-18 05:05:38 +02:00

View file

@ -42,51 +42,37 @@ class PowerLevelController extends Notifier<bool> {
int powerLevelOf(String userId) => int powerLevelOf(String userId) =>
content.users[userId] ?? content.usersDefault; content.users[userId] ?? content.usersDefault;
//Creators get power level infinite, here marked with null // room creators get power level infinite
final userLevel = roomCreators?.contains(user) == true final userLevel = roomCreators?.contains(user) == true
? null ? double.infinity
: powerLevelOf(user); : powerLevelOf(user);
return switch (config) { return switch (config) {
EventPowerLevelConfig(:final eventType) => EventPowerLevelConfig(:final eventType) =>
userLevel == null userLevel >= (content.events[eventType.type] ?? content.eventsDefault),
? true
: (userLevel >=
(content.events[eventType.type] ?? content.eventsDefault)),
MembershipActionPowerLevelConfig(:final action, :final targetUser) => MembershipActionPowerLevelConfig(:final action, :final targetUser) =>
switch (action) { switch (action) {
.invite => userLevel == null ? true : (userLevel >= content.invite), .invite => userLevel >= content.invite,
.kick => .kick =>
userLevel == null userLevel >= content.kick && userLevel > powerLevelOf(targetUser),
? true
: (userLevel >= content.kick &&
userLevel > powerLevelOf(targetUser)),
.ban => .ban =>
userLevel == null userLevel >= content.ban && userLevel > powerLevelOf(targetUser),
? true
: (userLevel >= content.ban &&
userLevel > powerLevelOf(targetUser)),
.unban => userLevel == null ? true : (userLevel >= content.ban), .unban => userLevel >= content.ban,
}, },
StatePowerLevelConfig(:final eventType) => StatePowerLevelConfig(:final eventType) =>
userLevel == null userLevel >= (content.events[eventType.type] ?? content.stateDefault),
? true
: (userLevel >=
(content.events[eventType.type] ?? content.stateDefault)),
RedactionPowerLevelConfig(:final targetUser) => RedactionPowerLevelConfig(:final targetUser) =>
userLevel == null userLevel >=
? true (targetUser == user
: (userLevel >= ? (content.events[EventType.redaction.type] ??
(targetUser == user content.eventsDefault)
? (content.events[EventType.redaction.type] ?? : content.redact),
content.eventsDefault)
: content.redact)),
}; };
} }

View file

@ -4,16 +4,16 @@ import "package:nexus/models/content/content.dart";
import "package:nexus/models/content/create.dart"; import "package:nexus/models/content/create.dart";
import "package:nexus/models/room.dart"; import "package:nexus/models/room.dart";
class RoomCreatorsController extends Notifier<IList<String>?> { class RoomCreatorsController extends Notifier<IList<String>> {
final Room room; final Room room;
RoomCreatorsController(this.room); RoomCreatorsController(this.room);
@override @override
IList<String>? build() { IList<String> build() {
final createRowId = room.state[EventType.create.type]?[""]; final createRowId = room.state[EventType.create.type]?[""];
final createEvent = createRowId == null ? null : room.events[createRowId]; final createEvent = createRowId == null ? null : room.events[createRowId];
if (createEvent == null) return null; if (createEvent == null) return .new();
final createEventContent = switch (createEvent.content) { final createEventContent = switch (createEvent.content) {
CreateContent content => content, CreateContent content => content,
@ -22,12 +22,12 @@ class RoomCreatorsController extends Notifier<IList<String>?> {
return switch (createEventContent?.additionalCreatorIds) { return switch (createEventContent?.additionalCreatorIds) {
IList<String> creators => creators.add(createEvent.sender), IList<String> creators => creators.add(createEvent.sender),
_ => [createEvent.sender].toIList(), _ => .new([createEvent.sender]),
}; };
} }
static final provider = static final provider =
NotifierProvider.family<RoomCreatorsController, IList<String>?, Room>( NotifierProvider.family<RoomCreatorsController, IList<String>, Room>(
RoomCreatorsController.new, RoomCreatorsController.new,
); );
} }