mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 10:33:45 +00:00
Last Owner should edit admins, and not leave when is last (#4372)
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
//
|
||||
// Copyright 2025 New Vector Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
// Please see LICENSE files in the repository root for full details.
|
||||
//
|
||||
|
||||
import MatrixRustSDK
|
||||
|
||||
enum RoomRole: Comparable {
|
||||
/// Default role PL 0...49
|
||||
case user
|
||||
/// Able to perform room moderation actions PL 50...99
|
||||
case moderator
|
||||
/// Able to edit room settings and perform any action aside from room upgrading PL 100...149
|
||||
case administrator
|
||||
/// Same power of an admin, but they can also upgrade the room, PL 150 onwards
|
||||
case owner
|
||||
/// Creator of the room, PL infinite
|
||||
case creator
|
||||
}
|
||||
|
||||
extension RoomRole {
|
||||
init(powerLevel: RoomPowerLevel) {
|
||||
do {
|
||||
let role = try suggestedRoleForPowerLevel(powerLevel: powerLevel.rustPowerLevel)
|
||||
self.init(role, powerLevel: powerLevel)
|
||||
} catch {
|
||||
MXLog.error("Failled to get suggested role for power level \(powerLevel): \(error)")
|
||||
self = .user
|
||||
}
|
||||
}
|
||||
|
||||
init(_ role: RoomMemberRole, powerLevel: RoomPowerLevel) {
|
||||
switch role {
|
||||
case .creator:
|
||||
self = .creator
|
||||
case .administrator:
|
||||
switch powerLevel {
|
||||
case .value(let value):
|
||||
self = value >= 150 ? .owner : .administrator
|
||||
default:
|
||||
fatalError("Impossible")
|
||||
}
|
||||
case .moderator:
|
||||
self = .moderator
|
||||
case .user:
|
||||
self = .user
|
||||
}
|
||||
}
|
||||
|
||||
var isAdminOrHigher: Bool {
|
||||
switch self {
|
||||
case .administrator, .creator, .owner:
|
||||
return true
|
||||
case .moderator, .user:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
var isOwner: Bool {
|
||||
switch self {
|
||||
case .creator, .owner:
|
||||
return true
|
||||
case .administrator, .moderator, .user:
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension RoomRole {
|
||||
init(powerLevelValue: Int64) {
|
||||
// Also this is not great, and should be handled by a `suggestedRoleForPowerLevelValue` function from the SDK
|
||||
guard powerLevelValue < 150 else {
|
||||
self = .owner
|
||||
return
|
||||
}
|
||||
|
||||
do {
|
||||
switch try suggestedRoleForPowerLevel(powerLevel: .value(value: powerLevelValue)) {
|
||||
case .administrator:
|
||||
self = .administrator
|
||||
case .creator:
|
||||
fatalError("Impossible")
|
||||
case .moderator:
|
||||
self = .moderator
|
||||
case .user:
|
||||
self = .user
|
||||
}
|
||||
} catch {
|
||||
MXLog.error("Falied to convert power level value to role: \(error)")
|
||||
self = .user
|
||||
}
|
||||
}
|
||||
|
||||
var rustRole: RoomMemberRole {
|
||||
switch self {
|
||||
case .creator:
|
||||
.creator
|
||||
case .administrator, .owner:
|
||||
.administrator
|
||||
case .moderator:
|
||||
.moderator
|
||||
case .user:
|
||||
.user
|
||||
}
|
||||
}
|
||||
|
||||
/// To be used when setting the power level of a user to get the suggested equivalent power level value for that specific role
|
||||
/// NOTE: Do not use for comparison, use the true power level instead.
|
||||
var powerLevelValue: Int64 {
|
||||
guard self != .owner else {
|
||||
// Would be better if the SDK would return this, maybe a `suggestedPowerLevelValueForRole` function would solve the problem
|
||||
return 150
|
||||
}
|
||||
|
||||
do {
|
||||
switch try suggestedPowerLevelForRole(role: rustRole) {
|
||||
case .infinite:
|
||||
fatalError("Impossible")
|
||||
case .value(let value):
|
||||
return value
|
||||
}
|
||||
} catch {
|
||||
MXLog.error("Falied to convert role to power level value: \(error)")
|
||||
return 0
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user