Изменение домена с rosetta-im.com на rosetta.im
This commit is contained in:
112
src/main/java/im/rosetta/client/ClientManager.java
Normal file
112
src/main/java/im/rosetta/client/ClientManager.java
Normal file
@@ -0,0 +1,112 @@
|
||||
package im.rosetta.client;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
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 boolean isClientConnected(String publicKey) {
|
||||
HashSet<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 {
|
||||
HashSet<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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Отправить пакет всем клиентам с публичными ключами из списка 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) {
|
||||
HashSet<Client> clients = this.clientIndexer.getClients(ECIAuthentificate.class, "publicKey", publicKey);
|
||||
if(clients == null){
|
||||
/**
|
||||
* Нет клиентов с таким публичным ключом
|
||||
*/
|
||||
return List.of();
|
||||
}
|
||||
return List.copyOf(clients);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
73
src/main/java/im/rosetta/client/OnlineManager.java
Normal file
73
src/main/java/im/rosetta/client/OnlineManager.java
Normal file
@@ -0,0 +1,73 @@
|
||||
package im.rosetta.client;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
import im.rosetta.client.tags.ECIAuthentificate;
|
||||
|
||||
import io.orprotocol.client.Client;
|
||||
|
||||
/**
|
||||
* Отвечает за подписки на онлайн статус пользователей
|
||||
* Каждый пользователь может подписаться на онлайн статус других пользователей
|
||||
* и получать обновления об их статусе в реальном времени
|
||||
*/
|
||||
public class OnlineManager {
|
||||
|
||||
private HashMap<Client, HashSet<String>> onlineSubscriptions;
|
||||
|
||||
public OnlineManager() {
|
||||
this.onlineSubscriptions = new HashMap<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Подписывает клиента на онлайн статус другого пользователя по его публичному ключу
|
||||
* @param client клиент, который подписывается
|
||||
* @param targetPublicKey публичный ключ пользователя, на которого подписываются
|
||||
*/
|
||||
public void subscribe(Client client, String targetPublicKey) {
|
||||
this.onlineSubscriptions.computeIfAbsent(client, k -> new HashSet<>())
|
||||
.add(targetPublicKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Отписывает клиента от онлайн статуса другого пользователя по его публичному ключу, например при отключении клиента
|
||||
* @param client клиент, который отписывается от всех (отключается)
|
||||
*/
|
||||
public void unsubscribeAll(Client client) {
|
||||
this.onlineSubscriptions.remove(client);
|
||||
}
|
||||
|
||||
/**
|
||||
* Получает список клиентов, которые подписаны на онлайн статус пользователя с указанным публичным ключом
|
||||
* @param targetPublicKey публичный ключ пользователя, чью онлайн статус интересует
|
||||
* @return список клиентов, подписанных на этот публичный ключ
|
||||
*/
|
||||
public List<Client> getSubscribers(String targetPublicKey) {
|
||||
List<Client> subscribers = new java.util.ArrayList<>();
|
||||
for (var entry : this.onlineSubscriptions.entrySet()) {
|
||||
Client client = entry.getKey();
|
||||
HashSet<String> subscribedKeys = entry.getValue();
|
||||
if (subscribedKeys.contains(targetPublicKey)) {
|
||||
subscribers.add(client);
|
||||
}
|
||||
}
|
||||
return subscribers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получает список клиентов, которые подписаны на онлайн статус пользователя, представленного данным клиентом
|
||||
* @param client клиент, представляющий пользователя, чью онлайн статус интересует
|
||||
* @return список клиентов, подписанных на этого пользователя
|
||||
*/
|
||||
public List<Client> getSubscribers(Client client) {
|
||||
ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class);
|
||||
if(eciAuthentificate == null || !eciAuthentificate.hasAuthorized()) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
String publicKey = eciAuthentificate.getPublicKey();
|
||||
return this.getSubscribers(publicKey);
|
||||
}
|
||||
}
|
||||
67
src/main/java/im/rosetta/client/tags/ECIAuthentificate.java
Normal file
67
src/main/java/im/rosetta/client/tags/ECIAuthentificate.java
Normal file
@@ -0,0 +1,67 @@
|
||||
package im.rosetta.client.tags;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import im.rosetta.packet.runtime.HandshakeStage;
|
||||
|
||||
import io.orprotocol.client.ECITag;
|
||||
|
||||
/**
|
||||
* Это вложенный обьект для клиента, содержащий информацию об аутентификации.
|
||||
*/
|
||||
public class ECIAuthentificate implements ECITag {
|
||||
|
||||
public String publicKey;
|
||||
public String privateKey;
|
||||
public HandshakeStage handshakeStage;
|
||||
|
||||
public ECIAuthentificate(String publicKey, String privateKey, HandshakeStage handshakeStage) {
|
||||
this.publicKey = publicKey;
|
||||
this.privateKey = privateKey;
|
||||
this.handshakeStage = handshakeStage;
|
||||
}
|
||||
|
||||
public String getPublicKey() {
|
||||
return publicKey;
|
||||
}
|
||||
|
||||
public String getPrivateKey() {
|
||||
return privateKey;
|
||||
}
|
||||
|
||||
public HandshakeStage getHandshakeStage() {
|
||||
return handshakeStage;
|
||||
}
|
||||
|
||||
public void setPublicKey(String publicKey) {
|
||||
this.publicKey = publicKey;
|
||||
}
|
||||
|
||||
public void setPrivateKey(String privateKey) {
|
||||
this.privateKey = privateKey;
|
||||
}
|
||||
|
||||
public void setHandshakeStage(HandshakeStage handshakeStage) {
|
||||
this.handshakeStage = handshakeStage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, прошел ли клиент аутентификацию. В том числе подтвердил ли устройство.
|
||||
* @return true если аутентификация пройдена, иначе false.
|
||||
*/
|
||||
public boolean hasAuthorized() {
|
||||
return this.handshakeStage == HandshakeStage.COMPLETED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Создаем индекс для быстрого поиска клиентов (индексацию реализует ORProtocol)
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> getIndex() {
|
||||
Map<String, Object> indexes = new HashMap<>();
|
||||
indexes.put("publicKey", publicKey);
|
||||
return indexes;
|
||||
}
|
||||
|
||||
}
|
||||
41
src/main/java/im/rosetta/client/tags/ECIDevice.java
Normal file
41
src/main/java/im/rosetta/client/tags/ECIDevice.java
Normal file
@@ -0,0 +1,41 @@
|
||||
package im.rosetta.client.tags;
|
||||
|
||||
import io.orprotocol.client.ECITag;
|
||||
|
||||
public class ECIDevice implements ECITag {
|
||||
|
||||
public String deviceId;
|
||||
public String deviceName;
|
||||
public String deviceOs;
|
||||
|
||||
public ECIDevice(String deviceId, String deviceName, String deviceOs) {
|
||||
this.deviceId = deviceId;
|
||||
this.deviceName = deviceName;
|
||||
this.deviceOs = deviceOs;
|
||||
}
|
||||
|
||||
public String getDeviceId() {
|
||||
return deviceId;
|
||||
}
|
||||
|
||||
public String getDeviceName() {
|
||||
return deviceName;
|
||||
}
|
||||
|
||||
public String getDeviceOs() {
|
||||
return deviceOs;
|
||||
}
|
||||
|
||||
public void setDeviceId(String deviceId) {
|
||||
this.deviceId = deviceId;
|
||||
}
|
||||
|
||||
public void setDeviceName(String deviceName) {
|
||||
this.deviceName = deviceName;
|
||||
}
|
||||
|
||||
public void setDeviceOs(String deviceOs) {
|
||||
this.deviceOs = deviceOs;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user