feat: Enhance logging in scrollToMessage function for better debugging of message IDs and lengths

This commit is contained in:
k1ngsterr1
2026-01-16 05:57:30 +05:00
parent d58897ea38
commit c52e6dda53
3 changed files with 55 additions and 6 deletions

View File

@@ -198,6 +198,27 @@ interface MessageDao {
@Query("DELETE FROM messages WHERE account = :account AND message_id = :messageId") @Query("DELETE FROM messages WHERE account = :account AND message_id = :messageId")
suspend fun deleteMessage(account: String, messageId: String) suspend fun deleteMessage(account: String, messageId: String)
/**
* Найти сообщение по публичному ключу отправителя и timestamp (для reply)
* Ищет с допуском по времени для учета возможных рассинхронизаций
*/
@Query("""
SELECT * FROM messages
WHERE account = :account
AND dialog_key = :dialogKey
AND from_public_key = :fromPublicKey
AND timestamp BETWEEN :timestampFrom AND :timestampTo
ORDER BY timestamp ASC
LIMIT 1
""")
suspend fun findMessageByContent(
account: String,
dialogKey: String,
fromPublicKey: String,
timestampFrom: Long,
timestampTo: Long
): MessageEntity?
/** /**
* Получить количество непрочитанных сообщений для диалога * Получить количество непрочитанных сообщений для диалога
* Считает только входящие сообщения (from_me = 0) которые не прочитаны (read = 0) * Считает только входящие сообщения (from_me = 0) которые не прочитаны (read = 0)

View File

@@ -445,8 +445,15 @@ fun ChatDetailScreen(
// 🔥 Функция для скролла к сообщению с подсветкой // 🔥 Функция для скролла к сообщению с подсветкой
val scrollToMessage: (String) -> Unit = { messageId -> val scrollToMessage: (String) -> Unit = { messageId ->
android.util.Log.d("ChatDetail", "🔍 scrollToMessage called for: $messageId") android.util.Log.d("ChatDetail", "🔍 scrollToMessage called for: '$messageId'")
android.util.Log.d("ChatDetail", " - messageId length: ${messageId.length}")
android.util.Log.d("ChatDetail", " - Total messages: ${messagesWithDates.size}") android.util.Log.d("ChatDetail", " - Total messages: ${messagesWithDates.size}")
// Логируем все ID сообщений для отладки
messagesWithDates.forEachIndexed { index, pair ->
android.util.Log.d("ChatDetail", " - [$index] id='${pair.first.id}', text='${pair.first.text.take(20)}...'")
}
scope.launch { scope.launch {
// 🔥 Сбрасываем текущую подсветку перед новым скроллом // 🔥 Сбрасываем текущую подсветку перед новым скроллом
highlightedMessageId = null highlightedMessageId = null

View File

@@ -884,24 +884,45 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
val replyMessage = messagesArray.getJSONObject(0) val replyMessage = messagesArray.getJSONObject(0)
val replyPublicKey = replyMessage.optString("publicKey", "") val replyPublicKey = replyMessage.optString("publicKey", "")
val replyText = replyMessage.optString("message", "") val replyText = replyMessage.optString("message", "")
val replyMessageId = replyMessage.optString("message_id", "") val replyMessageIdFromJson = replyMessage.optString("message_id", "")
val replyTimestamp = replyMessage.optLong("timestamp", 0L)
android.util.Log.d("ReplyDebug", " - replyMessageId: $replyMessageId") android.util.Log.d("ReplyDebug", " - replyMessageId from JSON: $replyMessageIdFromJson")
android.util.Log.d("ReplyDebug", " - replyPublicKey: ${replyPublicKey.take(20)}...") android.util.Log.d("ReplyDebug", " - replyPublicKey: ${replyPublicKey.take(20)}...")
android.util.Log.d("ReplyDebug", " - replyText: ${replyText.take(50)}") android.util.Log.d("ReplyDebug", " - replyText: ${replyText.take(50)}")
android.util.Log.d("ReplyDebug", " - myPublicKey: ${myPublicKey?.take(20)}...") android.util.Log.d("ReplyDebug", " - replyTimestamp: $replyTimestamp")
// 🔥 ВАЖНО: message_id из JSON может не совпадать с messageId в Android БД!
// Пытаемся найти реальный messageId в текущих сообщениях по тексту и timestamp
val account = myPublicKey ?: return null
val dialogKey = getDialogKey(account, opponentKey ?: "")
val realMessageId = try {
// Ищем сообщение в БД по публичному ключу, тексту и timestamp (с допуском ±5 секунд)
messageDao.findMessageByContent(
account = account,
dialogKey = dialogKey,
fromPublicKey = replyPublicKey,
timestampFrom = replyTimestamp - 5000,
timestampTo = replyTimestamp + 5000
)?.messageId ?: replyMessageIdFromJson
} catch (e: Exception) {
android.util.Log.w("ReplyDebug", " - ⚠️ Could not find real messageId, using JSON id")
replyMessageIdFromJson
}
android.util.Log.d("ReplyDebug", " - Real messageId: $realMessageId")
// Определяем, кто автор цитируемого сообщения // Определяем, кто автор цитируемого сообщения
val isReplyFromMe = replyPublicKey == myPublicKey val isReplyFromMe = replyPublicKey == myPublicKey
android.util.Log.d("ReplyDebug", " - isReplyFromMe: $isReplyFromMe") android.util.Log.d("ReplyDebug", " - isReplyFromMe: $isReplyFromMe")
val result = ReplyData( val result = ReplyData(
messageId = replyMessageId, messageId = realMessageId,
senderName = if (isReplyFromMe) "You" else opponentTitle.ifEmpty { opponentUsername.ifEmpty { "User" } }, senderName = if (isReplyFromMe) "You" else opponentTitle.ifEmpty { opponentUsername.ifEmpty { "User" } },
text = replyText, text = replyText,
isFromMe = isReplyFromMe isFromMe = isReplyFromMe
) )
android.util.Log.d("ReplyDebug", " - ✅ Created ReplyData: senderName=${result.senderName}, text=${result.text.take(30)}") android.util.Log.d("ReplyDebug", " - ✅ Created ReplyData: senderName=${result.senderName}, messageId=${result.messageId}")
android.util.Log.d("ReplyDebug", "✅ [DB LOAD] Reply data parsed successfully from DB - RETURNING") android.util.Log.d("ReplyDebug", "✅ [DB LOAD] Reply data parsed successfully from DB - RETURNING")
return result return result
} else { } else {