package games.strategy.engine.lobby.server;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import games.strategy.engine.chat.ChatController;
import games.strategy.engine.chat.StatusManager;
import games.strategy.engine.framework.GameRunner;
import games.strategy.engine.lobby.server.login.LobbyLoginValidator;
import games.strategy.engine.lobby.server.userDB.Database;
import games.strategy.net.IServerMessenger;
import games.strategy.net.Messengers;
import games.strategy.net.ServerMessenger;
import games.strategy.sound.ClipPlayer;
import games.strategy.util.Version;
public class LobbyServer {
private static final Logger logger = Logger.getLogger(LobbyServer.class.getName());
public static final String TRIPLEA_LOBBY_PORT_PROPERTY = "triplea.lobby.port";
public static final String ADMIN_USERNAME = "Admin";
public static final String LOBBY_CHAT = "_LOBBY_CHAT";
public static final Version LOBBY_VERSION = new Version(1, 0, 0);
private final Messengers m_messengers;
public static String[] getProperties() {
return new String[] {TRIPLEA_LOBBY_PORT_PROPERTY};
}
/** Creates a new instance of LobbyServer. */
public LobbyServer(final int port) {
IServerMessenger server;
try {
server = new ServerMessenger(ADMIN_USERNAME, port);
} catch (final IOException ex) {
logger.log(Level.SEVERE, ex.toString());
throw new IllegalStateException(ex.getMessage());
}
m_messengers = new Messengers(server);
server.setLoginValidator(new LobbyLoginValidator());
// setup common objects
new UserManager().register(m_messengers.getRemoteMessenger());
final ModeratorController moderatorController = new ModeratorController(server, m_messengers);
moderatorController.register(m_messengers.getRemoteMessenger());
new ChatController(LOBBY_CHAT, m_messengers, moderatorController);
// register the status controller
final StatusManager statusManager = new StatusManager(m_messengers);
// we dont need this manager now
statusManager.shutDown();
final LobbyGameController controller = new LobbyGameController((ILobbyGameBroadcaster) m_messengers
.getChannelMessenger().getChannelBroadcastor(ILobbyGameBroadcaster.GAME_BROADCASTER_CHANNEL), server);
controller.register(m_messengers.getRemoteMessenger());
// now we are open for business
server.setAcceptNewConnections(true);
}
public static void main(final String[] args) {
try {
// send args to system properties
handleCommandLineArgs(args);
ClipPlayer.setBeSilentInPreferencesWithoutAffectingCurrent(true);
final int port = Integer.parseInt(System.getProperty(TRIPLEA_LOBBY_PORT_PROPERTY, "3303"));
logger.info("Trying to listen on port:" + port);
new LobbyServer(port);
logger.info("Starting database");
// initialize the database
Database.getConnection().close();
logger.info("Lobby started");
} catch (final Exception ex) {
logger.log(Level.SEVERE, ex.toString(), ex);
}
}
public IServerMessenger getMessenger() {
return (IServerMessenger) m_messengers.getMessenger();
}
public Messengers getMessengers() {
return m_messengers;
}
/**
* Move command line arguments to System.properties
*/
private static void handleCommandLineArgs(final String[] args) {
System.getProperties().setProperty(GameRunner.TRIPLEA_HEADLESS, "true");
final String[] properties = getProperties();
boolean usagePrinted = false;
for (final String arg2 : args) {
boolean found = false;
String arg = arg2;
final int indexOf = arg.indexOf('=');
if (indexOf > 0) {
arg = arg.substring(0, indexOf);
for (final String propertie : properties) {
if (arg.equals(propertie)) {
final String value = getValue(arg2);
System.getProperties().setProperty(propertie, value);
System.out.println(propertie + ":" + value);
found = true;
break;
}
}
}
if (!found) {
System.out.println("Unrecogized:" + arg2);
if (!usagePrinted) {
usagePrinted = true;
usage();
}
}
}
}
private static String getValue(final String arg) {
final int index = arg.indexOf('=');
if (index == -1) {
return "";
}
return arg.substring(index + 1);
}
private static void usage() {
System.out.println("Arguments\n" + " " + TRIPLEA_LOBBY_PORT_PROPERTY + "=<port number (ex: 3303)>\n");
}
}