From 49ae0220fe01bd7118d3b5a9d2be81e34c78cde0 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 1 May 2017 12:28:35 +0300 Subject: [PATCH] =?UTF-8?q?Bridge:=20=D0=BF=D0=BE=D1=81=D1=8B=D0=BB=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BF=D0=B8=D0=BD=D0=B3-=D0=BF=D0=B0=D0=BA?= =?UTF-8?q?=D0=B5=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bridge/build.gradle | 2 +- .../java/asys/bridge/bukkit/BridgePlugin.java | 29 ++++++++++++++++--- .../bridge/client/ClientPacketHandler.java | 20 ++++++++++--- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/bridge/build.gradle b/bridge/build.gradle index 38d2c7a..0bbed36 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.4-SNAPSHOT' +version = '0.5-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 f4d4734..1132cca 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java @@ -5,16 +5,22 @@ package asys.bridge.bukkit; import asys.bridge.client.Client; +import asys.mcsmanager.packets.CS_Ping; +import io.netty.channel.Channel; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; -import java.util.concurrent.*; +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 Client client; - private ScheduledFuture sesFuture; + private ScheduledExecutorService ses; + private ScheduledFuture sesFuture, sesPingFuture; private int tryConnect = 0; @Override @@ -23,12 +29,11 @@ public class BridgePlugin extends JavaPlugin { saveDefaultConfig(); client = new Client(); - ScheduledExecutorService ses = Executors.newScheduledThreadPool(1); + ses = Executors.newScheduledThreadPool(2); sesFuture = ses.scheduleAtFixedRate(() -> { getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect)); client.connect(getConfig().getString("host"), getConfig().getInt("port")); if (client.isConnected()) { - getLogger().info(String.format("Connect(%d) OK", tryConnect)); sesFuture.cancel(false); sesFuture = null; } else { @@ -44,6 +49,8 @@ public class BridgePlugin extends JavaPlugin { sesFuture.cancel(false); } + stopPing(); + if (client.isConnected()) { getLogger().info("Disconnect..."); client.disconnect(); @@ -57,4 +64,18 @@ public class BridgePlugin extends JavaPlugin { sender.sendMessage("ASys Bridge by DmitriyMX"); return true; } + + public void startPing(Channel channel) { + sesPingFuture = ses.scheduleAtFixedRate(() -> channel.writeAndFlush(new CS_Ping( + System.currentTimeMillis(), + 20.0D, //FIXME + BridgePlugin.INSTANCE.getServer().getOnlinePlayers().size() + )), 0L, 5L, TimeUnit.SECONDS); + } + + public void stopPing() { + if (sesPingFuture != null) { + sesPingFuture.cancel(false); + } + } } diff --git a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java index bcf3c74..e2c0bd4 100644 --- a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java +++ b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java @@ -5,10 +5,7 @@ package asys.bridge.client; import asys.bridge.bukkit.BridgePlugin; -import asys.mcsmanager.packets.CS_Handshake; -import asys.mcsmanager.packets.IPacketHandler; -import asys.mcsmanager.packets.Packet; -import asys.mcsmanager.packets.SC_HandshakeResult; +import asys.mcsmanager.packets.*; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableMap; @@ -27,6 +24,10 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements ); private static Map, IPacketHandler> handshakeHandlers; + private static final BiMap> pingPackets = ImmutableBiMap.of( + 3, CS_Ping.class + ); + ClientPacketHandler() { if (handshakeHandlers == null) { handshakeHandlers = ImmutableMap.of( @@ -37,29 +38,40 @@ 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); 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); + super.channelActive(context); } @Override public void channelInactive(ChannelHandlerContext context) throws Exception { + if (BridgePlugin.INSTANCE != null) { + BridgePlugin.INSTANCE.getLogger().info("channelInactive"); + BridgePlugin.INSTANCE.stopPing(); + } context.channel().attr(KNOWN_PACKETS).remove(); context.channel().attr(KNOWN_HANDLERS).remove(); + super.channelInactive(context); } @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()); } } }