From d30925fd5a84d390308839c118eb4312ff212cd6 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Mon, 19 Sep 2022 20:49:56 +0100 Subject: [PATCH] taking heroes into account when processing room display name --- .../sync/internal/request/ApiSyncResponse.kt | 6 ++++++ .../sync/internal/sync/RoomOverviewProcessor.kt | 15 ++++++++------- .../st/matrix/sync/internal/sync/RoomToProcess.kt | 1 + .../st/matrix/sync/internal/sync/SyncReducer.kt | 2 +- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/request/ApiSyncResponse.kt b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/request/ApiSyncResponse.kt index b4bc9e9..2bc14c2 100644 --- a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/request/ApiSyncResponse.kt +++ b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/request/ApiSyncResponse.kt @@ -56,6 +56,12 @@ internal data class ApiSyncRoom( @SerialName("state") val state: ApiSyncRoomState, @SerialName("account_data") val accountData: ApiAccountData? = null, @SerialName("ephemeral") val ephemeral: ApiEphemeral? = null, + @SerialName("summary") val summary: ApiRoomSummary? = null, +) + +@Serializable +internal data class ApiRoomSummary( + @SerialName("m.heroes") val heroes: List? = null ) @Serializable diff --git a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomOverviewProcessor.kt b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomOverviewProcessor.kt index 7d3b400..f5ac3b4 100644 --- a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomOverviewProcessor.kt +++ b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomOverviewProcessor.kt @@ -15,16 +15,14 @@ internal class RoomOverviewProcessor( suspend fun process(roomToProcess: RoomToProcess, previousState: RoomOverview?, lastMessage: LastMessage?): RoomOverview { val combinedEvents = roomToProcess.apiSyncRoom.state.stateEvents + roomToProcess.apiSyncRoom.timeline.apiTimelineEvents val isEncrypted = combinedEvents.any { it is ApiTimelineEvent.Encryption } - val readMarker = roomToProcess.apiSyncRoom.accountData?.events?.filterIsInstance()?.firstOrNull()?.content?.eventId return when (previousState) { null -> combinedEvents.filterIsInstance().first().let { roomCreate -> - val roomName = roomDisplayName(combinedEvents) + val roomName = roomDisplayName(roomToProcess, combinedEvents) val isGroup = roomToProcess.directMessage == null val processedName = roomName ?: roomToProcess.directMessage?.let { roomMembersService.find(roomToProcess.roomId, it)?.let { it.displayName ?: it.id.value } } - RoomOverview( roomName = processedName, roomCreationUtc = roomCreate.utcTimestamp, @@ -45,7 +43,7 @@ internal class RoomOverviewProcessor( else -> { previousState.copy( - roomName = previousState.roomName ?: roomDisplayName(combinedEvents), + roomName = previousState.roomName ?: roomDisplayName(roomToProcess, combinedEvents), lastMessage = lastMessage ?: previousState.lastMessage, roomAvatarUrl = previousState.roomAvatarUrl ?: roomAvatar( roomToProcess.roomId, @@ -61,10 +59,13 @@ internal class RoomOverviewProcessor( } } - private fun roomDisplayName(combinedEvents: List): String? { - val roomName = combinedEvents.filterIsInstance().lastOrNull() - return (roomName?.content?.name) + private suspend fun roomDisplayName(roomToProcess: RoomToProcess, combinedEvents: List): String? { + val roomName = combinedEvents.filterIsInstance().lastOrNull()?.content?.name ?: combinedEvents.filterIsInstance().lastOrNull()?.content?.alias + ?: roomToProcess.heroes?.let { + roomMembersService.find(roomToProcess.roomId, it).joinToString { it.displayName ?: it.id.value } + } + return roomName?.takeIf { it.isNotEmpty() } } private suspend fun roomAvatar( diff --git a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomToProcess.kt b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomToProcess.kt index 757663c..9c4d7c9 100644 --- a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomToProcess.kt +++ b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomToProcess.kt @@ -10,4 +10,5 @@ internal data class RoomToProcess( val apiSyncRoom: ApiSyncRoom, val directMessage: UserId?, val userCredentials: UserCredentials, + val heroes: List?, ) \ No newline at end of file diff --git a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/SyncReducer.kt b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/SyncReducer.kt index 62cd990..5875854 100644 --- a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/SyncReducer.kt +++ b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/SyncReducer.kt @@ -30,7 +30,6 @@ internal class SyncReducer( suspend fun reduce(isInitialSync: Boolean, sideEffects: SideEffectResult, response: ApiSyncResponse, userCredentials: UserCredentials): ReducerResult { val directMessages = response.directMessages() - val invites = response.rooms?.invite?.map { roomInvite(it, userCredentials) } ?: emptyList() val roomsLeft = findRoomsLeft(response, userCredentials) val newRooms = response.rooms?.join?.keys?.filterNot { roomDataSource.contains(it) } ?: emptyList() @@ -46,6 +45,7 @@ internal class SyncReducer( apiSyncRoom = apiRoom, directMessage = directMessages[roomId], userCredentials = userCredentials, + heroes = apiRoom.summary?.heroes, ), isInitialSync = isInitialSync )