mirror of
https://github.com/oxen-io/session-android.git
synced 2025-03-31 04:02:15 +00:00
Fix removeDuplicates
This commit is contained in:
parent
f9ace6a9b9
commit
2960eddd85
@ -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
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user