package net.md_5.bungee; import java.beans.ConstructorProperties; import java.net.InetSocketAddress; import java.util.concurrent.TimeUnit; import net.md_5.bungee.api.connection.Connection; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.netty.ChannelWrapper; import net.md_5.bungee.protocol.packet.DefinedPacket; import net.md_5.bungee.protocol.packet.PacketFAPluginMessage; import net.md_5.bungee.protocol.packet.PacketFFKick; public class ServerConnection implements Server { private final ChannelWrapper ch; private final BungeeServerInfo info; private boolean isObsolete; private Unsafe unsafe = new Unsafe() { @Override public void sendPacket(DefinedPacket packet) { ch.write( packet ); } }; @Override public void sendData(String channel, byte[] data) { unsafe().sendPacket( new PacketFAPluginMessage( channel, data ) ); } @Override public synchronized void disconnect(String reason) { if ( !ch.isClosed() ) { // TODO: Can we just use a future here? unsafe().sendPacket( new PacketFFKick( reason ) ); ch.getHandle().eventLoop().schedule( new Runnable() { @Override public void run() { ch.getHandle().close(); } }, 100, TimeUnit.MILLISECONDS ); } } @Override public InetSocketAddress getAddress() { return getInfo().getAddress(); } @Override public Unsafe unsafe() { return unsafe; } @ConstructorProperties({ "ch", "info" }) public ServerConnection(final ChannelWrapper ch, final BungeeServerInfo info) { this.unsafe = new Connection.Unsafe() { @Override public void sendPacket(final DefinedPacket packet) { if (ServerConnection.this.ch != null) ServerConnection.this.ch.write(packet); } }; this.ch = ch; this.info = info; } public ChannelWrapper getCh() { return this.ch; } @Override public BungeeServerInfo getInfo() { return this.info; } public boolean isObsolete() { return this.isObsolete; } public void setObsolete(final boolean isObsolete) { this.isObsolete = isObsolete; } }