Синхронизация сообщений для офлайн пользователей в группах
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -8,6 +8,7 @@ import im.rosetta.client.tags.ECIAuthentificate;
|
||||
import im.rosetta.database.QuerySession;
|
||||
import im.rosetta.database.entity.Buffer;
|
||||
import im.rosetta.database.repository.BufferRepository;
|
||||
import im.rosetta.database.repository.GroupRepository;
|
||||
import im.rosetta.exception.UnauthorizedExeception;
|
||||
import im.rosetta.packet.Packet7Read;
|
||||
import im.rosetta.service.Service;
|
||||
@@ -20,6 +21,7 @@ import io.orprotocol.packet.PacketManager;
|
||||
public class BufferService extends Service<BufferRepository> {
|
||||
|
||||
private PacketManager packetManager;
|
||||
private GroupRepository groupRepository = new GroupRepository();
|
||||
|
||||
public BufferService(BufferRepository repository, PacketManager packetManager) {
|
||||
super(repository);
|
||||
@@ -41,10 +43,24 @@ public class BufferService extends Service<BufferRepository> {
|
||||
*/
|
||||
throw new UnauthorizedExeception("Unauthorized client cannot get packets from buffer");
|
||||
}
|
||||
/**
|
||||
* Получаем группы клиента, и исходя из этого формируем список каких пакетов нам нужно взять из базы
|
||||
*/
|
||||
List<String> clientGroups = this.groupRepository.findGroupsByMember(eciAuthentificate.getPublicKey());
|
||||
List<String> toValue = new ArrayList<>();
|
||||
/**
|
||||
* Добавляем публичный ключ клиента, так как ему нужны пакеты, которые были отправлены ему напрямую, а не в группу
|
||||
*/
|
||||
toValue.add(eciAuthentificate.getPublicKey());
|
||||
/**
|
||||
* Добавляем группы клиента, так как ему нужны пакеты, которые были отправлены в эти группы
|
||||
*/
|
||||
toValue.addAll(clientGroups);
|
||||
|
||||
String toPublicKey = eciAuthentificate.getPublicKey();
|
||||
String hql = "FROM Buffer WHERE (to = :to OR from = :from) AND timestamp > :timestamp ORDER BY timestamp ASC";
|
||||
String hql = "FROM Buffer WHERE (to IN (:to) OR from = :from) AND timestamp > :timestamp ORDER BY timestamp ASC";
|
||||
HashMap<String, Object> parameters = new HashMap<>();
|
||||
parameters.put("to", toPublicKey);
|
||||
parameters.put("to", toValue);
|
||||
parameters.put("from", toPublicKey);
|
||||
parameters.put("timestamp", fromTimestampMs);
|
||||
List<Packet> packets = new ArrayList<>();
|
||||
|
||||
Reference in New Issue
Block a user