diff --git a/src/main/java/im/rosetta/client/ClientManager.java b/src/main/java/im/rosetta/client/ClientManager.java index 2bc28fd..d40839e 100644 --- a/src/main/java/im/rosetta/client/ClientManager.java +++ b/src/main/java/im/rosetta/client/ClientManager.java @@ -56,9 +56,10 @@ public class ClientManager { * Отправить пакет ВСЕМ АВТОРИЗОВАННЫМ клиентам с публичным ключом publicKey * @param publicKey публичный ключ получателя * @param packet пакет для отправки + * @param exclude клиент, который не должен получать этот пакет, может быть null * @throws ProtocolException если произошла ошибка при отправке пакета клиенту */ - public void sendPacketToAuthorizedPK(String publicKey, Packet packet) throws ProtocolException { + public void sendPacketToAuthorizedPK(String publicKey, Packet packet, Client exclude) throws ProtocolException { Set clients = this.clientIndexer.getClients(ECIAuthentificate.class, "publicKey", publicKey); if(clients == null){ /** @@ -77,12 +78,55 @@ public class ClientManager { continue; } /** - * Отправляем пакет каждому клиенту с таким публичным ключом (то есть всем его авторизованным сессиям/устройствам) + * Отправляем пакет каждому клиенту с таким публичным ключом (то есть всем его авторизованным сессиям/устройствам), + * исключая клиента exclude */ + if(exclude != null && client.equals(exclude)){ + /** + * Этот клиент является исключением, он не должен получать этот пакет + */ + continue; + } client.send(packet); } } + /** + * Отправить пакет ВСЕМ АВТОРИЗОВАННЫМ клиентам с публичным ключом publicKey + * @param publicKey публичный ключ получателя + * @param packet пакет для отправки + * @throws ProtocolException если произошла ошибка при отправке пакета клиенту + */ + public void sendPacketToAuthorizedPK(String publicKey, Packet packet) throws ProtocolException { + this.sendPacketToAuthorizedPK(publicKey, packet, null); + } + + /** + * Отправить пакет всем клиентам с публичными ключами из списка publicKeys + * @param publicKeys список публичных ключей получателей + * @param packet пакет для отправки + * @param exclude клиент, который не должен получать этот пакет, может быть null + * @throws ProtocolException если произошла ошибка при отправке пакета клиенту + */ + public void sendPacketToAuthorizedPK(List publicKeys, Packet packet, Client exclude) throws ProtocolException { + for(String publicKey : publicKeys){ + this.sendPacketToAuthorizedPK(publicKey, packet, exclude); + } + } + + /** + * Отправить пакет всем клиентам с публичными ключами из списка publicKeys + * @param publicKeys список публичных ключей получателей + * @param packet пакет для отправки + * @throws ProtocolException если произошла ошибка при отправке пакета клиенту + */ + public void sendPacketToAuthorizedPK(List publicKeys, Packet packet) throws ProtocolException { + for(String publicKey : publicKeys){ + this.sendPacketToAuthorizedPK(publicKey, packet, null); + } + } + + /** * Отправить пакет всем клиентам с публичными ключом как у client, кроме клиента client, который является отправителем и не должен получать этот пакет * @param client клиент @@ -111,18 +155,6 @@ public class ClientManager { } } - /** - * Отправить пакет всем клиентам с публичными ключами из списка publicKeys - * @param publicKeys список публичных ключей получателей - * @param packet пакет для отправки - * @throws ProtocolException если произошла ошибка при отправке пакета клиенту - */ - public void sendPacketToAuthorizedPK(List publicKeys, Packet packet) throws ProtocolException { - for(String publicKey : publicKeys){ - this.sendPacketToAuthorizedPK(publicKey, packet); - } - } - /** * Получить список клиентов по публичному ключу (get PublicKey clients), могут быть неавторизованные клиенты * @param publicKey публичный ключ клиента diff --git a/src/main/java/im/rosetta/executors/Executor26SignalPeer.java b/src/main/java/im/rosetta/executors/Executor26SignalPeer.java index a287c51..6150690 100644 --- a/src/main/java/im/rosetta/executors/Executor26SignalPeer.java +++ b/src/main/java/im/rosetta/executors/Executor26SignalPeer.java @@ -141,6 +141,13 @@ public class Executor26SignalPeer extends PacketExecutor { room.addParticipant(participant); } session.sendPacket(packet, client); + /** + * Сбрасываем вызов на всех остальных устройствах пользователя, который принимает звонок, + * чтобы он не смог принять или отклонить звонок с другого устройства + */ + Packet26SignalPeer endCallOtherDevices = new Packet26SignalPeer(); + endCallOtherDevices.setSignalType(NetworkSignalType.END_CALL); + this.clientManager.sendPacketToAuthorizedPK(src, endCallOtherDevices, client); return; } if(type == NetworkSignalType.KEY_EXCHANGE){