diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/Manager.java b/mcserver-manager/src/main/java/asys/mcsmanager/Manager.java index 5d6f6d5..032af85 100644 --- a/mcserver-manager/src/main/java/asys/mcsmanager/Manager.java +++ b/mcserver-manager/src/main/java/asys/mcsmanager/Manager.java @@ -16,6 +16,7 @@ import java.util.*; public class Manager { private Logger logger = LoggerFactory.getLogger(Manager.class); private Map serversMap = new HashMap<>(); + private Map serverChannels = new HashMap<>(); private List webconsoleListener = new ArrayList<>(); /** @@ -23,16 +24,23 @@ public class Manager { * @param clientId id сервера. Чувствителен к регистру * @return false, если сервер с таким id уже имеется */ - public boolean addClientId(String clientId) { + public boolean addClientId(String clientId, Channel channel) { if (serversMap.containsKey(clientId)) { return false; } logger.debug("addClientId: {}", clientId); serversMap.put(clientId, new ServerInfo(clientId)); + serverChannels.put(clientId, channel); return true; } + public void removeClientId(String clientId) { + if (clientId != null) { + serverChannels.remove(clientId); + } + } + /** * Дополнить информация о сервере. * Если сервер отсутствует в списке, информация будет потеряна. diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/server/ServerPacketHandler.java b/mcserver-manager/src/main/java/asys/mcsmanager/server/ServerPacketHandler.java index 2568af2..fa25259 100644 --- a/mcserver-manager/src/main/java/asys/mcsmanager/server/ServerPacketHandler.java +++ b/mcserver-manager/src/main/java/asys/mcsmanager/server/ServerPacketHandler.java @@ -55,6 +55,12 @@ class ServerPacketHandler extends ChannelInboundHandlerAdapter implements IPacke super.channelActive(context); } + @Override + public void channelInactive(ChannelHandlerContext context) throws Exception { + manager.removeClientId(context.channel().attr(CLIENTID).get()); + super.channelInactive(context); + } + @Override public void handle(Packet packet, ChannelHandlerContext context) { if (packet.getClass() == CS_Handshake.class) { @@ -76,7 +82,7 @@ class ServerPacketHandler extends ChannelInboundHandlerAdapter implements IPacke return; } - if (!manager.addClientId(packet.getClientId())) { + if (!manager.addClientId(packet.getClientId(), context.channel())) { try { context.channel().writeAndFlush(HandshakeResult.CLIENTID_EXISTS).sync().channel().close(); } catch (InterruptedException ignore) {