blob: dc7e998d8251248559ea136ccace4f6a44dd9c36 [file] [log] [blame] [raw]
package protocolsupport.protocol;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.text.MessageFormat;
import org.bukkit.entity.Player;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.AttributeKey;
import protocolsupport.api.Connection;
import protocolsupport.api.ProtocolVersion;
import protocolsupport.protocol.pipeline.ChannelHandlers;
import protocolsupport.protocol.storage.ProtocolStorage;
import protocolsupport.zplatform.network.NetworkManagerWrapper;
public class ConnectionImpl extends Connection {
protected static final AttributeKey<ConnectionImpl> key = AttributeKey.valueOf("PSConnectionImpl");
protected final NetworkManagerWrapper networkmanager;
public ConnectionImpl(NetworkManagerWrapper networkmanager) {
this.networkmanager = networkmanager;
}
public NetworkManagerWrapper getNetworkManagerWrapper() {
return networkmanager;
}
@Override
public Object getNetworkManager() {
return networkmanager.unwrap();
}
@Override
public boolean isConnected() {
return networkmanager.isConnected();
}
@Override
public InetSocketAddress getRawAddress() {
return networkmanager.getRawAddress();
}
@Override
public InetSocketAddress getAddress() {
return networkmanager.getAddress();
}
@Override
public void changeAddress(InetSocketAddress newRemote) {
SocketAddress primaryaddr = networkmanager.getRawAddress();
ProtocolStorage.addAddress(primaryaddr, newRemote);
networkmanager.setAddress(newRemote);
}
@Override
public Player getPlayer() {
return networkmanager.getBukkitPlayer();
}
@Override
public void sendPacket(Object packet) {
Runnable packetSend = () -> {
try {
ChannelHandlerContext ctx = networkmanager.getChannel().pipeline().context(ChannelHandlers.LOGIC);
ctx.writeAndFlush(packet);
} catch (Throwable t) {
System.err.println("Error occured while packet sending");
t.printStackTrace();
}
};
if (networkmanager.getChannel().eventLoop().inEventLoop()) {
packetSend.run();
} else {
networkmanager.getChannel().eventLoop().submit(packetSend);
}
}
@Override
public void receivePacket(Object packet) {
Runnable packetRecv = () -> {
try {
ChannelHandlerContext ctx = networkmanager.getChannel().pipeline().context(ChannelHandlers.LOGIC);
ctx.fireChannelRead(packet);
} catch (Throwable t) {
System.err.println("Error occured while packet receiving");
t.printStackTrace();
}
};
if (networkmanager.getChannel().eventLoop().inEventLoop()) {
packetRecv.run();
} else {
networkmanager.getChannel().eventLoop().submit(packetRecv);
}
}
@Override
public void sendRawPacket(byte[] data) {
ByteBuf dataInst = Unpooled.wrappedBuffer(data);
Runnable packetSend = () -> {
try {
ChannelHandlerContext ctx = networkmanager.getChannel().pipeline().context(ChannelHandlers.ENCODER_TRANSFORMER);
ctx.writeAndFlush(dataInst);
} catch (Throwable t) {
System.err.println("Error occured while raw packet sending");
t.printStackTrace();
}
};
if (networkmanager.getChannel().eventLoop().inEventLoop()) {
packetSend.run();
} else {
networkmanager.getChannel().eventLoop().submit(packetSend);
}
}
public static ConnectionImpl getFromChannel(Channel channel) {
return channel.attr(key).get();
}
public void storeInChannel(Channel channel) {
channel.attr(key).set(this);
}
public void setVersion(ProtocolVersion version) {
this.version = version;
}
public boolean handlePacketSend(Object packet) {
boolean canSend = true;
for (PacketSendListener listener : sendListeners) {
try {
if (!listener.onPacketSending(packet)) {
canSend = false;
}
} catch (Throwable t) {
System.err.println("Error occured while handling packet sending");
t.printStackTrace();
}
}
return canSend;
}
public boolean handlePacketReceive(Object packet) {
boolean canReceive = true;
for (PacketReceiveListener listener : receiveListeners) {
try {
if (!listener.onPacketReceiving(packet)) {
canReceive = false;
}
} catch (Throwable t) {
System.err.println("Error occured while handling packet receiving");
t.printStackTrace();
}
}
return canReceive;
}
@Override
public String toString() {
return MessageFormat.format(
"{0}(player: {1}, address: {2}, rawaddress: {3}, version: {4}, metadata: {5}, rlisteners: {6}, slisteners: {7})",
getClass().getName(), getPlayer(), getAddress(), getRawAddress(), getVersion(), metadata, receiveListeners, sendListeners
);
}
}