Files
rosetta-wss/src/main/java/im/rosetta/client/ClientManager.java

145 lines
6.0 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package im.rosetta.client;
import java.util.List;
import java.util.Set;
import im.rosetta.client.tags.ECIAuthentificate;
import io.orprotocol.ProtocolException;
import io.orprotocol.Server;
import io.orprotocol.client.Client;
import io.orprotocol.index.ClientIndexer;
import io.orprotocol.packet.Packet;
/**
* Менеджер клиентов
*/
public class ClientManager {
private Server server;
private ClientIndexer clientIndexer;
public ClientManager(Server server) {
this.server = server;
this.clientIndexer = server.getClientIndexer();
}
public Server getServer() {
return this.server;
}
public ClientIndexer getClientIndexer() {
return this.clientIndexer;
}
public boolean isClientConnected(String publicKey) {
Set<Client> clients = this.clientIndexer.getClients(ECIAuthentificate.class, "publicKey", publicKey);
if(clients == null){
/**
* Нет клиентов с таким публичным ключом
*/
return false;
}
if(clients.size() <= 0){
/**
* Нет клиентов с таким публичным ключом
*/
return false;
}
/**
* Есть клиенты с таким публичным ключом
*/
return true;
}
/**
* Отправить пакет ВСЕМ АВТОРИЗОВАННЫМ клиентам с публичным ключом publicKey
* @param publicKey публичный ключ получателя
* @param packet пакет для отправки
* @throws ProtocolException если произошла ошибка при отправке пакета клиенту
*/
public void sendPacketToAuthorizedPK(String publicKey, Packet packet) throws ProtocolException {
Set<Client> clients = this.clientIndexer.getClients(ECIAuthentificate.class, "publicKey", publicKey);
if(clients == null){
/**
* Нет клиентов с таким публичным ключом, значит отправлять некому
*/
return;
}
for(Client client : clients){
ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class);
if(eciAuthentificate == null || !eciAuthentificate.hasAuthorized()){
/**
* Если клиент не авторизован, пропускаем его, он не должен получать пакеты,
* если нужно отправить пакет неавторизованному клиенту, нужно отправить его напрямую посредством client.send(packet),
* а не через этот метод
*/
continue;
}
/**
* Отправляем пакет каждому клиенту с таким публичным ключом (то есть всем его авторизованным сессиям/устройствам)
*/
client.send(packet);
}
}
/**
* Отправить пакет всем клиентам с публичными ключом как у client, кроме клиента client, который является отправителем и не должен получать этот пакет
* @param client клиент
* @param packet пакет для отправки
* @throws ProtocolException
*/
public void retranslate(Client client, Packet packet) throws ProtocolException{
ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class);
Set<Client> clients = this.clientIndexer
.getClients(ECIAuthentificate.class, "publicKey", eciAuthentificate.getPublicKey());
if(clients == null){
/**
* Нет авторизованных сессий с таким публичным ключом
*/
return;
}
for(Client c : clients){
/**
* Проходим по всем устройствам с таким публичным ключом и ретранслируем им пакет, кроме того устройства что
* отправило пакет
*/
if(c.equals(client)){
continue;
}
c.send(packet);
}
}
/**
* Отправить пакет всем клиентам с публичными ключами из списка publicKeys
* @param publicKeys список публичных ключей получателей
* @param packet пакет для отправки
* @throws ProtocolException если произошла ошибка при отправке пакета клиенту
*/
public void sendPacketToAuthorizedPK(List<String> publicKeys, Packet packet) throws ProtocolException {
for(String publicKey : publicKeys){
this.sendPacketToAuthorizedPK(publicKey, packet);
}
}
/**
* Получить список клиентов по публичному ключу (get PublicKey clients), могут быть неавторизованные клиенты
* @param publicKey публичный ключ клиента
* @return список клиентов с таким публичным ключом, может быть пустым, если клиентов с таким публичным ключом нет
*/
public List<Client> getPKClients(String publicKey) {
Set<Client> clients = this.clientIndexer.getClients(ECIAuthentificate.class, "publicKey", publicKey);
if(clients == null){
/**
* Нет клиентов с таким публичным ключом
*/
return List.of();
}
return List.copyOf(clients);
}
}