From d189dce7f002ebaf3579e4a0b8c5e920bd315864 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 27 Aug 2023 12:16:13 -0400 Subject: [PATCH] Extracts chatroom from user file --- .../vitorpamplona/amethyst/model/Chatroom.kt | 63 +++++++++++++++++++ .../com/vitorpamplona/amethyst/model/User.kt | 56 ----------------- 2 files changed, 63 insertions(+), 56 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/model/Chatroom.kt diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Chatroom.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Chatroom.kt new file mode 100644 index 000000000..e23b02956 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Chatroom.kt @@ -0,0 +1,63 @@ +package com.vitorpamplona.amethyst.model + +import androidx.compose.runtime.Stable +import com.vitorpamplona.amethyst.service.checkNotInMainThread +import com.vitorpamplona.quartz.encoders.HexKey +import com.vitorpamplona.quartz.utils.TimeUtils + +@Stable +class Chatroom() { + var roomMessages: Set = setOf() + var subject: String? = null + var subjectCreatedAt: Long? = null + + @Synchronized + fun addMessageSync(msg: Note) { + checkNotInMainThread() + + if (msg !in roomMessages) { + roomMessages = roomMessages + msg + + val newSubject = msg.event?.subject() + + if (newSubject != null && (msg.createdAt() ?: 0) > (subjectCreatedAt ?: 0)) { + subject = newSubject + subjectCreatedAt = msg.createdAt() + } + } + } + + @Synchronized + fun removeMessageSync(msg: Note) { + checkNotInMainThread() + + if (msg !in roomMessages) { + roomMessages = roomMessages + msg + + roomMessages.filter { it.event?.subject() != null }.sortedBy { it.createdAt() }.lastOrNull()?.let { + subject = it.event?.subject() + subjectCreatedAt = it.createdAt() + } + } + } + + fun senderIntersects(keySet: Set): Boolean { + return roomMessages.any { it.author?.pubkeyHex in keySet } + } + + fun pruneMessagesToTheLatestOnly(): Set { + val sorted = roomMessages.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() + + val toKeep = if ((sorted.firstOrNull()?.createdAt() ?: 0) > TimeUtils.oneWeekAgo()) { + // Recent messages, keep last 100 + sorted.take(100).toSet() + } else { + // Old messages, keep the last one. + sorted.take(1).toSet() + } + sorted.filter { it.liveSet?.isInUse() ?: false } + + val toRemove = roomMessages.minus(toKeep) + roomMessages = toKeep + return toRemove + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt index d46bdcc76..1941864ad 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -440,62 +440,6 @@ data class RelayInfo( var counter: Long ) -@Stable -class Chatroom() { - var roomMessages: Set = setOf() - var subject: String? = null - var subjectCreatedAt: Long? = null - - @Synchronized - fun addMessageSync(msg: Note) { - checkNotInMainThread() - - if (msg !in roomMessages) { - roomMessages = roomMessages + msg - - val newSubject = msg.event?.subject() - - if (newSubject != null && (msg.createdAt() ?: 0) > (subjectCreatedAt ?: 0)) { - subject = newSubject - subjectCreatedAt = msg.createdAt() - } - } - } - - @Synchronized - fun removeMessageSync(msg: Note) { - checkNotInMainThread() - - if (msg !in roomMessages) { - roomMessages = roomMessages + msg - - roomMessages.filter { it.event?.subject() != null }.sortedBy { it.createdAt() }.lastOrNull()?.let { - subject = it.event?.subject() - subjectCreatedAt = it.createdAt() - } - } - } - - fun senderIntersects(keySet: Set): Boolean { - return roomMessages.any { it.author?.pubkeyHex in keySet } - } - - fun pruneMessagesToTheLatestOnly(): Set { - val sorted = roomMessages.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() - - val toKeep = if ((sorted.firstOrNull()?.createdAt() ?: 0) > TimeUtils.oneWeekAgo()) { - // Recent messages, keep last 100 - sorted.take(100).toSet() - } else { - // Old messages, keep the last one. - sorted.take(1).toSet() - } + sorted.filter { it.liveSet?.isInUse() ?: false } - - val toRemove = roomMessages.minus(toKeep) - roomMessages = toKeep - return toRemove - } -} class UserLiveData(val user: User) : LiveData(UserState(user)) { // Refreshes observers in batches.