feat: Implement JSON serialization for message attachments with decryption support

This commit is contained in:
k1ngsterr1
2026-01-13 05:04:05 +05:00
parent af10005879
commit f6409a9474
3 changed files with 223 additions and 4 deletions

View File

@@ -422,11 +422,24 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
*/
private fun entityToChatMessage(entity: MessageEntity): ChatMessage {
// Парсим attachments для поиска MESSAGES (цитата)
val replyData = parseReplyFromAttachments(entity.attachments, entity.fromMe == 1)
var replyData = parseReplyFromAttachments(entity.attachments, entity.fromMe == 1)
// Текст сообщения и возможный fallback reply из текста
var displayText = entity.plainMessage
// Если не нашли reply в attachments, пробуем распарсить из текста
// Формат: "🇵 Reply: "текст цитаты"\n\nоснователь текст" или подобный
if (replyData == null) {
val parseResult = parseReplyFromText(entity.plainMessage)
if (parseResult != null) {
replyData = parseResult.first
displayText = parseResult.second
}
}
return ChatMessage(
id = entity.messageId,
text = entity.plainMessage, // Уже расшифровано при сохранении
text = displayText, // Уже расшифровано при сохранении
isOutgoing = entity.fromMe == 1,
timestamp = Date(entity.timestamp),
status = when (entity.delivered) {
@@ -440,6 +453,30 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
)
}
/**
* Парсинг reply из текста сообщения (fallback формат)
* Формат: "🇵 Reply: "текст цитаты"\n\nосновной текст"
* Возвращает Pair(ReplyData, очищенный текст) или null
*/
private fun parseReplyFromText(text: String): Pair<ReplyData, String>? {
// Паттерн: начинается с эмодзи флага + "Reply:" + текст в кавычках + перенос строки
val replyPattern = Regex("^[🇵🔁↩️]\\s*Reply:\\s*\"(.+?)\"\\s*\\n+(.*)$", RegexOption.DOT_MATCHES_ALL)
val match = replyPattern.find(text) ?: return null
val replyText = match.groupValues[1]
val mainText = match.groupValues[2].trim()
return Pair(
ReplyData(
messageId = "",
senderName = opponentTitle.ifEmpty { opponentUsername.ifEmpty { "User" } },
text = replyText,
isFromMe = false // Мы не знаем кто автор из fallback формата
),
mainText
)
}
/**
* Парсинг MESSAGES attachment для извлечения данных цитаты
* Формат: [{"message_id": "...", "publicKey": "...", "message": "..."}]