Fix removeDuplicates

This commit is contained in:
bemusementpark 2024-08-05 13:46:55 +09:30
parent f9ace6a9b9
commit 2960eddd85
2 changed files with 21 additions and 18 deletions

View File

@ -142,8 +142,7 @@ class Poller(private val configFactory: ConfigFactoryProtocol, debounceTimer: Ti
val messages = rawMessages["messages"] as? List<*> val messages = rawMessages["messages"] as? List<*>
val processed = if (!messages.isNullOrEmpty()) { val processed = if (!messages.isNullOrEmpty()) {
SnodeAPI.updateLastMessageHashValueIfPossible(snode, userPublicKey, messages, namespace) SnodeAPI.updateLastMessageHashValueIfPossible(snode, userPublicKey, messages, namespace)
SnodeAPI.removeDuplicates(userPublicKey, messages, namespace, true).mapNotNull { messageBody -> SnodeAPI.removeDuplicates(userPublicKey, messages, namespace, true).mapNotNull { rawMessageAsJSON ->
val rawMessageAsJSON = messageBody as? Map<*, *> ?: return@mapNotNull null
val hashValue = rawMessageAsJSON["hash"] as? String ?: return@mapNotNull null val hashValue = rawMessageAsJSON["hash"] as? String ?: return@mapNotNull null
val b64EncodedBody = rawMessageAsJSON["data"] as? String ?: return@mapNotNull null val b64EncodedBody = rawMessageAsJSON["data"] as? String ?: return@mapNotNull null
val timestamp = rawMessageAsJSON["t"] as? Long ?: SnodeAPI.nowWithOffset val timestamp = rawMessageAsJSON["t"] as? Long ?: SnodeAPI.nowWithOffset

View File

@ -660,29 +660,33 @@ object SnodeAPI {
} }
} }
fun removeDuplicates(publicKey: String, rawMessages: List<*>, namespace: Int, updateStoredHashes: Boolean): List<*> { /**
val originalMessageHashValues = database.getReceivedMessageHashValues(publicKey, namespace) ?: emptySet() *
val receivedMessageHashValues = originalMessageHashValues.toMutableSet() *
return rawMessages.filter { rawMessage -> * TODO Use a db transaction, synchronizing is sufficient for now because
(rawMessage as? Map<*, *>) * database#setReceivedMessageHashValues is only called here.
?.let { it["hash"] as? String } */
?.let { receivedMessageHashValues.add(it) } @Synchronized
?: false.also { Log.d("Loki", "Missing hash value for message: ${rawMessage?.prettifiedDescription()}.") } fun removeDuplicates(publicKey: String, rawMessages: List<*>, namespace: Int, updateStoredHashes: Boolean): List<Map<*, *>> {
val hashValues = database.getReceivedMessageHashValues(publicKey, namespace)?.toMutableSet() ?: mutableSetOf()
return rawMessages.filterIsInstance<Map<*, *>>().filter { rawMessage ->
val hash = rawMessage["hash"] as? String
hash ?: Log.d("Loki", "Missing hash value for message: ${rawMessage.prettifiedDescription()}.")
hash?.let(hashValues::add) == true
}.also { }.also {
if (updateStoredHashes && originalMessageHashValues.containsAll(receivedMessageHashValues)) { if (updateStoredHashes && it.isNotEmpty()) {
database.setReceivedMessageHashValues(publicKey, receivedMessageHashValues, namespace) database.setReceivedMessageHashValues(publicKey, hashValues, namespace)
} }
} }
} }
private fun parseEnvelopes(rawMessages: List<*>): List<Pair<SignalServiceProtos.Envelope, String?>> = rawMessages.mapNotNull { rawMessage -> private fun parseEnvelopes(rawMessages: List<Map<*, *>>): List<Pair<SignalServiceProtos.Envelope, String?>> = rawMessages.mapNotNull { rawMessage ->
val rawMessageAsJSON = rawMessage as? Map<*, *> val base64EncodedData = rawMessage["data"] as? String
val base64EncodedData = rawMessageAsJSON?.get("data") as? String val data = base64EncodedData?.let(Base64::decode)
val data = base64EncodedData?.let { Base64.decode(it) }
data ?: Log.d("Loki", "Failed to decode data for message: ${rawMessage?.prettifiedDescription()}.") data ?: Log.d("Loki", "Failed to decode data for message: ${rawMessage.prettifiedDescription()}.")
data?.runCatching { MessageWrapper.unwrap(this) to rawMessageAsJSON["hash"] as? String } data?.runCatching { MessageWrapper.unwrap(this) to rawMessage["hash"] as? String }
?.onFailure { Log.d("Loki", "Failed to unwrap data for message: ${rawMessage.prettifiedDescription()}.") } ?.onFailure { Log.d("Loki", "Failed to unwrap data for message: ${rawMessage.prettifiedDescription()}.") }
?.getOrNull() ?.getOrNull()
} }