misc(power level) : use new api
This commit is contained in:
parent
44535243ef
commit
d654280e30
29 changed files with 312 additions and 334 deletions
|
|
@ -130,57 +130,6 @@ interface BaseRoom : Closeable {
|
|||
*/
|
||||
suspend fun forget(): Result<Unit>
|
||||
|
||||
/**
|
||||
* Returns `true` if the user with the provided [userId] can invite other users to the room.
|
||||
*/
|
||||
suspend fun canUserInvite(userId: UserId): Result<Boolean>
|
||||
|
||||
/**
|
||||
* Returns `true` if the user with the provided [userId] can kick other users from the room.
|
||||
*/
|
||||
suspend fun canUserKick(userId: UserId): Result<Boolean>
|
||||
|
||||
/**
|
||||
* Returns `true` if the user with the provided [userId] can ban other users from the room.
|
||||
*/
|
||||
suspend fun canUserBan(userId: UserId): Result<Boolean>
|
||||
|
||||
/**
|
||||
* Returns `true` if the user with the provided [userId] can redact their own messages.
|
||||
*/
|
||||
suspend fun canUserRedactOwn(userId: UserId): Result<Boolean>
|
||||
|
||||
/**
|
||||
* Returns `true` if the user with the provided [userId] can redact messages from other users.
|
||||
*/
|
||||
suspend fun canUserRedactOther(userId: UserId): Result<Boolean>
|
||||
|
||||
/**
|
||||
* Returns `true` if the user with the provided [userId] can send state events.
|
||||
*/
|
||||
suspend fun canUserSendState(userId: UserId, type: StateEventType): Result<Boolean>
|
||||
|
||||
/**
|
||||
* Returns `true` if the user with the provided [userId] can send messages.
|
||||
*/
|
||||
suspend fun canUserSendMessage(userId: UserId, type: MessageEventType): Result<Boolean>
|
||||
|
||||
/**
|
||||
* Returns `true` if the user with the provided [userId] can trigger an `@room` notification.
|
||||
*/
|
||||
suspend fun canUserTriggerRoomNotification(userId: UserId): Result<Boolean>
|
||||
|
||||
/**
|
||||
* Returns `true` if the user with the provided [userId] can pin or unpin messages.
|
||||
*/
|
||||
suspend fun canUserPinUnpin(userId: UserId): Result<Boolean>
|
||||
|
||||
/**
|
||||
* Returns `true` if the user with the provided [userId] can join or starts calls.
|
||||
*/
|
||||
suspend fun canUserJoinCall(userId: UserId): Result<Boolean> =
|
||||
canUserSendState(userId, StateEventType.CALL_MEMBER)
|
||||
|
||||
/**
|
||||
* Sets the room as favorite or not, based on the [isFavorite] parameter.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -7,9 +7,18 @@
|
|||
|
||||
package io.element.android.libraries.matrix.api.room.powerlevels
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.State
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.remember
|
||||
import io.element.android.libraries.matrix.api.core.UserId
|
||||
import io.element.android.libraries.matrix.api.room.BaseRoom
|
||||
import io.element.android.libraries.matrix.api.room.MessageEventType
|
||||
import io.element.android.libraries.matrix.api.room.StateEventType
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.map
|
||||
import timber.log.Timber
|
||||
|
||||
/**
|
||||
* Provides information about the permissions of users in a room.
|
||||
|
|
@ -120,23 +129,38 @@ interface RoomPermissions : AutoCloseable {
|
|||
fun canUserTriggerRoomNotification(userId: UserId): Boolean
|
||||
}
|
||||
|
||||
fun RoomPermissions.canEditRoomDetails(): Boolean {
|
||||
return canOwnUserSendState(StateEventType.ROOM_NAME) ||
|
||||
canOwnUserSendState(StateEventType.ROOM_TOPIC) ||
|
||||
canOwnUserSendState(StateEventType.ROOM_AVATAR)
|
||||
}
|
||||
|
||||
fun RoomPermissions.canManageKnockRequests(): Boolean {
|
||||
return canOwnUserInvite() || canOwnUserBan() || canOwnUserKick()
|
||||
}
|
||||
|
||||
fun RoomPermissions.canEditSecurityAndPrivacy(): Boolean {
|
||||
return canOwnUserSendState(StateEventType.ROOM_JOIN_RULES) ||
|
||||
canOwnUserSendState(StateEventType.ROOM_HISTORY_VISIBILITY) ||
|
||||
canOwnUserSendState(StateEventType.ROOM_CANONICAL_ALIAS) ||
|
||||
canOwnUserSendState(StateEventType.ROOM_ENCRYPTION)
|
||||
}
|
||||
|
||||
fun RoomPermissions.canEditRolesAndPermissions(): Boolean {
|
||||
return canOwnUserSendState(StateEventType.ROOM_POWER_LEVELS)
|
||||
}
|
||||
|
||||
fun RoomPermissions.canCall(): Boolean {
|
||||
return canOwnUserSendState(StateEventType.CALL_MEMBER)
|
||||
}
|
||||
|
||||
fun <T> Result<RoomPermissions>.use(default: T, block: (RoomPermissions) -> T): T {
|
||||
return fold(
|
||||
onSuccess = { perms ->
|
||||
perms.use(block)
|
||||
},
|
||||
onFailure = {
|
||||
default
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fun <T> BaseRoom.permissionsFlow(default: T, block: (RoomPermissions) -> T): Flow<T> {
|
||||
return roomInfoFlow
|
||||
.map { info -> info.roomPowerLevels }
|
||||
.distinctUntilChanged()
|
||||
.map {
|
||||
roomPermissions().use(default, block)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun <T> BaseRoom.permissionsAsState(default: T, block: (RoomPermissions) -> T): State<T> {
|
||||
return remember(this, default, block) {
|
||||
Timber.d("Computing permissionsAsState for room $roomId with default=$default")
|
||||
permissionsFlow(default, block)
|
||||
}.collectAsState(default)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,11 +8,6 @@
|
|||
|
||||
package io.element.android.libraries.matrix.api.room.powerlevels
|
||||
|
||||
import io.element.android.libraries.core.extensions.runCatchingExceptions
|
||||
import io.element.android.libraries.matrix.api.room.BaseRoom
|
||||
import io.element.android.libraries.matrix.api.room.MessageEventType
|
||||
import io.element.android.libraries.matrix.api.room.StateEventType
|
||||
|
||||
data class RoomPowerLevelsValues(
|
||||
val ban: Long,
|
||||
val invite: Long,
|
||||
|
|
@ -24,50 +19,3 @@ data class RoomPowerLevelsValues(
|
|||
val roomTopic: Long,
|
||||
val spaceChild: Long,
|
||||
)
|
||||
|
||||
/**
|
||||
* Shortcut for calling [BaseRoom.canUserInvite] with our own user.
|
||||
*/
|
||||
suspend fun BaseRoom.canInvite(): Result<Boolean> = canUserInvite(sessionId)
|
||||
|
||||
/**
|
||||
* Shortcut for calling [BaseRoom.canUserKick] with our own user.
|
||||
*/
|
||||
suspend fun BaseRoom.canKick(): Result<Boolean> = canUserKick(sessionId)
|
||||
|
||||
/**
|
||||
* Shortcut for calling [BaseRoom.canUserBan] with our own user.
|
||||
*/
|
||||
suspend fun BaseRoom.canBan(): Result<Boolean> = canUserBan(sessionId)
|
||||
|
||||
/**
|
||||
* Shortcut for calling [BaseRoom.canUserSendState] with our own user.
|
||||
*/
|
||||
suspend fun BaseRoom.canSendState(type: StateEventType): Result<Boolean> = canUserSendState(sessionId, type)
|
||||
|
||||
/**
|
||||
* Shortcut for calling [BaseRoom.canUserSendMessage] with our own user.
|
||||
*/
|
||||
suspend fun BaseRoom.canSendMessage(type: MessageEventType): Result<Boolean> = canUserSendMessage(sessionId, type)
|
||||
|
||||
/**
|
||||
* Shortcut for calling [BaseRoom.canUserRedactOwn] with our own user.
|
||||
*/
|
||||
suspend fun BaseRoom.canRedactOwn(): Result<Boolean> = canUserRedactOwn(sessionId)
|
||||
|
||||
/**
|
||||
* Shortcut for calling [BaseRoom.canRedactOther] with our own user.
|
||||
*/
|
||||
suspend fun BaseRoom.canRedactOther(): Result<Boolean> = canUserRedactOther(sessionId)
|
||||
|
||||
/**
|
||||
* Shortcut for checking if current user can handle knock requests.
|
||||
*/
|
||||
suspend fun BaseRoom.canHandleKnockRequests(): Result<Boolean> = runCatchingExceptions {
|
||||
canInvite().getOrThrow() || canBan().getOrThrow() || canKick().getOrThrow()
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut for calling [BaseRoom.canUserPinUnpin] with our own user.
|
||||
*/
|
||||
suspend fun BaseRoom.canPinUnpin(): Result<Boolean> = canUserPinUnpin(sessionId)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue