Skip to content
Snippets Groups Projects
Unverified Commit 0aef6420 authored by cach30verfl0w's avatar cach30verfl0w
Browse files

Don't show presence when user left room

parent e8d0de58
No related branches found
No related tags found
No related merge requests found
......@@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Show correct indicator message when an invitation is rejected or revoked
- Don't show user presence for direct rooms when other user left
### Security
......
package de.connect2x.trixnity.messenger.viewmodel.util
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import net.folivo.trixnity.client.MatrixClient
import net.folivo.trixnity.client.store.membership
import net.folivo.trixnity.client.user
import net.folivo.trixnity.client.user.getAccountData
import net.folivo.trixnity.core.model.RoomId
import net.folivo.trixnity.core.model.UserId
import net.folivo.trixnity.core.model.events.m.DirectEventContent
import net.folivo.trixnity.core.model.events.m.room.Membership
interface DirectRoom {
fun getUsers(matrixClient: MatrixClient, directRoom: RoomId): Flow<List<UserId>>
fun getUsersWithMembership(matrixClient: MatrixClient, directRoom: RoomId): Flow<Map<UserId, Membership?>>
}
class DirectRoomImpl : DirectRoom {
......@@ -24,4 +29,13 @@ class DirectRoomImpl : DirectRoom {
} ?: emptyList()
}
}
override fun getUsersWithMembership(
matrixClient: MatrixClient,
directRoom: RoomId
): Flow<Map<UserId, Membership?>> =
combine(getUsers(matrixClient, directRoom), matrixClient.user.getAll(directRoom)) { userIds, users ->
userIds.associateWith { users[it]?.first()?.membership }
}
}
......@@ -7,6 +7,7 @@ import net.folivo.trixnity.client.user
import net.folivo.trixnity.core.model.RoomId
import net.folivo.trixnity.core.model.events.m.Presence
import net.folivo.trixnity.core.model.events.m.PresenceEventContent
import net.folivo.trixnity.core.model.events.m.room.Membership
interface UserPresence {
fun presentEventContentFlow(
......@@ -26,7 +27,9 @@ class UserPresenceImpl(
): Flow<PresenceEventContent?> {
return combine(
matrixClient.user.userPresence,
directRoom.getUsers(matrixClient, roomId)
directRoom.getUsersWithMembership(matrixClient, roomId).map { users ->
users.filter { (_, membership) -> membership == Membership.JOIN }.map { (id, _) -> id }
}
) { userPresence, otherUsers ->
otherUsers.firstOrNull()?.let { userId ->
userPresence[userId]?.let { presence ->
......
......@@ -20,6 +20,7 @@ import net.folivo.trixnity.core.model.RoomId
import net.folivo.trixnity.core.model.UserId
import net.folivo.trixnity.core.model.events.m.Presence
import net.folivo.trixnity.core.model.events.m.PresenceEventContent
import net.folivo.trixnity.core.model.events.m.room.Membership
import org.koin.dsl.koinApplication
import org.koin.dsl.module
import kotlin.test.Test
......@@ -59,8 +60,8 @@ class UserPresenceTest {
)
)
every { userServiceMock.userPresence } returns userPresenceFlow
every { directRoomMock.getUsers(eq(matrixClientMock), eq(room)) } returns MutableStateFlow(
emptyList()
every { directRoomMock.getUsersWithMembership(eq(matrixClientMock), eq(room)) } returns MutableStateFlow(
emptyMap()
)
val cut = userPresence()
......@@ -78,8 +79,8 @@ class UserPresenceTest {
)
)
every { userServiceMock.userPresence } returns userPresenceFlow
every { directRoomMock.getUsers(eq(matrixClientMock), eq(room)) } returns MutableStateFlow(
listOf(alice)
every { directRoomMock.getUsersWithMembership(eq(matrixClientMock), eq(room)) } returns MutableStateFlow(
mapOf(alice to Membership.JOIN)
)
val cut = userPresence()
......@@ -92,8 +93,8 @@ class UserPresenceTest {
fun `return 'offline' initially when no presence status found`() = runTest {
val userPresenceFlow = MutableStateFlow(mapOf<UserId, PresenceEventContent>())
every { userServiceMock.userPresence } returns userPresenceFlow
every { directRoomMock.getUsers(eq(matrixClientMock), eq(room)) } returns MutableStateFlow(
listOf(alice)
every { directRoomMock.getUsersWithMembership(eq(matrixClientMock), eq(room)) } returns MutableStateFlow(
mapOf(alice to Membership.JOIN)
)
everySuspend { usersApiClientMock.getPresence(alice) } returns Result.failure(RuntimeException("Oh no!"))
......@@ -109,8 +110,8 @@ class UserPresenceTest {
runTest {
val userPresenceFlow = MutableStateFlow(mapOf<UserId, PresenceEventContent>())
every { userServiceMock.userPresence } returns userPresenceFlow
every { directRoomMock.getUsers(eq(matrixClientMock), eq(room)) } returns MutableStateFlow(
listOf(alice)
every { directRoomMock.getUsersWithMembership(eq(matrixClientMock), eq(room)) } returns MutableStateFlow(
mapOf(alice to Membership.JOIN)
)
everySuspend { usersApiClientMock.getPresence(alice) } returns Result.success(PresenceEventContent(presence = Presence.ONLINE))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment