package handling.login;
import constants.GameConstants;
import handling.MapleServerHandler;
import handling.mina.MapleCodecFactory;
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.buffer.SimpleBufferAllocator;
import org.apache.mina.core.filterchain.IoFilter;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.SocketSessionConfig;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import server.ServerProperties;
import tools.Pair;
import tools.Triple;
public class LoginServer {
public static final int PORT = 8484;
private static InetSocketAddress InetSocketadd;
private static IoAcceptor acceptor;
private static Map<Integer, Integer> load = new HashMap();
private static String serverName;
private static String eventMessage;
private static byte flag;
private static int maxCharacters;
private static int userLimit;
private static int usersOn = 0;
private static boolean finishedShutdown = true;
private static boolean adminOnly = false;
private static HashMap<Integer, Pair<String, String>> loginAuth = new HashMap<>();
private static HashSet<String> loginIPAuth = new HashSet<>();
public static void putLoginAuth(int chrid, String ip, String tempIP) {
loginAuth.put(chrid, new Pair<>(ip, tempIP));
loginIPAuth.add(ip);
}
public static Pair<String, String> getLoginAuth(int chrid) {
return loginAuth.remove(chrid);
}
public static boolean containsIPAuth(String ip) {
return loginIPAuth.contains(ip);
}
public static void removeIPAuth(String ip) {
loginIPAuth.remove(ip);
}
public static void addIPAuth(String ip) {
loginIPAuth.add(ip);
}
public static final void addChannel(int channel) {
load.put(Integer.valueOf(channel), Integer.valueOf(0));
}
public static final void removeChannel(int channel) {
load.remove(Integer.valueOf(channel));
}
public static final void run_startup_configurations() {
userLimit = Integer.parseInt(ServerProperties.getProperty("net.sf.odinms.login.userlimit"));
serverName = ServerProperties.getProperty("net.sf.odinms.login.serverName");
eventMessage = ServerProperties.getProperty("net.sf.odinms.login.eventMessage");
flag = Byte.parseByte(ServerProperties.getProperty("net.sf.odinms.login.flag"));
maxCharacters = Integer.parseInt(ServerProperties.getProperty("net.sf.odinms.login.maxCharacters"));
IoBuffer.setUseDirectBuffer(false);
IoBuffer.setAllocator(new SimpleBufferAllocator());
acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("codec", (IoFilter) new ProtocolCodecFilter(new MapleCodecFactory()));
acceptor.setHandler(new MapleServerHandler(-1, false, false));
//acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30);
((SocketSessionConfig) acceptor.getSessionConfig()).setTcpNoDelay(true);
try {
acceptor.bind(new InetSocketAddress(8484));
System.out.println("Listening on port 8484.");
} catch (IOException e) {
System.err.println("Binding to port 8484 failed" + e);
}
}
public static final void shutdown() {
if (finishedShutdown) {
return;
}
System.out.println("Shutting down login...");
acceptor.setCloseOnDeactivation(true);
for (IoSession ss : acceptor.getManagedSessions().values()) {
ss.close(true);
}
acceptor.unbind();
acceptor.dispose();
finishedShutdown = true;
}
public static final String getServerName() {
return serverName;
}
public static final String getTrueServerName() {
return serverName.substring(0, serverName.length() - (GameConstants.GMS ? 2 : 3));
}
public static final String getEventMessage() {
return eventMessage;
}
public static final byte getFlag() {
return flag;
}
public static final int getMaxCharacters() {
return 15;
}
public static final Map<Integer, Integer> getLoad() {
return load;
}
public static void setLoad(Map<Integer, Integer> load_, int usersOn_) {
load = load_;
usersOn = usersOn_;
}
public static final void setEventMessage(String newMessage) {
eventMessage = newMessage;
}
public static final void setFlag(byte newflag) {
flag = newflag;
}
public static final int getUserLimit() {
return userLimit;
}
public static final int getUsersOn() {
return usersOn;
}
public static final void setUserLimit(int newLimit) {
userLimit = newLimit;
}
public static final int getNumberOfSessions() {
return acceptor.getManagedSessions().size();
}
public static final boolean isAdminOnly() {
return adminOnly;
}
public static final boolean isShutdown() {
return finishedShutdown;
}
public static final void setOn() {
finishedShutdown = false;
}
}