Синхронизация сообщений, чтения в группах, синхронизация ключей групп
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
package im.rosetta.service.dispatch;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
import im.rosetta.client.ClientManager;
|
||||
@@ -57,7 +56,21 @@ public class MessageDispatcher {
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* Отправляем всем участникам группы, кроме отправителя этот пакет, попутно не забывая проверить, а не один ли он в группе
|
||||
* Ретранслируем сообщение ВСЕМ авторизованным сессиям отправителя КРОМЕ текущей,
|
||||
* чтобы синхронизировать отправленные сообщения
|
||||
*/
|
||||
if(!(packet instanceof Packet11Typeing)){
|
||||
/**
|
||||
* Если это пакет печати его не обязательно кэшировать, так как он нужен только
|
||||
* для отображения статуса печати в реальном времени
|
||||
* Кладем пакет в буфер для будущей синхронизации и на случай если кто-то из участников оффлайн,
|
||||
* в toPublicKey при отправке в группу у нас находится #group:groupId
|
||||
*/
|
||||
this.bufferService.pushPacketToBuffer(fromPublicKey, toPublicKey.replace("#group:", ""), packet);
|
||||
this.clientManager.retranslate(client, packet);
|
||||
}
|
||||
/**
|
||||
* Отправляем всем участникам группы, кроме отправителя, попутно проверяем, а не один ли он в группе
|
||||
*/
|
||||
groupMembersPublicKeys.remove(eciAuthentificate.getPublicKey());
|
||||
if(groupMembersPublicKeys.isEmpty()){
|
||||
@@ -67,20 +80,10 @@ public class MessageDispatcher {
|
||||
*/
|
||||
return;
|
||||
}
|
||||
this.clientManager.sendPacketToAuthorizedPK(groupMembersPublicKeys, packet);
|
||||
|
||||
if(packet instanceof Packet11Typeing){
|
||||
/**
|
||||
* Если это пакет печати его не обязательно кэшировать, так как он нужен только
|
||||
* для отображения статуса печати в реальном времени
|
||||
*/
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* Кладем пакет в буфер для будущей синхронизации и на случай если кто-то из участников оффлайн,
|
||||
* в toPublicKey при отправке в группу у нас находится #group:groupId
|
||||
* Отправляем сообщение всем, кто в беседе
|
||||
*/
|
||||
this.bufferService.pushPacketToBuffer(fromPublicKey, toPublicKey.replace("#group:", ""), packet);
|
||||
this.clientManager.sendPacketToAuthorizedPK(groupMembersPublicKeys, packet);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -94,6 +97,12 @@ public class MessageDispatcher {
|
||||
public void sendPeer(PacketBaseDialog packet, Client client, boolean bufferizationNeed) throws ProtocolException {
|
||||
String fromPublicKey = packet.getFromPublicKey();
|
||||
String toPublicKey = packet.getToPublicKey();
|
||||
|
||||
/**
|
||||
* Ретранслируем сообщение ВСЕМ авторизованным сессиям отправителя КРОМЕ текущей,
|
||||
* чтобы синхронизировать отправленные сообщения
|
||||
*/
|
||||
this.clientManager.retranslate(client, packet);
|
||||
this.clientManager.sendPacketToAuthorizedPK(toPublicKey, packet);
|
||||
|
||||
if(!bufferizationNeed){
|
||||
@@ -107,11 +116,6 @@ public class MessageDispatcher {
|
||||
* Сохраняем сообщение в буфер на случай если получатель офлайн, или нам нужна будет синхронизация сообщений для получателя
|
||||
*/
|
||||
this.bufferService.pushPacketToBuffer(fromPublicKey, toPublicKey, packet);
|
||||
|
||||
/**
|
||||
* Ретранслируем сообщение всем авторизованным сессиям отправителя, чтобы синхронизировать отправленные сообщения
|
||||
*/
|
||||
this.retranslate(packet, client);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -127,34 +131,4 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user