Archived
0

Bridge: посылаем пинг-пакеты

This commit is contained in:
2017-05-01 12:28:35 +03:00
parent 835900260d
commit 49ae0220fe
3 changed files with 42 additions and 9 deletions

View File

@@ -1,5 +1,5 @@
group = 'asys' group = 'asys'
version = '0.4-SNAPSHOT' version = '0.5-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

@@ -5,16 +5,22 @@
package asys.bridge.bukkit; package asys.bridge.bukkit;
import asys.bridge.client.Client; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin; 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 class BridgePlugin extends JavaPlugin {
public static BridgePlugin INSTANCE; public static BridgePlugin INSTANCE;
private Client client; private Client client;
private ScheduledFuture<?> sesFuture; private ScheduledExecutorService ses;
private ScheduledFuture<?> sesFuture, sesPingFuture;
private int tryConnect = 0; private int tryConnect = 0;
@Override @Override
@@ -23,12 +29,11 @@ public class BridgePlugin extends JavaPlugin {
saveDefaultConfig(); saveDefaultConfig();
client = new Client(); client = new Client();
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1); 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 ASys...", ++tryConnect));
client.connect(getConfig().getString("host"), getConfig().getInt("port")); client.connect(getConfig().getString("host"), getConfig().getInt("port"));
if (client.isConnected()) { if (client.isConnected()) {
getLogger().info(String.format("Connect(%d) OK", tryConnect));
sesFuture.cancel(false); sesFuture.cancel(false);
sesFuture = null; sesFuture = null;
} else { } else {
@@ -44,6 +49,8 @@ public class BridgePlugin extends JavaPlugin {
sesFuture.cancel(false); sesFuture.cancel(false);
} }
stopPing();
if (client.isConnected()) { if (client.isConnected()) {
getLogger().info("Disconnect..."); getLogger().info("Disconnect...");
client.disconnect(); client.disconnect();
@@ -57,4 +64,18 @@ public class BridgePlugin extends JavaPlugin {
sender.sendMessage("ASys Bridge by DmitriyMX"); sender.sendMessage("ASys Bridge by DmitriyMX");
return true; 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);
}
}
} }

View File

@@ -5,10 +5,7 @@
package asys.bridge.client; package asys.bridge.client;
import asys.bridge.bukkit.BridgePlugin; import asys.bridge.bukkit.BridgePlugin;
import asys.mcsmanager.packets.CS_Handshake; import asys.mcsmanager.packets.*;
import asys.mcsmanager.packets.IPacketHandler;
import asys.mcsmanager.packets.Packet;
import asys.mcsmanager.packets.SC_HandshakeResult;
import com.google.common.collect.BiMap; import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
@@ -27,6 +24,10 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
); );
private static Map<Class<? extends Packet>, IPacketHandler> handshakeHandlers; private static Map<Class<? extends Packet>, IPacketHandler> handshakeHandlers;
private static final BiMap<Integer, Class<? extends Packet>> pingPackets = ImmutableBiMap.of(
3, CS_Ping.class
);
ClientPacketHandler() { ClientPacketHandler() {
if (handshakeHandlers == null) { if (handshakeHandlers == null) {
handshakeHandlers = ImmutableMap.of( handshakeHandlers = ImmutableMap.of(
@@ -37,29 +38,40 @@ 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");
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...");
context.channel().writeAndFlush(packet); context.channel().writeAndFlush(packet);
super.channelActive(context);
} }
@Override @Override
public void channelInactive(ChannelHandlerContext context) throws Exception { 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_PACKETS).remove();
context.channel().attr(KNOWN_HANDLERS).remove(); context.channel().attr(KNOWN_HANDLERS).remove();
super.channelInactive(context);
} }
@Override @Override
public void handle(Packet packet, ChannelHandlerContext context) { public void handle(Packet packet, ChannelHandlerContext context) {
BridgePlugin.INSTANCE.getLogger().info("handle : " + packet.getClass().getSimpleName());
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(
String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage())); String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage()));
} else { } else {
context.channel().attr(KNOWN_PACKETS).set(pingPackets);
BridgePlugin.INSTANCE.getLogger().info("Handshake: OK"); BridgePlugin.INSTANCE.getLogger().info("Handshake: OK");
BridgePlugin.INSTANCE.startPing(context.channel());
} }
} }
} }