74 lines
3.5 KiB
Java
74 lines
3.5 KiB
Java
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);
|
||
}
|
||
}
|