Bridge: посылаем пинг-пакеты
This commit is contained in:
@@ -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/' }
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user