SDK Update + PowerLevels API update (#4366)

* update the sdk, and updated the power levels APIs

Revert "update the sdk, and updated the power levels APIs"

This reverts commit d3b291003d2b6fd6346ef7e445af4970fda62348.

x

* pr suggestions
This commit is contained in:
Mauro
2025-07-30 16:42:45 +02:00
committed by GitHub
parent 1b90815e10
commit e70e1f36b2
25 changed files with 141 additions and 88 deletions
@@ -12,7 +12,7 @@ struct RoomInfoProxy: RoomInfoProxyProtocol {
let roomInfo: RoomInfo
var id: String { roomInfo.id }
var creator: String? { roomInfo.creator }
var creators: [String] { roomInfo.creators ?? [] }
var displayName: String? { roomInfo.displayName }
var rawName: String? { roomInfo.rawName }
var topic: String? { roomInfo.topic }
@@ -26,7 +26,7 @@ protocol BaseRoomInfoProxyProtocol {
// sourcery: AutoMockable
protocol RoomInfoProxyProtocol: BaseRoomInfoProxyProtocol {
var id: String { get }
var creator: String? { get }
var creators: [String] { get }
var displayName: String? { get }
var rawName: String? { get }
var topic: String? { get }
@@ -21,7 +21,7 @@ struct RoomMemberDetails: Identifiable, Hashable {
enum Role { case administrator, moderator, user }
let role: Role
let powerLevel: Int
let powerLevel: RoomPowerLevel
func matches(searchQuery: String) -> Bool {
guard !searchQuery.isEmpty else { return true }
@@ -47,7 +47,8 @@ extension RoomMemberDetails {
extension RoomMemberDetails.Role {
init(_ role: RoomMemberRole) {
self = switch role {
case .administrator: .administrator
// TODO: Implement creator role
case .creator, .administrator: .administrator
case .moderator: .moderator
case .user: .user
}
@@ -35,7 +35,7 @@ final class RoomMemberProxy: RoomMemberProxyProtocol {
var isIgnored: Bool { member.isIgnored }
var powerLevel: Int { Int(member.powerLevel) }
var powerLevel: RoomPowerLevel { .init(rustPowerLevel: member.powerLevel) }
var role: RoomMemberRole { member.suggestedRoleForPowerLevel }
}
@@ -23,7 +23,7 @@ protocol RoomMemberProxyProtocol: AnyObject {
var isIgnored: Bool { get }
var powerLevel: Int { get }
var powerLevel: RoomPowerLevel { get }
var role: RoomMemberRole { get }
}
@@ -71,22 +71,27 @@ struct RoomPermissions {
extension RoomPermissions {
/// Create permissions from the room's power levels.
init(powerLevels: RoomPowerLevelsValues) {
ban = RoomMemberDetails.Role(rustPowerLevel: powerLevels.ban)
invite = RoomMemberDetails.Role(rustPowerLevel: powerLevels.invite)
kick = RoomMemberDetails.Role(rustPowerLevel: powerLevels.kick)
redact = RoomMemberDetails.Role(rustPowerLevel: powerLevels.redact)
eventsDefault = RoomMemberDetails.Role(rustPowerLevel: powerLevels.eventsDefault)
stateDefault = RoomMemberDetails.Role(rustPowerLevel: powerLevels.stateDefault)
usersDefault = RoomMemberDetails.Role(rustPowerLevel: powerLevels.usersDefault)
roomName = RoomMemberDetails.Role(rustPowerLevel: powerLevels.roomName)
roomAvatar = RoomMemberDetails.Role(rustPowerLevel: powerLevels.roomAvatar)
roomTopic = RoomMemberDetails.Role(rustPowerLevel: powerLevels.roomTopic)
ban = RoomMemberDetails.Role(powerLevelValue: powerLevels.ban)
invite = RoomMemberDetails.Role(powerLevelValue: powerLevels.invite)
kick = RoomMemberDetails.Role(powerLevelValue: powerLevels.kick)
redact = RoomMemberDetails.Role(powerLevelValue: powerLevels.redact)
eventsDefault = RoomMemberDetails.Role(powerLevelValue: powerLevels.eventsDefault)
stateDefault = RoomMemberDetails.Role(powerLevelValue: powerLevels.stateDefault)
usersDefault = RoomMemberDetails.Role(powerLevelValue: powerLevels.usersDefault)
roomName = RoomMemberDetails.Role(powerLevelValue: powerLevels.roomName)
roomAvatar = RoomMemberDetails.Role(powerLevelValue: powerLevels.roomAvatar)
roomTopic = RoomMemberDetails.Role(powerLevelValue: powerLevels.roomTopic)
}
}
extension RoomMemberDetails.Role {
init(rustPowerLevel: Int64) {
self.init(suggestedRoleForPowerLevel(powerLevel: rustPowerLevel))
init(powerLevelValue: Int64) {
do {
try self.init(suggestedRoleForPowerLevel(powerLevel: .value(value: powerLevelValue)))
} catch {
MXLog.error("Falied to convert power level value to role: \(error)")
self.init(.user)
}
}
var rustRole: RoomMemberRole {
@@ -100,7 +105,20 @@ extension RoomMemberDetails.Role {
}
}
var rustPowerLevel: Int64 {
suggestedPowerLevelForRole(role: rustRole)
/// 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 {
do {
switch try suggestedPowerLevelForRole(role: rustRole) {
case .infinite:
// Would be better if the SDK would return this, maybe a `suggestedPowerLevelValueForRole` function would solve the problem
return 150
case .value(let value):
return value
}
} catch {
MXLog.error("Falied to convert role to power level value: \(error)")
return 0
}
}
}
@@ -0,0 +1,41 @@
//
// 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 RoomPowerLevel: Hashable, Comparable {
case value(Int)
case infinite
init(rustPowerLevel: PowerLevel) {
self = rustPowerLevel.toRoomPowerLevel
}
init(value: Int) {
self = .value(value)
}
init(value: Int64) {
self = .value(Int(value))
}
var rustPowerLevel: PowerLevel {
switch self {
case .infinite: .infinite
case .value(let value): .value(value: Int64(value))
}
}
}
extension PowerLevel {
var toRoomPowerLevel: RoomPowerLevel {
switch self {
case .infinite: .infinite
case .value(let value): .value(Int(value))
}
}
}
@@ -27,8 +27,13 @@ struct RoomPowerLevelsProxy: RoomPowerLevelsProxyProtocol {
}
func suggestedRole(forUser userID: String) -> RoomMemberRole {
let powerLevel = powerLevels.userPowerLevels()[userID] ?? values.usersDefault
return suggestedRoleForPowerLevel(powerLevel: powerLevel)
do {
let powerLevelValue = powerLevels.userPowerLevels()[userID] ?? values.usersDefault
return try suggestedRoleForPowerLevel(powerLevel: .value(value: powerLevelValue))
} catch {
MXLog.error("Falied to get suggested role for user: \(error)")
return .user
}
}
func canOwnUser(sendMessage messageType: MessageLikeEventType) -> Bool {