Merge remote-tracking branch 'origin/dev-webconsole' into local-merge
# Conflicts: # bridge-protocol/build.gradle # bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java # bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java # mcserver-manager/build.gradle # mcserver-manager/src/main/java/asys/mcsmanager/server/ServerPacketHandler.java
This commit is contained in:
@@ -13,25 +13,19 @@ import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
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;
|
||||
private TaskTicker connectTicker, pingTicker;
|
||||
private int tryConnect = 0;
|
||||
private BridgeLoggerAppender loggerAppender;
|
||||
private boolean needReconnect = true;
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
saveDefaultConfig();
|
||||
if (getConfig().getInt("mode") == 1) {
|
||||
((Logger) LogManager.getRootLogger()).addAppender(loggerAppender = new BridgeLoggerAppender());
|
||||
((Logger)LogManager.getRootLogger()).addAppender(loggerAppender = new BridgeLoggerAppender());
|
||||
} else {
|
||||
this.appConnect = "Zond";
|
||||
}
|
||||
@@ -42,16 +36,16 @@ public class BridgePlugin extends JavaPlugin {
|
||||
public void onEnable() {
|
||||
if (INSTANCE == null) {
|
||||
INSTANCE = this;
|
||||
saveDefaultConfig();
|
||||
|
||||
startReconnect();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
if (sesFuture != null) {
|
||||
sesFuture.cancel(false);
|
||||
}
|
||||
|
||||
setNeedReconnect(false);
|
||||
stopReconnect();
|
||||
stopPing();
|
||||
|
||||
if (client.isConnected()) {
|
||||
@@ -70,8 +64,8 @@ public class BridgePlugin extends JavaPlugin {
|
||||
|
||||
public void startReconnect() {
|
||||
client = new Client();
|
||||
ses = Executors.newScheduledThreadPool(2);
|
||||
sesFuture = ses.scheduleAtFixedRate(() -> {
|
||||
connectTicker = new TaskTicker().setStepTimeMs(5000L);
|
||||
connectTicker.setTask(() -> {
|
||||
getLogger().info(String.format("Connect(%d) to %s...", ++tryConnect, appConnect));
|
||||
if (getConfig().getInt("mode") == 1) {
|
||||
client.connect(getConfig().getString("host"), getConfig().getInt("port"));
|
||||
@@ -84,13 +78,12 @@ public class BridgePlugin extends JavaPlugin {
|
||||
getLogger().warning(
|
||||
String.format("Connection(%d) fail. Try reconnect...", tryConnect));
|
||||
}
|
||||
}, 0L, 5L, TimeUnit.SECONDS);
|
||||
}).start();
|
||||
}
|
||||
|
||||
public void stopReconnect() {
|
||||
if (sesFuture != null) {
|
||||
sesFuture.cancel(false);
|
||||
sesFuture = null;
|
||||
if (connectTicker != null) {
|
||||
connectTicker.stop();
|
||||
tryConnect = 0;
|
||||
}
|
||||
}
|
||||
@@ -99,7 +92,8 @@ public class BridgePlugin extends JavaPlugin {
|
||||
if (getConfig().getInt("mode") == 1) {
|
||||
getLoggerAppender().setChannel(channel);
|
||||
}
|
||||
sesPingFuture = ses.scheduleAtFixedRate(() -> {
|
||||
pingTicker = new TaskTicker().setStepTimeMs(5000L);
|
||||
pingTicker.setTask(() -> {
|
||||
channel.write(new CS_Ping(
|
||||
System.currentTimeMillis(),
|
||||
20.0D, //FIXME
|
||||
@@ -115,19 +109,27 @@ public class BridgePlugin extends JavaPlugin {
|
||||
getLogger().warning("Try reconnect...");
|
||||
startReconnect();
|
||||
}
|
||||
}, 0L, 5L, TimeUnit.SECONDS);
|
||||
}).start();
|
||||
}
|
||||
|
||||
public void stopPing() {
|
||||
if (getConfig().getInt("mode") == 1) {
|
||||
getLoggerAppender().setChannel(null);
|
||||
}
|
||||
if (sesPingFuture != null) {
|
||||
sesPingFuture.cancel(false);
|
||||
if (pingTicker != null) {
|
||||
pingTicker.stop();
|
||||
}
|
||||
}
|
||||
|
||||
private BridgeLoggerAppender getLoggerAppender() {
|
||||
public BridgeLoggerAppender getLoggerAppender() {
|
||||
return loggerAppender;
|
||||
}
|
||||
|
||||
public boolean isNeedReconnect() {
|
||||
return needReconnect;
|
||||
}
|
||||
|
||||
public void setNeedReconnect(boolean needReconnect) {
|
||||
this.needReconnect = needReconnect;
|
||||
}
|
||||
}
|
||||
|
||||
48
bridge/src/main/java/asys/bridge/bukkit/TaskTicker.java
Normal file
48
bridge/src/main/java/asys/bridge/bukkit/TaskTicker.java
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* DmitriyMX <d.mihailov@samson-rus.com>
|
||||
* 2017-05-18
|
||||
*/
|
||||
package asys.bridge.bukkit;
|
||||
|
||||
public class TaskTicker implements Runnable {
|
||||
private Runnable task;
|
||||
private long stepTimeMs = 1000L;
|
||||
private Thread thread;
|
||||
private boolean loop = false;
|
||||
|
||||
TaskTicker setTask(Runnable task) {
|
||||
this.task = task;
|
||||
return this;
|
||||
}
|
||||
|
||||
TaskTicker setStepTimeMs(long stepTimeMs) {
|
||||
this.stepTimeMs = stepTimeMs;
|
||||
return this;
|
||||
}
|
||||
|
||||
void start() {
|
||||
thread = new Thread(this, "TaskTicker");
|
||||
loop = true;
|
||||
thread.start();
|
||||
}
|
||||
|
||||
void stop() {
|
||||
loop = false;
|
||||
if (thread != null) {
|
||||
thread.interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while (loop || !Thread.currentThread().isInterrupted()) {
|
||||
task.run();
|
||||
|
||||
try {
|
||||
Thread.sleep(stepTimeMs);
|
||||
} catch (InterruptedException e) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,13 +26,15 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
|
||||
|
||||
private static final BiMap<Integer, Class<? extends Packet>> pingPackets = ImmutableBiMap.of(
|
||||
3, CS_Ping.class,
|
||||
4, CS_ConsoleMessage.class
|
||||
4, CS_ConsoleMessage.class,
|
||||
5, SC_Command.class
|
||||
);
|
||||
|
||||
ClientPacketHandler() {
|
||||
if (handshakeHandlers == null) {
|
||||
handshakeHandlers = ImmutableMap.of(
|
||||
SC_HandshakeResult.class, this
|
||||
SC_HandshakeResult.class, this,
|
||||
SC_Command.class, this
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -61,10 +63,11 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
|
||||
@Override
|
||||
public void channelInactive(ChannelHandlerContext context) throws Exception {
|
||||
if (BridgePlugin.INSTANCE != null) {
|
||||
BridgePlugin.INSTANCE.getLogger().warning("Lost connection!");
|
||||
BridgePlugin.INSTANCE.stopPing();
|
||||
BridgePlugin.INSTANCE.getLogger().warning("Try reconnect...");
|
||||
BridgePlugin.INSTANCE.startReconnect();
|
||||
if (BridgePlugin.INSTANCE.isNeedReconnect()) {
|
||||
BridgePlugin.INSTANCE.getLogger().warning("Lost connection! Try reconnect...");
|
||||
BridgePlugin.INSTANCE.startReconnect();
|
||||
}
|
||||
}
|
||||
context.channel().attr(KNOWN_PACKETS).remove();
|
||||
context.channel().attr(KNOWN_HANDLERS).remove();
|
||||
@@ -74,16 +77,32 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
|
||||
@Override
|
||||
public void handle(Packet packet, ChannelHandlerContext context) {
|
||||
BridgePlugin.INSTANCE.getLogger().info("handle : " + packet.getClass().getSimpleName());
|
||||
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());
|
||||
if (packet instanceof SC_HandshakeResult) {
|
||||
if (BridgePlugin.INSTANCE.getConfig().getInt("mode") == 1) {
|
||||
handleHandshakeResult((SC_HandshakeResult) packet, context);
|
||||
}
|
||||
} else if (packet instanceof SC_Command) {
|
||||
handleCommand((SC_Command) packet);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleHandshakeResult(SC_HandshakeResult packet, ChannelHandlerContext context) {
|
||||
if (packet.getErrorCode() != 0) {
|
||||
BridgePlugin.INSTANCE.getLogger().severe(
|
||||
String.format("Handshake: #%d %s", packet.getErrorCode(), packet.getMessage()));
|
||||
BridgePlugin.INSTANCE.setNeedReconnect(false);
|
||||
} else {
|
||||
context.channel().attr(KNOWN_PACKETS).set(pingPackets);
|
||||
BridgePlugin.INSTANCE.getLogger().info("Handshake: OK");
|
||||
BridgePlugin.INSTANCE.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()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user