Files
rosetta-wss/src/main/java/com/rosetta/im/client/OnlineManager.java

74 lines
3.5 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 com.rosetta.im.client;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import com.rosetta.im.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);
}
}