Tweak the power levels when creating a space (#6012)

* Tweak the power levels when creating a space

* Also tweak the `invite` power levels for public access rooms
This commit is contained in:
Jorge Martin Espinosa 2026-01-19 10:54:33 +01:00 committed by GitHub
parent acf919f2fb
commit ccd358ece5

View file

@ -370,6 +370,9 @@ class RustMatrixClient(
override suspend fun createRoom(createRoomParams: CreateRoomParameters): Result<RoomId> = withContext(sessionDispatcher) { override suspend fun createRoom(createRoomParams: CreateRoomParameters): Result<RoomId> = withContext(sessionDispatcher) {
runCatchingExceptions { runCatchingExceptions {
val hasPublicAccess = createRoomParams.preset == RoomPreset.PUBLIC_CHAT || createRoomParams.joinRuleOverride == JoinRule.Public
val powerLevels = defaultRoomCreationPowerLevels(isSpace = createRoomParams.isSpace, isPublic = hasPublicAccess)
val rustParams = RustCreateRoomParameters( val rustParams = RustCreateRoomParameters(
name = createRoomParams.name, name = createRoomParams.name,
topic = createRoomParams.topic, topic = createRoomParams.topic,
@ -383,12 +386,12 @@ class RustMatrixClient(
}, },
invite = createRoomParams.invite?.map { it.value }, invite = createRoomParams.invite?.map { it.value },
avatar = createRoomParams.avatar, avatar = createRoomParams.avatar,
powerLevelContentOverride = defaultRoomCreationPowerLevels.copy( powerLevelContentOverride = powerLevels.copy(
invite = if (createRoomParams.joinRuleOverride == JoinRule.Knock) { invite = if (createRoomParams.joinRuleOverride == JoinRule.Knock) {
// override the invite power level so it's the same as kick. // override the invite power level so it's the same as kick.
RoomMember.Role.Moderator.powerLevel.toInt() RoomMember.Role.Moderator.powerLevel.toInt()
} else { } else {
null powerLevels.invite
} }
), ),
joinRuleOverride = createRoomParams.joinRuleOverride?.map(), joinRuleOverride = createRoomParams.joinRuleOverride?.map(),
@ -833,18 +836,23 @@ class RustMatrixClient(
} }
} }
private val defaultRoomCreationPowerLevels = PowerLevels( private fun defaultRoomCreationPowerLevels(isPublic: Boolean, isSpace: Boolean) = PowerLevels(
usersDefault = null, usersDefault = null,
eventsDefault = null, // Only admins should be able to send events in general
eventsDefault = if (isSpace) 100 else null,
stateDefault = null, stateDefault = null,
ban = null, ban = null,
kick = null, kick = null,
redact = null, redact = null,
invite = null, invite = if (isPublic) 0 else 50,
notifications = null, notifications = null,
users = mapOf(), users = mapOf(),
events = mapOf( events = if (!isSpace) {
"m.call.member" to 0, mapOf(
"org.matrix.msc3401.call.member" to 0, "m.call.member" to 0,
) "org.matrix.msc3401.call.member" to 0,
)
} else {
mapOf()
}
) )