package net.scapeemulator.game.net;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundMessageHandlerAdapter;
import java.io.IOException;
import net.scapeemulator.game.GameServer;
import net.scapeemulator.game.net.auto.AutoLoginSession;
import net.scapeemulator.game.net.handshake.HandshakeMessage;
import net.scapeemulator.game.net.jaggrab.JaggrabSession;
import net.scapeemulator.game.net.login.LoginSession;
import net.scapeemulator.game.net.register.RegisterSession;
import net.scapeemulator.game.net.update.UpdateSession;
import net.scapeemulator.game.net.world.WorldListSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class RsChannelHandler extends ChannelInboundMessageHandlerAdapter<Object> {
// TODO: more specific generics here?
private static final Logger logger = LoggerFactory.getLogger(RsChannelHandler.class);
private final GameServer server;
private Session session;
public RsChannelHandler(GameServer server) {
this.server = server;
}
@Override
public void channelActive(ChannelHandlerContext ctx) {
}
@Override
public void channelInactive(ChannelHandlerContext ctx) {
if (session != null) {
session.channelClosed();
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
ctx.close();
}
@Override
public void messageReceived(ChannelHandlerContext ctx, Object message) throws IOException {
if (session != null) {
session.messageReceived(message);
} else {
HandshakeMessage handshake = (HandshakeMessage) message;
switch (handshake.getService()) {
case HandshakeMessage.SERVICE_LOGIN:
session = new LoginSession(server, ctx.channel());
break;
case HandshakeMessage.SERVICE_UPDATE:
session = new UpdateSession(server, ctx.channel());
break;
case HandshakeMessage.SERVICE_JAGGRAB:
session = new JaggrabSession(server, ctx.channel());
break;
case HandshakeMessage.SERVICE_REGISTER_PERSONAL_DETAILS:
case HandshakeMessage.SERVICE_REGISTER_USERNAME:
case HandshakeMessage.SERVICE_REGISTER_COMMIT:
session = new RegisterSession(server, ctx.channel());
break;
case HandshakeMessage.SERVICE_AUTO_LOGIN:
session = new AutoLoginSession(server, ctx.channel());
break;
case HandshakeMessage.SERVICE_WORLD_LIST:
session = new WorldListSession(server, ctx.channel());
break;
}
}
}
public void setSession(Session session) {
this.session = session;
}
}