From 606ed43bdeff8a85c8651cc5bb3602e50d305f6e Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 17 May 2017 13:09:51 +0300 Subject: [PATCH] =?UTF-8?q?Bridge:=20=D1=83=D0=BD=D0=B8=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=81=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D1=85=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit b921a3611eba6663ed357dd20a06101fde843213) --- bridge/build.gradle | 2 +- .../asys/bridge/bukkit/BridgeBukkitImpl.java | 49 +++++++++ .../java/asys/bridge/bukkit/BridgePlugin.java | 104 ++---------------- .../asys/bridge/bukkit/ConfigBukkitImpl.java | 26 +++++ .../asys/bridge/bukkit/LoggerBukkitImpl.java | 32 ++++++ .../java/asys/bridge/bukkit/TaskTicker.java | 8 +- .../asys/bridge/client/AbstractBridge.java | 86 +++++++++++++++ .../main/java/asys/bridge/client/Client.java | 7 +- .../bridge/client/ClientPacketHandler.java | 39 +++---- .../main/java/asys/bridge/client/IBridge.java | 21 ++++ .../main/java/asys/bridge/client/IConfig.java | 10 ++ .../main/java/asys/bridge/client/ILogger.java | 11 ++ 12 files changed, 272 insertions(+), 123 deletions(-) create mode 100644 bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java create mode 100644 bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java create mode 100644 bridge/src/main/java/asys/bridge/bukkit/LoggerBukkitImpl.java create mode 100644 bridge/src/main/java/asys/bridge/client/AbstractBridge.java create mode 100644 bridge/src/main/java/asys/bridge/client/IBridge.java create mode 100644 bridge/src/main/java/asys/bridge/client/IConfig.java create mode 100644 bridge/src/main/java/asys/bridge/client/ILogger.java diff --git a/bridge/build.gradle b/bridge/build.gradle index 9c830d9..71e9af3 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6-SNAPSHOT' +version = '0.7-SNAPSHOT' repositories { maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java b/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java new file mode 100644 index 0000000..d7f5353 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java @@ -0,0 +1,49 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.bukkit; + +import asys.bridge.client.AbstractBridge; +import asys.bridge.client.IBridge; +import asys.bridge.client.IConfig; +import asys.bridge.client.ILogger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; + +public class BridgeBukkitImpl extends AbstractBridge implements IBridge { + private BridgePlugin plugin; + private LoggerBukkitImpl logger; + private ConfigBukkitImpl configBukkit; + + public BridgeBukkitImpl(BridgePlugin plugin) { + this.plugin = plugin; + this.logger = new LoggerBukkitImpl(plugin.getLogger()); + this.configBukkit = new ConfigBukkitImpl(plugin.getConfig()); + + ((Logger) LogManager.getRootLogger()).addAppender(new BridgeLoggerAppender()); + } + + @Override + public ILogger getLogger() { + return logger; + } + + @Override + public IConfig getConfig() { + return configBukkit; + } + + @Override + public int getCountOnlinePlayers() { + return plugin.getServer().getOnlinePlayers().size(); + } + + @Override + public void dispatchCommand(String command) { + plugin.getServer().dispatchCommand( + plugin.getServer().getConsoleSender(), + command + ); + } +} diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java index be638d7..4d73b8f 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java @@ -4,51 +4,26 @@ */ package asys.bridge.bukkit; -import asys.bridge.client.Client; -import asys.mcsmanager.packets.CS_Ping; -import io.netty.channel.Channel; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.Logger; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; public class BridgePlugin extends JavaPlugin { - public static BridgePlugin INSTANCE; - private Client client; - private TaskTicker connectTicker, pingTicker; - private int tryConnect = 0; - private BridgeLoggerAppender loggerAppender; - private boolean needReconnect = true; + private BridgeBukkitImpl bridgeBukkit; @Override public void onLoad() { - ((Logger)LogManager.getRootLogger()).addAppender(loggerAppender = new BridgeLoggerAppender()); - onEnable(); - } - - @Override - public void onEnable() { - if (INSTANCE == null) { - INSTANCE = this; - saveDefaultConfig(); - - startReconnect(); - } + saveDefaultConfig(); + this.bridgeBukkit = new BridgeBukkitImpl(this); + this.bridgeBukkit.startReconnect(); } @Override public void onDisable() { - setNeedReconnect(false); - stopReconnect(); - stopPing(); - - if (client.isConnected()) { - getLogger().info("Disconnect..."); - client.disconnect(); - } - - INSTANCE = null; + this.bridgeBukkit.setNeedReconnect(false); + this.bridgeBukkit.stopPing(); + this.bridgeBukkit.stopReconnect(); + this.bridgeBukkit.disconnect(); } @Override @@ -56,67 +31,4 @@ public class BridgePlugin extends JavaPlugin { sender.sendMessage("ASys Bridge by DmitriyMX"); return true; } - - public void startReconnect() { - client = new Client(); - connectTicker = new TaskTicker().setStepTimeMs(5000L); - connectTicker.setTask(() -> { - getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect)); - client.connect(getConfig().getString("host"), getConfig().getInt("port")); - if (client.isConnected()) { - stopReconnect(); - } else { - getLogger().warning( - String.format("Connection(%d) fail. Try reconnect...", tryConnect)); - } - }).start(); - } - - public void stopReconnect() { - if (connectTicker != null) { - connectTicker.stop(); - tryConnect = 0; - } - } - - public void startPing(Channel channel) { - getLoggerAppender().setChannel(channel); - pingTicker = new TaskTicker().setStepTimeMs(5000L); - pingTicker.setTask(() -> { - channel.write(new CS_Ping( - System.currentTimeMillis(), - 20.0D, //FIXME - getServer().getOnlinePlayers().size() - )); - if (channel.isWritable()) { - channel.flush(); - } else { - getLogger().warning("Lost connection!"); - channel.close(); - stopPing(); - - getLogger().warning("Try reconnect..."); - startReconnect(); - } - }).start(); - } - - public void stopPing() { - getLoggerAppender().setChannel(null); - if (pingTicker != null) { - pingTicker.stop(); - } - } - - public BridgeLoggerAppender getLoggerAppender() { - return loggerAppender; - } - - public boolean isNeedReconnect() { - return needReconnect; - } - - public void setNeedReconnect(boolean needReconnect) { - this.needReconnect = needReconnect; - } } diff --git a/bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java b/bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java new file mode 100644 index 0000000..be56291 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java @@ -0,0 +1,26 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.bukkit; + +import asys.bridge.client.IConfig; +import org.bukkit.configuration.file.FileConfiguration; + +public class ConfigBukkitImpl implements IConfig { + private FileConfiguration fileConfiguration; + + public ConfigBukkitImpl(FileConfiguration fileConfiguration) { + this.fileConfiguration = fileConfiguration; + } + + @Override + public String getString(String path) { + return fileConfiguration.getString(path); + } + + @Override + public int getInt(String path) { + return fileConfiguration.getInt(path); + } +} diff --git a/bridge/src/main/java/asys/bridge/bukkit/LoggerBukkitImpl.java b/bridge/src/main/java/asys/bridge/bukkit/LoggerBukkitImpl.java new file mode 100644 index 0000000..53945d3 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/bukkit/LoggerBukkitImpl.java @@ -0,0 +1,32 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.bukkit; + +import asys.bridge.client.ILogger; + +import java.util.logging.Logger; + +public class LoggerBukkitImpl implements ILogger { + private Logger logger; + + LoggerBukkitImpl(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String string) { + logger.info(string); + } + + @Override + public void warn(String string) { + logger.warning(string); + } + + @Override + public void error(String string) { + logger.severe(string); + } +} diff --git a/bridge/src/main/java/asys/bridge/bukkit/TaskTicker.java b/bridge/src/main/java/asys/bridge/bukkit/TaskTicker.java index 3799467..02fa307 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/TaskTicker.java +++ b/bridge/src/main/java/asys/bridge/bukkit/TaskTicker.java @@ -10,23 +10,23 @@ public class TaskTicker implements Runnable { private Thread thread; private boolean loop = false; - TaskTicker setTask(Runnable task) { + public TaskTicker setTask(Runnable task) { this.task = task; return this; } - TaskTicker setStepTimeMs(long stepTimeMs) { + public TaskTicker setStepTimeMs(long stepTimeMs) { this.stepTimeMs = stepTimeMs; return this; } - void start() { + public void start() { thread = new Thread(this, "TaskTicker"); loop = true; thread.start(); } - void stop() { + public void stop() { loop = false; if (thread != null) { thread.interrupt(); diff --git a/bridge/src/main/java/asys/bridge/client/AbstractBridge.java b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java new file mode 100644 index 0000000..0cf592b --- /dev/null +++ b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java @@ -0,0 +1,86 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.client; + +import asys.bridge.bukkit.TaskTicker; +import asys.mcsmanager.packets.CS_Ping; +import io.netty.channel.Channel; + +public abstract class AbstractBridge implements IBridge { + private Client client; + private TaskTicker connectTicker, pingTicker; + private int tryConnect = 0; + private boolean needReconnect = true; + + @Override + public void startReconnect() { + client = new Client(this); + connectTicker = new TaskTicker().setStepTimeMs(5000L); + connectTicker.setTask(() -> { + getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect)); + client.connect(getConfig().getString("host"), getConfig().getInt("port")); + if (client.isConnected()) { + stopReconnect(); + } else { + getLogger().warn(String.format("Connection(%d) fail. Try reconnect...", tryConnect)); + } + }).start(); + } + + @Override + public boolean isNeedReconnect() { + return needReconnect; + } + + @Override + public void setNeedReconnect(boolean value) { + this.needReconnect = value; + } + + @Override + public void stopReconnect() { + if (connectTicker != null) { + connectTicker.stop(); + tryConnect = 0; + } + } + + @Override + public void startPing(Channel channel) { + pingTicker = new TaskTicker().setStepTimeMs(5000L); + pingTicker.setTask(() -> { + channel.write(new CS_Ping( + System.currentTimeMillis(), + 20.0D, //FIXME fake tps + getCountOnlinePlayers() + )); + if (channel.isWritable()) { + channel.flush(); + } else { + getLogger().warn("Lost connection!"); + channel.close(); + stopPing(); + + getLogger().warn("Try reconnect..."); + startReconnect(); + } + }).start(); + } + + @Override + public void stopPing() { + if (pingTicker != null) { + pingTicker.stop(); + } + } + + @Override + public void disconnect() { + if (client.isConnected()) { + getLogger().info("Disconnect..."); + client.disconnect(); + } + } +} diff --git a/bridge/src/main/java/asys/bridge/client/Client.java b/bridge/src/main/java/asys/bridge/client/Client.java index df6fd0c..b9d354b 100644 --- a/bridge/src/main/java/asys/bridge/client/Client.java +++ b/bridge/src/main/java/asys/bridge/client/Client.java @@ -19,6 +19,11 @@ public class Client { private EventLoopGroup group; private Bootstrap bootstrap; private ChannelFuture channelFuture; + private IBridge bridge; + + public Client(IBridge bridge) { + this.bridge = bridge; + } public void connect(String host, int port) { if (group == null || bootstrap == null) { @@ -55,7 +60,7 @@ public class Client { new PacketEncoder(), new PacketDecoder(), new PacketHandler(), - new ClientPacketHandler() + new ClientPacketHandler(bridge) ); } }; diff --git a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java index 0360d8e..3dce8f3 100644 --- a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java +++ b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java @@ -29,8 +29,10 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements 4, CS_ConsoleMessage.class, 5, SC_Command.class ); + private IBridge bridge; - ClientPacketHandler() { + ClientPacketHandler(IBridge bridge) { + this.bridge = bridge; if (handshakeHandlers == null) { handshakeHandlers = ImmutableMap.of( SC_HandshakeResult.class, this, @@ -41,26 +43,24 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements @Override public void channelActive(ChannelHandlerContext context) throws Exception { - BridgePlugin.INSTANCE.getLogger().info("channelActive"); + bridge.getLogger().info("channelActive"); 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..."); + bridge.getConfig().getString("clientId"), + bridge.getConfig().getString("passcode")); + bridge.getLogger().info("send Handshake packet..."); context.channel().writeAndFlush(packet); super.channelActive(context); } @Override public void channelInactive(ChannelHandlerContext context) throws Exception { - if (BridgePlugin.INSTANCE != null) { - BridgePlugin.INSTANCE.stopPing(); - if (BridgePlugin.INSTANCE.isNeedReconnect()) { - BridgePlugin.INSTANCE.getLogger().warning("Lost connection! Try reconnect..."); - BridgePlugin.INSTANCE.startReconnect(); - } + bridge.stopPing(); + if (bridge.isNeedReconnect()) { + bridge.getLogger().warn("Lost connection! Try reconnect..."); + bridge.startReconnect(); } context.channel().attr(KNOWN_PACKETS).remove(); context.channel().attr(KNOWN_HANDLERS).remove(); @@ -69,7 +69,7 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements @Override public void handle(Packet packet, ChannelHandlerContext context) { - BridgePlugin.INSTANCE.getLogger().info("handle : " + packet.getClass().getSimpleName()); + bridge.getLogger().info("handle : " + packet.getClass().getSimpleName()); if (packet instanceof SC_HandshakeResult) { handleHandshakeResult((SC_HandshakeResult) packet, context); } else if (packet instanceof SC_Command) { @@ -79,21 +79,18 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements private void handleHandshakeResult(SC_HandshakeResult packet, ChannelHandlerContext context) { if (packet.getErrorCode() != 0) { - BridgePlugin.INSTANCE.getLogger().severe( + bridge.getLogger().error( String.format("Handshake: #%d %s", packet.getErrorCode(), packet.getMessage())); - BridgePlugin.INSTANCE.setNeedReconnect(false); + bridge.setNeedReconnect(false); } else { context.channel().attr(KNOWN_PACKETS).set(pingPackets); - BridgePlugin.INSTANCE.getLogger().info("Handshake: OK"); - BridgePlugin.INSTANCE.startPing(context.channel()); + bridge.getLogger().info("Handshake: OK"); + bridge.startPing(context.channel()); } } private void handleCommand(SC_Command packet) { - BridgePlugin.INSTANCE.getLogger().info("Command: " + packet.getCommand()); - BridgePlugin.INSTANCE.getServer().dispatchCommand( - BridgePlugin.INSTANCE.getServer().getConsoleSender(), - packet.getCommand() - ); + bridge.getLogger().info("Command: " + packet.getCommand()); + bridge.dispatchCommand(packet.getCommand()); } } diff --git a/bridge/src/main/java/asys/bridge/client/IBridge.java b/bridge/src/main/java/asys/bridge/client/IBridge.java new file mode 100644 index 0000000..3ded3e8 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/client/IBridge.java @@ -0,0 +1,21 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.client; + +import io.netty.channel.Channel; + +public interface IBridge { + ILogger getLogger(); + IConfig getConfig(); + int getCountOnlinePlayers(); + void dispatchCommand(String command); + void startReconnect(); + boolean isNeedReconnect(); + void setNeedReconnect(boolean value); + void stopReconnect(); + void startPing(Channel channel); + void stopPing(); + void disconnect(); +} diff --git a/bridge/src/main/java/asys/bridge/client/IConfig.java b/bridge/src/main/java/asys/bridge/client/IConfig.java new file mode 100644 index 0000000..fe1e084 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/client/IConfig.java @@ -0,0 +1,10 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.client; + +public interface IConfig { + String getString(String path); + int getInt(String path); +} diff --git a/bridge/src/main/java/asys/bridge/client/ILogger.java b/bridge/src/main/java/asys/bridge/client/ILogger.java new file mode 100644 index 0000000..5d62261 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/client/ILogger.java @@ -0,0 +1,11 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.client; + +public interface ILogger { + void info(String string); + void warn(String string); + void error(String string); +}