From 1853284bb34e29b7f53d049b9960358b5db67405 Mon Sep 17 00:00:00 2001 From: RoyceDa Date: Mon, 16 Feb 2026 20:25:26 +0200 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=81=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BE=D0=BD=D0=BB=D0=B0=D0=B9=D0=BD-=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=D0=B8=D1=87=D0=B8=D0=B8=20=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=B8=D1=85=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=20(=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D1=83=D1=81=20=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D0=BE=D1=84=D0=BB=D0=B0=D0=B9=D0=BD=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82?= =?UTF-8?q?=D0=B2,=20=D0=BD=D0=B5=D1=81=D0=BC=D0=BE=D1=82=D1=80=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=82=D0=BE,=20=D1=87=D1=82=D0=BE=20=D1=83=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B5=D1=81=D1=82=D1=8C=20=D0=B5=D1=89=D0=B5=20?= =?UTF-8?q?=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/im/rosetta/Boot.java | 2 +- .../java/im/rosetta/client/OnlineManager.java | 2 +- .../OnlineStatusDisconnectListener.java | 16 +++++++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/im/rosetta/Boot.java b/src/main/java/im/rosetta/Boot.java index 2e11c8f..06ecd29 100644 --- a/src/main/java/im/rosetta/Boot.java +++ b/src/main/java/im/rosetta/Boot.java @@ -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)); } diff --git a/src/main/java/im/rosetta/client/OnlineManager.java b/src/main/java/im/rosetta/client/OnlineManager.java index 343a6b8..c33e770 100644 --- a/src/main/java/im/rosetta/client/OnlineManager.java +++ b/src/main/java/im/rosetta/client/OnlineManager.java @@ -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)); } /** diff --git a/src/main/java/im/rosetta/listeners/OnlineStatusDisconnectListener.java b/src/main/java/im/rosetta/listeners/OnlineStatusDisconnectListener.java index 54759d6..b4b2da4 100644 --- a/src/main/java/im/rosetta/listeners/OnlineStatusDisconnectListener.java +++ b/src/main/java/im/rosetta/listeners/OnlineStatusDisconnectListener.java @@ -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 subscribers = this.onlineManager.getSubscribers(client); + /** + * Проверяем не онлайн ли клиент с другого устройства + */ + if(this.clientManager.getPKClients(eciAuthentificate.getPublicKey()).size() > 1) { + /** + * Больше одного устройства онлайн (значит есть другое устройство онлайн), + * так что просто удаляем все подписки на онлайн у конкретно этого клиента + */ + this.onlineManager.unsubscribeAll(client); + return; + } /** * Уведомляем всех подписчиков на его онлайн статус, что он отключился (ушел в оффлайн) */