Archived
0

Bridge: режимы работы

Теперь есть два режима: 1 и 2.
1 - это стандартный режим, когда подключение идет напрямую к ASys.
2 - это новый режим, когда подключением к ASys занимается Zond. Bridge в таком режиме является лишь "мостиком" между игровым API и ASys.
This commit is contained in:
2017-06-08 11:49:29 +03:00
parent 3f65ab33f9
commit 1151f1580c
5 changed files with 68 additions and 24 deletions

20
bridge/README.MD Normal file
View File

@@ -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` игнорируется.

View File

@@ -1,5 +1,5 @@
group = 'asys' group = 'asys'
version = '0.5.2-SNAPSHOT' version = '0.6-SNAPSHOT'
repositories { repositories {
maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' }

View File

@@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit;
public class BridgePlugin extends JavaPlugin { public class BridgePlugin extends JavaPlugin {
public static BridgePlugin INSTANCE; public static BridgePlugin INSTANCE;
private String appConnect = "ASys";
private Client client; private Client client;
private ScheduledExecutorService ses; private ScheduledExecutorService ses;
private ScheduledFuture<?> sesFuture, sesPingFuture; private ScheduledFuture<?> sesFuture, sesPingFuture;
@@ -28,7 +29,12 @@ public class BridgePlugin extends JavaPlugin {
@Override @Override
public void onLoad() { 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(); onEnable();
} }
@@ -36,8 +42,6 @@ public class BridgePlugin extends JavaPlugin {
public void onEnable() { public void onEnable() {
if (INSTANCE == null) { if (INSTANCE == null) {
INSTANCE = this; INSTANCE = this;
saveDefaultConfig();
startReconnect(); startReconnect();
} }
} }
@@ -68,8 +72,12 @@ public class BridgePlugin extends JavaPlugin {
client = new Client(); client = new Client();
ses = Executors.newScheduledThreadPool(2); ses = Executors.newScheduledThreadPool(2);
sesFuture = ses.scheduleAtFixedRate(() -> { sesFuture = ses.scheduleAtFixedRate(() -> {
getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect)); getLogger().info(String.format("Connect(%d) to %s...", ++tryConnect, appConnect));
if (getConfig().getInt("mode") == 1) {
client.connect(getConfig().getString("host"), getConfig().getInt("port")); client.connect(getConfig().getString("host"), getConfig().getInt("port"));
} else {
client.connect("127.0.0.1", getConfig().getInt("port"));
}
if (client.isConnected()) { if (client.isConnected()) {
stopReconnect(); stopReconnect();
} else { } else {
@@ -88,7 +96,9 @@ public class BridgePlugin extends JavaPlugin {
} }
public void startPing(Channel channel) { public void startPing(Channel channel) {
if (getConfig().getInt("mode") == 1) {
getLoggerAppender().setChannel(channel); getLoggerAppender().setChannel(channel);
}
sesPingFuture = ses.scheduleAtFixedRate(() -> { sesPingFuture = ses.scheduleAtFixedRate(() -> {
channel.write(new CS_Ping( channel.write(new CS_Ping(
System.currentTimeMillis(), System.currentTimeMillis(),
@@ -109,13 +119,15 @@ public class BridgePlugin extends JavaPlugin {
} }
public void stopPing() { public void stopPing() {
if (getConfig().getInt("mode") == 1) {
getLoggerAppender().setChannel(null); getLoggerAppender().setChannel(null);
}
if (sesPingFuture != null) { if (sesPingFuture != null) {
sesPingFuture.cancel(false); sesPingFuture.cancel(false);
} }
} }
public BridgeLoggerAppender getLoggerAppender() { private BridgeLoggerAppender getLoggerAppender() {
return loggerAppender; return loggerAppender;
} }
} }

View File

@@ -40,14 +40,21 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
@Override @Override
public void channelActive(ChannelHandlerContext context) throws Exception { public void channelActive(ChannelHandlerContext context) throws Exception {
BridgePlugin.INSTANCE.getLogger().info("channelActive"); BridgePlugin.INSTANCE.getLogger().info("channelActive");
if (BridgePlugin.INSTANCE.getConfig().getInt("mode") == 1) {
context.channel().attr(KNOWN_PACKETS).set(handshakePackets); context.channel().attr(KNOWN_PACKETS).set(handshakePackets);
context.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); context.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers);
CS_Handshake packet = new CS_Handshake( CS_Handshake packet = new CS_Handshake(
BridgePlugin.INSTANCE.getConfig().getString("clientId"), BridgePlugin.INSTANCE.getConfig().getString("clientId"),
BridgePlugin.INSTANCE.getConfig().getString("passcode")); BridgePlugin.INSTANCE.getConfig().getString("passcode"));
BridgePlugin.INSTANCE.getLogger().info("send Handshake packet..."); BridgePlugin.INSTANCE.getLogger().info("send Handshake packet...");
context.channel().writeAndFlush(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); super.channelActive(context);
} }
@@ -67,6 +74,7 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
@Override @Override
public void handle(Packet packet, ChannelHandlerContext context) { public void handle(Packet packet, ChannelHandlerContext context) {
BridgePlugin.INSTANCE.getLogger().info("handle : " + packet.getClass().getSimpleName()); BridgePlugin.INSTANCE.getLogger().info("handle : " + packet.getClass().getSimpleName());
if (BridgePlugin.INSTANCE.getConfig().getInt("mode") == 1) {
SC_HandshakeResult pkt = (SC_HandshakeResult) packet; SC_HandshakeResult pkt = (SC_HandshakeResult) packet;
if (pkt.getErrorCode() != 0) { if (pkt.getErrorCode() != 0) {
BridgePlugin.INSTANCE.getLogger().severe( BridgePlugin.INSTANCE.getLogger().severe(
@@ -77,4 +85,5 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
BridgePlugin.INSTANCE.startPing(context.channel()); BridgePlugin.INSTANCE.startPing(context.channel());
} }
} }
}
} }

View File

@@ -1,4 +1,7 @@
clientId: SpigotServer0 clientId: SpigotServer0
# 1 - прямое соединение с ASys. Сообщения из консоли перехватываются
# 2 - подключение через Zond. Сообщения из консоли не перехватываются
mode: 1
host: 127.0.0.1 host: 127.0.0.1
port: 8779 port: 8779
passcode: testpassphrase passcode: testpassphrase