Фикс смены онлайн-статуса при наличии нескольких устройств (статус становился офлайн при отключении одного из устройств, несмотря на то, что у пользователя есть еще второе)

This commit is contained in:
RoyceDa
2026-02-16 20:25:26 +02:00
parent f274a16268
commit 1853284bb3
3 changed files with 17 additions and 3 deletions

View File

@@ -153,7 +153,7 @@ public class Boot {
this.eventManager.registerListener(new ServerStopListener(this.logger));
this.eventManager.registerListener(new HandshakeCompleteListener());
this.eventManager.registerListener(new OnlineStatusHandshakeCompleteListener(this.onlineManager));
this.eventManager.registerListener(new OnlineStatusDisconnectListener(this.onlineManager));
this.eventManager.registerListener(new OnlineStatusDisconnectListener(this.onlineManager, this.clientManager));
this.eventManager.registerListener(new DeviceListListener(this.clientManager));
}

View File

@@ -37,7 +37,7 @@ public class OnlineManager {
* @param client клиент, который отписывается от всех (отключается)
*/
public void unsubscribeAll(Client client) {
this.onlineSubscriptions.remove(client);
this.onlineSubscriptions.entrySet().removeIf(entry -> entry.getKey().equals(client));
}
/**

View File

@@ -3,6 +3,7 @@ package im.rosetta.listeners;
import java.util.ArrayList;
import java.util.List;
import im.rosetta.client.ClientManager;
import im.rosetta.client.OnlineManager;
import im.rosetta.client.tags.ECIAuthentificate;
import im.rosetta.event.EventHandler;
@@ -23,9 +24,11 @@ import io.orprotocol.client.Client;
public class OnlineStatusDisconnectListener implements Listener {
private OnlineManager onlineManager;
private ClientManager clientManager;
public OnlineStatusDisconnectListener(OnlineManager onlineManager) {
public OnlineStatusDisconnectListener(OnlineManager onlineManager, ClientManager clientManager) {
this.onlineManager = onlineManager;
this.clientManager = clientManager;
}
@EventHandler
@@ -39,6 +42,17 @@ public class OnlineStatusDisconnectListener implements Listener {
return;
}
List<Client> subscribers = this.onlineManager.getSubscribers(client);
/**
* Проверяем не онлайн ли клиент с другого устройства
*/
if(this.clientManager.getPKClients(eciAuthentificate.getPublicKey()).size() > 1) {
/**
* Больше одного устройства онлайн (значит есть другое устройство онлайн),
* так что просто удаляем все подписки на онлайн у конкретно этого клиента
*/
this.onlineManager.unsubscribeAll(client);
return;
}
/**
* Уведомляем всех подписчиков на его онлайн статус, что он отключился (ушел в оффлайн)
*/