Синхронизация сообщений для офлайн пользователей в группах

This commit is contained in:
RoyceDa
2026-02-23 17:30:15 +02:00
parent b0f0986e0d
commit 773659c2ba
4 changed files with 133 additions and 43 deletions

View File

@@ -7,6 +7,7 @@ import im.rosetta.client.ClientManager;
import im.rosetta.client.tags.ECIAuthentificate;
import im.rosetta.database.repository.BufferRepository;
import im.rosetta.database.repository.GroupRepository;
import im.rosetta.packet.Packet11Typeing;
import im.rosetta.packet.base.PacketBaseDialog;
import im.rosetta.service.services.BufferService;
@@ -19,7 +20,7 @@ import io.orprotocol.packet.PacketManager;
* Такой диспетчер нужен для того, чтобы не загромождать логику обработчиков сообщений, а так же для того, чтобы
* централизовать логику отправки сообщений и сохранения их в буфер
* Например, при отправке группового сообщения, диспетчер сам достает участников группы и
* отправляет сообщение каждому участнику, а так же сохраняет сообщение в буфер для каждого участника, который офлайн
* отправляет сообщение каждому участнику
*/
public class MessageDispatcher {
@@ -38,6 +39,7 @@ public class MessageDispatcher {
* @param packet пакет с групповым сообщением
*/
public void sendGroup(PacketBaseDialog packet, Client client, ECIAuthentificate eciAuthentificate) throws ProtocolException {
String fromPublicKey = packet.getFromPublicKey();
String toPublicKey = packet.getToPublicKey();
List<String> groupMembersPublicKeys = this.groupRepository.findGroupMembers(toPublicKey.replace("#group:", ""));
if(groupMembersPublicKeys.isEmpty()){
@@ -67,7 +69,18 @@ public class MessageDispatcher {
}
this.clientManager.sendPacketToAuthorizedPK(groupMembersPublicKeys, packet);
//TODO: Сохранить сообщение в буфер для группы, чтобы группы тоже синхронизировались
if(packet instanceof Packet11Typeing){
/**
* Если это пакет печати его не обязательно кэшировать, так как он нужен только
* для отображения статуса печати в реальном времени
*/
return;
}
/**
* Кладем пакет в буфер для будущей синхронизации и на случай если кто-то из участников оффлайн,
* в toPublicKey при отправке в группу у нас находится #group:groupId
*/
this.bufferService.pushPacketToBuffer(fromPublicKey, toPublicKey.replace("#group:", ""), packet);
}
/**