@@ -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/' }
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* DmitriyMX <d.mihailov@samson-rus.com>
|
||||
* 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
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* DmitriyMX <d.mihailov@samson-rus.com>
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* DmitriyMX <d.mihailov@samson-rus.com>
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
86
bridge/src/main/java/asys/bridge/client/AbstractBridge.java
Normal file
86
bridge/src/main/java/asys/bridge/client/AbstractBridge.java
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* DmitriyMX <d.mihailov@samson-rus.com>
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
21
bridge/src/main/java/asys/bridge/client/IBridge.java
Normal file
21
bridge/src/main/java/asys/bridge/client/IBridge.java
Normal file
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* DmitriyMX <d.mihailov@samson-rus.com>
|
||||
* 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();
|
||||
}
|
||||
10
bridge/src/main/java/asys/bridge/client/IConfig.java
Normal file
10
bridge/src/main/java/asys/bridge/client/IConfig.java
Normal file
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
* DmitriyMX <d.mihailov@samson-rus.com>
|
||||
* 2017-05-17
|
||||
*/
|
||||
package asys.bridge.client;
|
||||
|
||||
public interface IConfig {
|
||||
String getString(String path);
|
||||
int getInt(String path);
|
||||
}
|
||||
11
bridge/src/main/java/asys/bridge/client/ILogger.java
Normal file
11
bridge/src/main/java/asys/bridge/client/ILogger.java
Normal file
@@ -0,0 +1,11 @@
|
||||
/*
|
||||
* DmitriyMX <d.mihailov@samson-rus.com>
|
||||
* 2017-05-17
|
||||
*/
|
||||
package asys.bridge.client;
|
||||
|
||||
public interface ILogger {
|
||||
void info(String string);
|
||||
void warn(String string);
|
||||
void error(String string);
|
||||
}
|
||||
Reference in New Issue
Block a user