package org.starmod.net.pipeline;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.starmod.net.NetworkClient;
import org.starmod.net.Command;
import org.starmod.net.NetworkServer;
import java.util.concurrent.atomic.AtomicReference;
public class CommandHandler extends SimpleChannelInboundHandler<Command> {
private final AtomicReference<NetworkClient> client = new AtomicReference<>(null);
private final NetworkServer server;
public CommandHandler(NetworkServer server) {
this.server = server;
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
final Channel c = ctx.channel();
System.out.println("[StarMod][Network] Incoming connection: " + c.remoteAddress());
NetworkClient modClient = server.newClient(c);
if (!this.client.compareAndSet(null, modClient)) {
throw new IllegalStateException("There can only be one registered client per connection!");
}
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
NetworkClient modClient = this.client.get();
modClient.onDisconnect();
server.removeClient(modClient);
}
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, Command cmd) throws Exception {
client.get().incomingCommand(cmd);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
client.get().onInboundThrowable(cause);
}
public NetworkClient getClient() {
return client.get();
}
}