From 1151f1580c1a7f6d3dcdb9ae894a4ab97484ac37 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 8 Jun 2017 11:49:29 +0300 Subject: [PATCH] =?UTF-8?q?Bridge:=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D1=8B?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Теперь есть два режима: 1 и 2. 1 - это стандартный режим, когда подключение идет напрямую к ASys. 2 - это новый режим, когда подключением к ASys занимается Zond. Bridge в таком режиме является лишь "мостиком" между игровым API и ASys. --- bridge/README.MD | 20 ++++++++++ bridge/build.gradle | 2 +- .../java/asys/bridge/bukkit/BridgePlugin.java | 28 +++++++++---- .../bridge/client/ClientPacketHandler.java | 39 ++++++++++++------- bridge/src/main/resources/config.yml | 3 ++ 5 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 bridge/README.MD diff --git a/bridge/README.MD b/bridge/README.MD new file mode 100644 index 0000000..c4691bd --- /dev/null +++ b/bridge/README.MD @@ -0,0 +1,20 @@ +# Bridge + +Плагин, служащий "мостом" между внутренним серверным API и ASys + +## Настройка + +Настройки хранятся в файле `config.yml`. + +`clientId` - Идентификатор и одновременно имя сервера. Должно быть уникальным. + +`mode` - Режим работы плагина. Имеется два режим: `1` и `2`. +Первый предназначен для прямого подключения к ASys: принимаются комманды, передается вывод консоли. +Второй - для подключения через Zond. В этом режиме плагин занимается только пинговкой и выполнением +служебных (от Zond) комманд. По-умолчению значение `1`. + +`host` - Хост/IP для подключения к ASys. В режиме `2` игнорируется и всегда имеет значение `127.0.0.1`. + +`port` - Порт для подключения к ASys/Zond. + +`passcode` - Секретное слово. Необходимо как дополнительный слой защиты. В режме `2` игнорируется. \ No newline at end of file diff --git a/bridge/build.gradle b/bridge/build.gradle index baa9fe7..9c830d9 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.5.2-SNAPSHOT' +version = '0.6-SNAPSHOT' repositories { maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java index 9223e21..030b125 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java @@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit; public class BridgePlugin extends JavaPlugin { public static BridgePlugin INSTANCE; + private String appConnect = "ASys"; private Client client; private ScheduledExecutorService ses; private ScheduledFuture sesFuture, sesPingFuture; @@ -28,7 +29,12 @@ public class BridgePlugin extends JavaPlugin { @Override public void onLoad() { - ((Logger)LogManager.getRootLogger()).addAppender(loggerAppender = new BridgeLoggerAppender()); + saveDefaultConfig(); + if (getConfig().getInt("mode") == 1) { + ((Logger) LogManager.getRootLogger()).addAppender(loggerAppender = new BridgeLoggerAppender()); + } else { + this.appConnect = "Zond"; + } onEnable(); } @@ -36,8 +42,6 @@ public class BridgePlugin extends JavaPlugin { public void onEnable() { if (INSTANCE == null) { INSTANCE = this; - saveDefaultConfig(); - startReconnect(); } } @@ -68,8 +72,12 @@ public class BridgePlugin extends JavaPlugin { client = new Client(); ses = Executors.newScheduledThreadPool(2); sesFuture = ses.scheduleAtFixedRate(() -> { - getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect)); - client.connect(getConfig().getString("host"), getConfig().getInt("port")); + getLogger().info(String.format("Connect(%d) to %s...", ++tryConnect, appConnect)); + if (getConfig().getInt("mode") == 1) { + client.connect(getConfig().getString("host"), getConfig().getInt("port")); + } else { + client.connect("127.0.0.1", getConfig().getInt("port")); + } if (client.isConnected()) { stopReconnect(); } else { @@ -88,7 +96,9 @@ public class BridgePlugin extends JavaPlugin { } public void startPing(Channel channel) { - getLoggerAppender().setChannel(channel); + if (getConfig().getInt("mode") == 1) { + getLoggerAppender().setChannel(channel); + } sesPingFuture = ses.scheduleAtFixedRate(() -> { channel.write(new CS_Ping( System.currentTimeMillis(), @@ -109,13 +119,15 @@ public class BridgePlugin extends JavaPlugin { } public void stopPing() { - getLoggerAppender().setChannel(null); + if (getConfig().getInt("mode") == 1) { + getLoggerAppender().setChannel(null); + } if (sesPingFuture != null) { sesPingFuture.cancel(false); } } - public BridgeLoggerAppender getLoggerAppender() { + private BridgeLoggerAppender getLoggerAppender() { return loggerAppender; } } diff --git a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java index 2995740..4d8bfba 100644 --- a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java +++ b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java @@ -40,14 +40,21 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements @Override public void channelActive(ChannelHandlerContext context) throws Exception { BridgePlugin.INSTANCE.getLogger().info("channelActive"); - context.channel().attr(KNOWN_PACKETS).set(handshakePackets); - context.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); + if (BridgePlugin.INSTANCE.getConfig().getInt("mode") == 1) { + context.channel().attr(KNOWN_PACKETS).set(handshakePackets); + context.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); - CS_Handshake packet = new CS_Handshake( - BridgePlugin.INSTANCE.getConfig().getString("clientId"), - BridgePlugin.INSTANCE.getConfig().getString("passcode")); - BridgePlugin.INSTANCE.getLogger().info("send Handshake packet..."); - context.channel().writeAndFlush(packet); + + CS_Handshake packet = new CS_Handshake( + BridgePlugin.INSTANCE.getConfig().getString("clientId"), + BridgePlugin.INSTANCE.getConfig().getString("passcode")); + BridgePlugin.INSTANCE.getLogger().info("send Handshake packet..."); + context.channel().writeAndFlush(packet); + } else { + context.channel().attr(KNOWN_PACKETS).set(pingPackets); + BridgePlugin.INSTANCE.getLogger().info("Handshake: SKIP. Used Zond."); + BridgePlugin.INSTANCE.startPing(context.channel()); + } super.channelActive(context); } @@ -67,14 +74,16 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements @Override public void handle(Packet packet, ChannelHandlerContext context) { BridgePlugin.INSTANCE.getLogger().info("handle : " + packet.getClass().getSimpleName()); - SC_HandshakeResult pkt = (SC_HandshakeResult) packet; - if (pkt.getErrorCode() != 0) { - BridgePlugin.INSTANCE.getLogger().severe( - String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage())); - } else { - context.channel().attr(KNOWN_PACKETS).set(pingPackets); - BridgePlugin.INSTANCE.getLogger().info("Handshake: OK"); - BridgePlugin.INSTANCE.startPing(context.channel()); + if (BridgePlugin.INSTANCE.getConfig().getInt("mode") == 1) { + SC_HandshakeResult pkt = (SC_HandshakeResult) packet; + if (pkt.getErrorCode() != 0) { + BridgePlugin.INSTANCE.getLogger().severe( + String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage())); + } else { + context.channel().attr(KNOWN_PACKETS).set(pingPackets); + BridgePlugin.INSTANCE.getLogger().info("Handshake: OK"); + BridgePlugin.INSTANCE.startPing(context.channel()); + } } } } diff --git a/bridge/src/main/resources/config.yml b/bridge/src/main/resources/config.yml index 5d80f21..a6a0a8c 100644 --- a/bridge/src/main/resources/config.yml +++ b/bridge/src/main/resources/config.yml @@ -1,4 +1,7 @@ clientId: SpigotServer0 +# 1 - прямое соединение с ASys. Сообщения из консоли перехватываются +# 2 - подключение через Zond. Сообщения из консоли не перехватываются +mode: 1 host: 127.0.0.1 port: 8779 passcode: testpassphrase \ No newline at end of file