Статусы онлайн/оффлайн и подписки на них

This commit is contained in:
RoyceDa
2026-02-05 18:05:03 +02:00
parent 4a4cd81891
commit 7766afa984
13 changed files with 426 additions and 5 deletions

View File

@@ -0,0 +1,73 @@
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);
}
}