feat: Implement read receipt handling and mark all outgoing messages as read

This commit is contained in:
k1ngsterr1
2026-01-13 04:10:07 +05:00
parent cdb3d7ab9e
commit e44bed4fa8
5 changed files with 59 additions and 27 deletions

View File

@@ -335,17 +335,18 @@ class PacketMessage : Packet() {
/**
* Read packet (ID: 0x07)
* Уведомление о прочтении сообщения
* Порядок полей как в Desktop: privateKey, fromPublicKey, toPublicKey
*/
class PacketRead : Packet() {
var messageId: String = ""
var privateKey: String = ""
var fromPublicKey: String = ""
var toPublicKey: String = ""
var privateKey: String = ""
override fun getPacketId(): Int = 0x07
override fun receive(stream: Stream) {
messageId = stream.readString()
// Desktop: privateKey, fromPublicKey, toPublicKey
privateKey = stream.readString()
fromPublicKey = stream.readString()
toPublicKey = stream.readString()
}
@@ -353,10 +354,10 @@ class PacketRead : Packet() {
override fun send(): Stream {
val stream = Stream()
stream.writeInt16(getPacketId())
stream.writeString(messageId)
// Desktop: privateKey, fromPublicKey, toPublicKey
stream.writeString(privateKey)
stream.writeString(fromPublicKey)
stream.writeString(toPublicKey)
stream.writeString(privateKey)
return stream
}
}
@@ -422,6 +423,7 @@ class PacketTyping : Packet() {
/**
* Chunk packet (ID: 0x09)
* Для разбиения больших пакетов на части (как в Desktop)
* ВАЖНО: chunkIndex и totalChunks - Int16, не Int32!
*/
class PacketChunk : Packet() {
var chunkId: String = ""
@@ -432,18 +434,20 @@ class PacketChunk : Packet() {
override fun getPacketId(): Int = 0x09
override fun receive(stream: Stream) {
// В Desktop: readInt16 для index и total
chunkIndex = stream.readInt16()
totalChunks = stream.readInt16()
chunkId = stream.readString()
chunkIndex = stream.readInt32()
totalChunks = stream.readInt32()
data = stream.readBytes()
}
override fun send(): Stream {
val stream = Stream()
stream.writeInt16(getPacketId())
// В Desktop: writeInt16 для index и total
stream.writeInt16(chunkIndex)
stream.writeInt16(totalChunks)
stream.writeString(chunkId)
stream.writeInt32(chunkIndex)
stream.writeInt32(totalChunks)
stream.writeBytes(data)
return stream
}

View File

@@ -87,9 +87,10 @@ object ProtocolManager {
}
// Обработчик прочтения (0x07)
// В Desktop PacketRead не содержит messageId - сообщает что собеседник прочитал сообщения
waitPacket(0x07) { packet ->
val readPacket = packet as PacketRead
addLog("✓✓ Read: ${readPacket.messageId.take(16)}...")
addLog("✓✓ Read from: ${readPacket.fromPublicKey.take(16)}...")
scope.launch {
messageRepository?.handleRead(readPacket)