Полная реализация синхронизации

This commit is contained in:
RoyceDa
2026-02-15 18:14:42 +02:00
parent fe5bf2bd04
commit 7dc94678ba
15 changed files with 333 additions and 32 deletions

View File

@@ -1,5 +1,6 @@
package im.rosetta.service.dispatch;
import java.util.HashSet;
import java.util.List;
import im.rosetta.Failures;
@@ -96,6 +97,11 @@ public class MessageDispatcher {
* Сохраняем сообщение в буфер на случай если получатель офлайн, или нам нужна будет синхронизация сообщений для получателя
*/
this.bufferService.pushPacketToBuffer(fromPublicKey, toPublicKey, packet);
/**
* Ретранслируем сообщение всем авторизованным сессиям отправителя, чтобы синхронизировать отправленные сообщения
*/
this.retranslate(packet, client);
}
/**
@@ -111,5 +117,34 @@ public class MessageDispatcher {
this.sendPeer(packet, client, true);
}
/**
* Сообщает всем авторизованным сессиям отправителя о том, что он отправил сообщения,
* для того чтобы синхронизировать отправленные сообщения на всех устройствах отправителя
* @param packet пакет сообщения
* @param client клиент отправляющий пакет
* @throws ProtocolException
*/
public void retranslate(PacketBaseDialog packet, Client client) throws ProtocolException {
ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class);
HashSet<Client> clients = this.clientManager.getClientIndexer()
.getClients(ECIAuthentificate.class, "publicKey", eciAuthentificate.getPublicKey());
if(clients == null){
/**
* Нет авторизованных сессий с таким публичным ключом
*/
return;
}
for(Client c : clients){
/**
* Проходим по всем устройствам с таким публичным ключом и ретранслируем им пакет, кроме того устройства что
* отправило пакет
*/
if(c.equals(client)){
continue;
}
c.send(packet);
}
}
}