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> 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 getSubscribers(String targetPublicKey) { List subscribers = new java.util.ArrayList<>(); for (var entry : this.onlineSubscriptions.entrySet()) { Client client = entry.getKey(); HashSet subscribedKeys = entry.getValue(); if (subscribedKeys.contains(targetPublicKey)) { subscribers.add(client); } } return subscribers; } /** * Получает список клиентов, которые подписаны на онлайн статус пользователя, представленного данным клиентом * @param client клиент, представляющий пользователя, чью онлайн статус интересует * @return список клиентов, подписанных на этого пользователя */ public List 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); } }