mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-06-13 05:37:48 +02:00
fix(message_logger): persistent after logout/clean cache
This commit is contained in:
@ -98,7 +98,7 @@ class BridgeClient(
|
|||||||
|
|
||||||
fun getMessageLoggerMessage(conversationId: String, id: Long): ByteArray? = service.getMessageLoggerMessage(conversationId, id)
|
fun getMessageLoggerMessage(conversationId: String, id: Long): ByteArray? = service.getMessageLoggerMessage(conversationId, id)
|
||||||
|
|
||||||
fun addMessageLoggerMessage(conversationId: String,id: Long, message: ByteArray) = service.addMessageLoggerMessage(conversationId, id, message)
|
fun addMessageLoggerMessage(conversationId: String, id: Long, message: ByteArray) = service.addMessageLoggerMessage(conversationId, id, message)
|
||||||
|
|
||||||
fun deleteMessageLoggerMessage(conversationId: String, id: Long) = service.deleteMessageLoggerMessage(conversationId, id)
|
fun deleteMessageLoggerMessage(conversationId: String, id: Long) = service.deleteMessageLoggerMessage(conversationId, id)
|
||||||
|
|
||||||
|
@ -431,8 +431,8 @@ class MediaDownloader : Feature("MediaDownloader", loadParams = FeatureLoadParam
|
|||||||
//check if the messageId
|
//check if the messageId
|
||||||
var contentType: ContentType = ContentType.fromId(message.contentType)
|
var contentType: ContentType = ContentType.fromId(message.contentType)
|
||||||
|
|
||||||
if (messageLogger.isMessageRemoved(message.clientMessageId.toLong())) {
|
if (messageLogger.isMessageRemoved(message.clientConversationId!!, message.serverMessageId.toLong())) {
|
||||||
val messageObject = messageLogger.getMessageObject(message.clientConversationId!!, message.clientMessageId.toLong()) ?: throw Exception("Message not found in database")
|
val messageObject = messageLogger.getMessageObject(message.clientConversationId!!, message.serverMessageId.toLong()) ?: throw Exception("Message not found in database")
|
||||||
isArroyoMessage = false
|
isArroyoMessage = false
|
||||||
val messageContentObject = messageObject.getAsJsonObject("mMessageContent")
|
val messageContentObject = messageObject.getAsJsonObject("mMessageContent")
|
||||||
|
|
||||||
|
@ -15,6 +15,13 @@ import java.util.concurrent.Executors
|
|||||||
import kotlin.time.ExperimentalTime
|
import kotlin.time.ExperimentalTime
|
||||||
import kotlin.time.measureTime
|
import kotlin.time.measureTime
|
||||||
|
|
||||||
|
private fun Any.longHashCode(): Long {
|
||||||
|
var h = 1125899906842597L
|
||||||
|
val value = this.toString()
|
||||||
|
for (element in value) h = 31 * h + element.code.toLong()
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
class MessageLogger : Feature("MessageLogger",
|
class MessageLogger : Feature("MessageLogger",
|
||||||
loadParams = FeatureLoadParams.INIT_SYNC or
|
loadParams = FeatureLoadParams.INIT_SYNC or
|
||||||
FeatureLoadParams.ACTIVITY_CREATE_ASYNC
|
FeatureLoadParams.ACTIVITY_CREATE_ASYNC
|
||||||
@ -32,23 +39,31 @@ class MessageLogger : Feature("MessageLogger",
|
|||||||
|
|
||||||
private val myUserId by lazy { context.database.getMyUserId() }
|
private val myUserId by lazy { context.database.getMyUserId() }
|
||||||
|
|
||||||
fun isMessageRemoved(messageId: Long) = deletedMessageCache.containsKey(messageId)
|
fun isMessageRemoved(conversationId: String, orderKey: Long) = deletedMessageCache.containsKey(computeMessageIdentifier(conversationId, orderKey))
|
||||||
|
|
||||||
fun deleteMessage(conversationId: String, messageId: Long) {
|
fun deleteMessage(conversationId: String, clientMessageId: Long) {
|
||||||
fetchedMessages.remove(messageId)
|
val serverMessageId = getServerMessageIdentifier(conversationId, clientMessageId) ?: return
|
||||||
deletedMessageCache.remove(messageId)
|
fetchedMessages.remove(serverMessageId)
|
||||||
context.bridgeClient.deleteMessageLoggerMessage(conversationId, messageId)
|
deletedMessageCache.remove(serverMessageId)
|
||||||
|
context.bridgeClient.deleteMessageLoggerMessage(conversationId, serverMessageId)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getMessageObject(conversationId: String, messageId: Long): JsonObject? {
|
fun getMessageObject(conversationId: String, orderKey: Long): JsonObject? {
|
||||||
if (deletedMessageCache.containsKey(messageId)) {
|
val messageIdentifier = computeMessageIdentifier(conversationId, orderKey)
|
||||||
return deletedMessageCache[messageId]
|
if (deletedMessageCache.containsKey(messageIdentifier)) {
|
||||||
|
return deletedMessageCache[messageIdentifier]
|
||||||
}
|
}
|
||||||
return context.bridgeClient.getMessageLoggerMessage(conversationId, messageId)?.let {
|
return context.bridgeClient.getMessageLoggerMessage(conversationId, messageIdentifier)?.let {
|
||||||
JsonParser.parseString(it.toString(Charsets.UTF_8)).asJsonObject
|
JsonParser.parseString(it.toString(Charsets.UTF_8)).asJsonObject
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun computeMessageIdentifier(conversationId: String, orderKey: Long) = (orderKey.toString() + conversationId).longHashCode()
|
||||||
|
private fun getServerMessageIdentifier(conversationId: String, clientMessageId: Long): Long? {
|
||||||
|
val serverMessageId = context.database.getConversationMessageFromId(clientMessageId)?.serverMessageId?.toLong() ?: return null
|
||||||
|
return computeMessageIdentifier(conversationId, serverMessageId)
|
||||||
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalTime::class)
|
@OptIn(ExperimentalTime::class)
|
||||||
override fun asyncOnActivityCreate() {
|
override fun asyncOnActivityCreate() {
|
||||||
if (!context.database.hasArroyo()) {
|
if (!context.database.hasArroyo()) {
|
||||||
@ -70,19 +85,19 @@ class MessageLogger : Feature("MessageLogger",
|
|||||||
//exclude messages sent by me
|
//exclude messages sent by me
|
||||||
if (message.senderId.toString() == myUserId) return
|
if (message.senderId.toString() == myUserId) return
|
||||||
|
|
||||||
val messageId = message.messageDescriptor.messageId
|
|
||||||
val conversationId = message.messageDescriptor.conversationId.toString()
|
val conversationId = message.messageDescriptor.conversationId.toString()
|
||||||
|
val serverIdentifier = computeMessageIdentifier(conversationId, message.orderKey)
|
||||||
|
|
||||||
if (message.messageContent.contentType != ContentType.STATUS) {
|
if (message.messageContent.contentType != ContentType.STATUS) {
|
||||||
if (fetchedMessages.contains(messageId)) return
|
if (fetchedMessages.contains(serverIdentifier)) return
|
||||||
fetchedMessages.add(messageId)
|
fetchedMessages.add(serverIdentifier)
|
||||||
|
|
||||||
threadPool.execute {
|
threadPool.execute {
|
||||||
try {
|
try {
|
||||||
context.bridgeClient.getMessageLoggerMessage(conversationId, messageId)?.let {
|
context.bridgeClient.getMessageLoggerMessage(conversationId, serverIdentifier)?.let {
|
||||||
return@execute
|
return@execute
|
||||||
}
|
}
|
||||||
context.bridgeClient.addMessageLoggerMessage(conversationId, messageId, context.gson.toJson(messageInstance).toByteArray(Charsets.UTF_8))
|
context.bridgeClient.addMessageLoggerMessage(conversationId, serverIdentifier, context.gson.toJson(messageInstance).toByteArray(Charsets.UTF_8))
|
||||||
} catch (ignored: DeadObjectException) {}
|
} catch (ignored: DeadObjectException) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,10 +105,10 @@ class MessageLogger : Feature("MessageLogger",
|
|||||||
}
|
}
|
||||||
|
|
||||||
//query the deleted message
|
//query the deleted message
|
||||||
val deletedMessageObject: JsonObject = if (deletedMessageCache.containsKey(messageId))
|
val deletedMessageObject: JsonObject = if (deletedMessageCache.containsKey(serverIdentifier))
|
||||||
deletedMessageCache[messageId]
|
deletedMessageCache[serverIdentifier]
|
||||||
else {
|
else {
|
||||||
context.bridgeClient.getMessageLoggerMessage(conversationId, messageId)?.let {
|
context.bridgeClient.getMessageLoggerMessage(conversationId, serverIdentifier)?.let {
|
||||||
JsonParser.parseString(it.toString(Charsets.UTF_8)).asJsonObject
|
JsonParser.parseString(it.toString(Charsets.UTF_8)).asJsonObject
|
||||||
}
|
}
|
||||||
} ?: return
|
} ?: return
|
||||||
@ -120,7 +135,7 @@ class MessageLogger : Feature("MessageLogger",
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deletedMessageCache[messageId] = deletedMessageObject
|
deletedMessageCache[serverIdentifier] = deletedMessageObject
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
|
@ -37,7 +37,7 @@ class AutoSave : Feature("Auto Save", loadParams = FeatureLoadParams.ACTIVITY_CR
|
|||||||
|
|
||||||
private fun saveMessage(conversationId: SnapUUID, message: Message) {
|
private fun saveMessage(conversationId: SnapUUID, message: Message) {
|
||||||
val messageId = message.messageDescriptor.messageId
|
val messageId = message.messageDescriptor.messageId
|
||||||
if (messageLogger.isMessageRemoved(messageId)) return
|
if (messageLogger.isMessageRemoved(conversationId.toString(), message.orderKey)) return
|
||||||
if (message.messageState != MessageState.COMMITTED) return
|
if (message.messageState != MessageState.COMMITTED) return
|
||||||
|
|
||||||
val callback = CallbackBuilder(callbackClass)
|
val callback = CallbackBuilder(callbackClass)
|
||||||
|
Reference in New Issue
Block a user