Merge pull request #6865 from bxdxnn/feat/myroomnick

Add `/myroomnick` slash command to change your display name in the current room
This commit is contained in:
Benoit Marty
2026-06-05 14:24:50 +02:00
committed by GitHub
6 changed files with 34 additions and 9 deletions
@@ -212,4 +212,11 @@ interface JoinedRoom : BaseRoom {
* @return Result indicating success or failure.
*/
suspend fun sendLiveLocation(geoUri: String): Result<Unit>
/**
* Sets the display name of the current user within this room.
* This is different from the global setDisplayName which updates
* the user's display name across all of their rooms.
*/
suspend fun setOwnMemberDisplayName(displayName: String): Result<Unit>
}
@@ -548,6 +548,12 @@ class JoinedRustRoom(
}
}
override suspend fun setOwnMemberDisplayName(displayName: String): Result<Unit> = withContext(roomDispatcher) {
runCatchingExceptions {
innerRoom.setOwnMemberDisplayName(displayName)
}
}
override fun close() = destroy()
override fun destroy() {
@@ -92,6 +92,7 @@ class FakeJoinedRoom(
private val startLiveLocationShareResult: (Long) -> Result<EventId> = { lambdaError() },
private val stopLiveLocationShareResult: () -> Result<Unit> = { lambdaError() },
private val sendLiveLocationResult: (String) -> Result<Unit> = { lambdaError() },
private val setOwnMemberDisplayNameResult: (String) -> Result<Unit> = { lambdaError() },
) : JoinedRoom, BaseRoom by baseRoom {
private val sendQueueUpdates = MutableSharedFlow<SendQueueUpdate>(extraBufferCapacity = 10)
@@ -255,6 +256,10 @@ class FakeJoinedRoom(
sendLiveLocationResult(geoUri)
}
override suspend fun setOwnMemberDisplayName(displayName: String): Result<Unit> = simulateLongTask {
setOwnMemberDisplayNameResult(displayName)
}
private suspend fun simulateSendMediaProgress(progressCallback: ProgressCallback?) {
progressCallbackValues.forEach { (current, total) ->
progressCallback?.onProgress(current, total)
@@ -109,7 +109,7 @@ enum class Command(
parameters = "<display-name>",
description = R.string.slash_command_description_nick_for_room,
isAllowedInThread = false,
isSupported = false,
isSupported = true,
),
ROOM_AVATAR(
command = "/roomavatar",
@@ -47,7 +47,7 @@ class CommandExecutor(
is SlashCommand.ChangeAvatar -> changeAvatar()
is SlashCommand.ChangeAvatarForRoom -> changeAvatarForRoom()
is SlashCommand.ChangeDisplayName -> changeDisplayName(slashCommand)
is SlashCommand.ChangeDisplayNameForRoom -> changeDisplayNameForRoom()
is SlashCommand.ChangeDisplayNameForRoom -> changeDisplayNameForRoom(slashCommand)
is SlashCommand.ChangeRoomAvatar -> changeRoomAvatar()
is SlashCommand.ChangeRoomName -> changeRoomName(slashCommand)
is SlashCommand.ChangeTopic -> changeTopic(slashCommand)
@@ -171,8 +171,8 @@ class CommandExecutor(
return Result.failure(Exception("Not yet implemented"))
}
private fun changeDisplayNameForRoom(): Result<Unit> {
return Result.failure(Exception("Not yet implemented"))
private suspend fun changeDisplayNameForRoom(slashCommand: SlashCommand.ChangeDisplayNameForRoom): Result<Unit> {
return joinedRoom.setOwnMemberDisplayName(slashCommand.displayName)
}
private suspend fun changeDisplayName(slashCommand: SlashCommand.ChangeDisplayName): Result<Unit> {
@@ -14,7 +14,6 @@ import io.element.android.libraries.matrix.api.timeline.MsgType
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
import io.element.android.libraries.matrix.test.A_MESSAGE
import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.A_USER_NAME
import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.room.FakeBaseRoom
import io.element.android.libraries.matrix.test.room.FakeJoinedRoom
@@ -185,10 +184,18 @@ class CommandExecutorTest {
}
@Test
fun `change display name for room is not supported`() = runTest {
val sut = createCommandExecutor()
val res = sut.proceedAdmin(SlashCommand.ChangeDisplayNameForRoom(A_USER_NAME))
assertThat(res.isFailure).isTrue()
fun `change display name for room delegates to joined room`() = runTest {
var capturedDisplayName: String? = null
val joinedRoom = FakeJoinedRoom(
setOwnMemberDisplayNameResult = { displayName ->
capturedDisplayName = displayName
Result.success(Unit)
}
)
val sut = createCommandExecutor(joinedRoom = joinedRoom)
val res = sut.proceedAdmin(SlashCommand.ChangeDisplayNameForRoom("room nick"))
assertThat(res.isSuccess).isTrue()
assertThat(capturedDisplayName).isEqualTo("room nick")
}
@Test