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

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 ServerStopListener(this.logger));
this.eventManager.registerListener(new HandshakeCompleteListener()); this.eventManager.registerListener(new HandshakeCompleteListener());
this.eventManager.registerListener(new OnlineStatusHandshakeCompleteListener(this.onlineManager)); 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)); this.eventManager.registerListener(new DeviceListListener(this.clientManager));
} }

View File

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