implemented a way to filter out roles that can't be assigned to permission, and disable permissions that are above the current power level of the user.

This commit is contained in:
Mauro Romito
2025-12-18 18:43:19 +01:00
committed by Mauro
parent f2fc164e2b
commit 88cd816392
18 changed files with 197 additions and 90 deletions
@@ -10,24 +10,29 @@ import Foundation
import MatrixRustSDK
struct RoomPermissionsSetting: Identifiable {
var id: KeyPath<RoomPermissions, RoomRole> { keyPath }
static let allValues: [(title: String, tag: RoomRole)] = [(title: L10n.screenRoomChangePermissionsAdministrators, tag: .administrator),
(title: L10n.screenRoomChangePermissionsModerators, tag: .moderator),
(title: L10n.screenRoomChangePermissionsEveryone, tag: .user)]
var id: KeyPath<RoomPermissions, Int64> { keyPath }
/// The title of this setting.
let title: String
/// The selected role of this setting.
var value: RoomRole
/// All of the available roles that this setting can be configured with.
var allValues: [(title: String, tag: RoomRole)] {
[
(title: L10n.screenRoomChangePermissionsAdministrators, tag: .administrator),
(title: L10n.screenRoomChangePermissionsModerators, tag: .moderator),
(title: L10n.screenRoomChangePermissionsEveryone, tag: .user)
]
}
var value: Int64
let ownPowerLevel: RoomPowerLevel
var roleValue: RoomRole {
get {
RoomRole(powerLevelValue: value)
} set {
value = newValue.powerLevelValue
}
}
/// The `RoomPermissions` property that this setting is for.
let keyPath: KeyPath<RoomPermissions, RoomRole>
let keyPath: KeyPath<RoomPermissions, Int64>
/// The `RoomPowerLevelChanges` property that this setting is saved into.
var rustKeyPath: WritableKeyPath<RoomPowerLevelChanges, Int64?> {
switch keyPath {
@@ -45,46 +50,75 @@ struct RoomPermissionsSetting: Identifiable {
default: fatalError("Unexpected key path: \(keyPath)")
}
}
/// Can the setting be edited
var isDisabled: Bool {
switch ownPowerLevel {
case .value(let ownValue):
ownValue < value
case .infinite:
false
}
}
/// All of the available roles that this setting can be configured with.
var availableValues: [(title: String, tag: RoomRole)] {
if isDisabled {
Self.allValues.filter { $0.tag == RoomRole(powerLevelValue: value) }
} else {
Self.allValues.filter { $0.tag <= ownPowerLevel.role }
}
}
init(title: String,
value: Int64,
ownPowerLevel: RoomPowerLevel,
keyPath: KeyPath<RoomPermissions, Int64>) {
self.ownPowerLevel = ownPowerLevel
self.title = title
self.value = value
self.keyPath = keyPath
}
}
struct RoomPermissions {
/// The level required to ban a user.
var ban: RoomRole
var ban: Int64
/// The level required to invite a user.
var invite: RoomRole
var invite: Int64
/// The level required to kick a user.
var kick: RoomRole
var kick: Int64
/// The level required to redact an event.
var redact: RoomRole
var redact: Int64
/// The default level required to send message events.
var eventsDefault: RoomRole
var eventsDefault: Int64
/// The default level required to send state events.
var stateDefault: RoomRole
var stateDefault: Int64
/// The default power level for every user in the room.
var usersDefault: RoomRole
var usersDefault: Int64
/// The level required to change the room's name.
var roomName: RoomRole
var roomName: Int64
/// The level required to change the room's avatar.
var roomAvatar: RoomRole
var roomAvatar: Int64
/// The level required to change the room's topic.
var roomTopic: RoomRole
var roomTopic: Int64
/// The level required to add/remove childrens from a space.
var spaceChild: RoomRole
var spaceChild: Int64
}
extension RoomPermissions {
/// Create permissions from the room's power levels.
init(powerLevels: RoomPowerLevelsValues) {
ban = RoomRole(powerLevelValue: powerLevels.ban)
invite = RoomRole(powerLevelValue: powerLevels.invite)
kick = RoomRole(powerLevelValue: powerLevels.kick)
redact = RoomRole(powerLevelValue: powerLevels.redact)
eventsDefault = RoomRole(powerLevelValue: powerLevels.eventsDefault)
stateDefault = RoomRole(powerLevelValue: powerLevels.stateDefault)
usersDefault = RoomRole(powerLevelValue: powerLevels.usersDefault)
roomName = RoomRole(powerLevelValue: powerLevels.roomName)
roomAvatar = RoomRole(powerLevelValue: powerLevels.roomAvatar)
roomTopic = RoomRole(powerLevelValue: powerLevels.roomTopic)
spaceChild = RoomRole(powerLevelValue: powerLevels.spaceChild)
ban = powerLevels.ban
invite = powerLevels.invite
kick = powerLevels.kick
redact = powerLevels.redact
eventsDefault = powerLevels.eventsDefault
stateDefault = powerLevels.stateDefault
usersDefault = powerLevels.usersDefault
roomName = powerLevels.roomName
roomAvatar = powerLevels.roomAvatar
roomTopic = powerLevels.roomTopic
spaceChild = powerLevels.spaceChild
}
}