feat: Implement JSON serialization for message attachments with decryption support
This commit is contained in:
@@ -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": "..."}]
|
||||
|
||||
Reference in New Issue
Block a user