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) =>
content.users[userId] ?? content.usersDefault;
//Creators get power level infinite, here marked with null
// room creators get power level infinite
istalri marked this conversation as resolved Outdated

Also when you leave comments please put a space between // and the first word :)

Also when you leave comments please put a space between `//` and the first word :)
final userLevel = roomCreators?.contains(user) == true
? null
? double.infinity
istalri marked this conversation as resolved Outdated

Better to set this to double.infinity. Then you shouldn't need to touch the logic below.

Better to set this to `double.infinity`. Then you shouldn't need to touch the logic below.
: powerLevelOf(user);
return switch (config) {
EventPowerLevelConfig(:final eventType) =>
userLevel == null
? true
: (userLevel >=
(content.events[eventType.type] ?? content.eventsDefault)),
userLevel >= (content.events[eventType.type] ?? content.eventsDefault),
MembershipActionPowerLevelConfig(:final action, :final targetUser) =>
switch (action) {
.invite => userLevel == null ? true : (userLevel >= content.invite),
.invite => userLevel >= content.invite,
.kick =>
userLevel == null
? true
: (userLevel >= content.kick &&
userLevel > powerLevelOf(targetUser)),
userLevel >= content.kick && userLevel > powerLevelOf(targetUser),
.ban =>
userLevel == null
? true
: (userLevel >= content.ban &&
userLevel > powerLevelOf(targetUser)),
userLevel >= content.ban && userLevel > powerLevelOf(targetUser),
.unban => userLevel == null ? true : (userLevel >= content.ban),
.unban => userLevel >= content.ban,
},
StatePowerLevelConfig(:final eventType) =>
userLevel == null
? true
: (userLevel >=
(content.events[eventType.type] ?? content.stateDefault)),
userLevel >= (content.events[eventType.type] ?? content.stateDefault),
RedactionPowerLevelConfig(:final targetUser) =>
userLevel == null
? true
: (userLevel >=
(targetUser == user
? (content.events[EventType.redaction.type] ??
content.eventsDefault)
: content.redact)),
userLevel >=
(targetUser == user
? (content.events[EventType.redaction.type] ??
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/room.dart";
class RoomCreatorsController extends Notifier<IList<String>?> {
class RoomCreatorsController extends Notifier<IList<String>> {
final Room room;
RoomCreatorsController(this.room);
@override
IList<String>? build() {
IList<String> build() {
final createRowId = room.state[EventType.create.type]?[""];
final createEvent = createRowId == null ? null : room.events[createRowId];
if (createEvent == null) return null;
if (createEvent == null) return .new();
istalri marked this conversation as resolved Outdated

I think it's best to make this function/controller/provider return IList<String>, and return a .new() instead of null.

I think it's best to make this function/controller/provider return `IList<String>`, and return a `.new()` instead of null.
final createEventContent = switch (createEvent.content) {
CreateContent content => content,
@ -22,12 +22,12 @@ class RoomCreatorsController extends Notifier<IList<String>?> {
return switch (createEventContent?.additionalCreatorIds) {
IList<String> creators => creators.add(createEvent.sender),
_ => [createEvent.sender].toIList(),
_ => .new([createEvent.sender]),
istalri marked this conversation as resolved Outdated

A little cleaner:

- [createEvent.sender].toIList()
+ .new([createEvent.sender])
A little cleaner: ```diff - [createEvent.sender].toIList() + .new([createEvent.sender]) ```
};
}
static final provider =
NotifierProvider.family<RoomCreatorsController, IList<String>?, Room>(
NotifierProvider.family<RoomCreatorsController, IList<String>, Room>(
RoomCreatorsController.new,
);
}