/** * This file is part of aion-emu <aion-emu.com>. * * aion-emu is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * aion-emu is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with aion-emu. If not, see <http://www.gnu.org/licenses/>. */ package com.aionemu.loginserver; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import com.aionemu.commons.database.dao.DAOManager; import com.aionemu.commons.network.IPRange; import com.aionemu.commons.utils.NetworkUtils; import com.aionemu.loginserver.dao.GameServersDAO; import com.aionemu.loginserver.model.Account; import com.aionemu.loginserver.network.gameserver.GsAuthResponse; import com.aionemu.loginserver.network.gameserver.GsConnection; import com.aionemu.loginserver.network.gameserver.serverpackets.SM_REQUEST_KICK_ACCOUNT; /** * GameServerTable contains list of GameServers registered on this LoginServer. GameServer may by online or down. * * @author -Nemesiss- */ public class GameServerTable { /** * Logger for this class. */ private static final Logger log = Logger.getLogger(GameServerTable.class); /** * Map<Id,GameServer> */ private static Map<Byte, GameServerInfo> gameservers; /** * Return collection contains all registered [up/down] GameServers. * * @return collection of GameServers. */ public static Collection<GameServerInfo> getGameServers() { return Collections.unmodifiableCollection(gameservers.values()); } /** * Load GameServers from database. */ public static void load() { gameservers = getDAO().getAllGameServers(); log.info("GameServerTable loaded " + gameservers.size() + " registered GameServers."); } /** * Register GameServer if its possible. * * @param gsConnection * Connection object * @param requestedId * id of server that was requested * @param defaultAddress * default network address from server, usually internet address * @param ipRanges * mapping of various ip ranges, usually used for local area networks * @param port * port that is used by server * @param maxPlayers * maximum amount of players * @param password * server password that is specified configs, used to check if gs can auth on ls * @return GsAuthResponse */ public static GsAuthResponse registerGameServer(GsConnection gsConnection, byte requestedId, byte[] defaultAddress, List<IPRange> ipRanges, int port, int maxPlayers, String password) { GameServerInfo gsi = gameservers.get(requestedId); /** * This id is not Registered at LoginServer. */ if (gsi == null) { log.info(gsConnection + " requestedID=" + requestedId + " not aviable!"); return GsAuthResponse.NOT_AUTHED; } /** * Check if this GameServer is not already registered. */ if (gsi.getGsConnection() != null) return GsAuthResponse.ALREADY_REGISTERED; /** * Check if password and ip are ok. */ if (!gsi.getPassword().equals(password) || !NetworkUtils.checkIPMatching(gsi.getIp(), gsConnection.getIP())) { log.info(gsConnection + " wrong ip or password!"); return GsAuthResponse.NOT_AUTHED; } gsi.setDefaultAddress(defaultAddress); gsi.setIpRanges(ipRanges); gsi.setPort(port); gsi.setMaxPlayers(maxPlayers); gsi.setGsConnection(gsConnection); gsConnection.setGameServerInfo(gsi); return GsAuthResponse.AUTHED; } /** * Returns GameSererInfo object for given gameserverId. * * @param gameServerId * @return GameSererInfo object for given gameserverId. */ public static GameServerInfo getGameServerInfo(byte gameServerId) { return gameservers.get(gameServerId); } /** * Check if account is already in use on any GameServer. If so - kick account from GameServer. * * @param acc account to check * @return true is account is logged in on one of GameServers */ public static boolean isAccountOnAnyGameServer(Account acc) { for (GameServerInfo gsi : getGameServers()) { if (gsi.isAccountOnGameServer(acc.getId())) { return true; } } return false; } /** * Helper method, used to kick account from any gameServer if it's logged in * @param account account to kick */ public static void kickAccountFromGameServer(Account account) { for (GameServerInfo gsi : getGameServers()) { if (gsi.isAccountOnGameServer(account.getId())) { gsi.getGsConnection().sendPacket(new SM_REQUEST_KICK_ACCOUNT(account.getId())); break; } } } /** * Retuns {@link com.aionemu.loginserver.dao.GameServersDAO} , just a shortcut * * @return {@link com.aionemu.loginserver.dao.GameServersDAO} */ private static GameServersDAO getDAO() { return DAOManager.getDAO(GameServersDAO.class); } }