Class WebServer

  • All Implemented Interfaces:
    IRunWebServer, IWebServer

    public class WebServer
    extends java.lang.Object
    implements IWebServer, IRunWebServer
    The main class for the WebServer - brings up the WebServer GUI - starts the ServerSocket and listens there for WebClients - based on actions coming from clients, keeps book of "instant" and "running" games (both GameInfo objects), and tell the GameInfo objects when to start the game.
    Author:
    Clemens Katzer
    • Field Detail

      • LOGGER

        private static final java.util.logging.Logger LOGGER
      • loginMessage

        private static final java.util.ArrayList<java.lang.String> loginMessage
      • runGUI

        private final boolean runGUI
        Controls whether the GUI is shown or not. At the moment this is configured only by the possibility of doing so: if the environment supports running a GUI, we will, if not, we won't. It could be combined with a command line option to suppress the GUI even if it would be possible to show one.
      • shutdownRequested

        private boolean shutdownRequested
      • proposedGamesFilename

        private java.lang.String proposedGamesFilename
      • proposedGamesListModified

        private boolean proposedGamesListModified
      • maxClients

        private final int maxClients
      • userDB

        private UserDB userDB
      • proposedGames

        private final java.util.HashMap<java.lang.String,​GameInfo> proposedGames
      • runningGames

        private final java.util.ArrayList<GameInfo> runningGames
      • endingGames

        private final java.util.ArrayList<GameInfo> endingGames
      • serverPort

        private final int serverPort
        Server port where we listen for WebClient connections
      • serverSocket

        private java.net.ServerSocket serverSocket
        Server actual socket where we listen for WebClient connections
      • whenFormatter

        private final FormatWhen whenFormatter
      • dumpInfoFile

        private java.io.PrintWriter dumpInfoFile
    • Constructor Detail

      • WebServer

        public WebServer​(java.lang.String optionsFile)
    • Method Detail

      • main

        public static void main​(java.lang.String[] args)
      • doReadGamesFromFile

        private void doReadGamesFromFile()
      • doReadUsersFromFile

        private void doReadUsersFromFile()
      • doReadLoginMessage

        private void doReadLoginMessage()
      • rereadLoginMessage

        public void rereadLoginMessage()
        Triggered by remode admin connection
        Specified by:
        rereadLoginMessage in interface IWebServer
      • runSocketServer

        void runSocketServer()
      • writeBackUsers

        public void writeBackUsers()
      • initiateShutdown

        public void initiateShutdown​(java.lang.String byUserName)
      • makeDummyConnection

        public void makeDummyConnection()
      • waitForUser

        private boolean waitForUser()
      • reject

        private void reject​(java.net.Socket socket)
      • closeAllWebServerClientSocketThreads

        private void closeAllWebServerClientSocketThreads()
      • getPlayerName

        java.lang.String getPlayerName()
        Each user server thread's name is set to it user's name.
      • getUserDB

        public UserDB getUserDB()
      • findUserByName

        public User findUserByName​(java.lang.String name)
      • verifyLogin

        public java.lang.String verifyLogin​(java.lang.String username,
                                            java.lang.String password)
      • updateGUI

        public void updateGUI()
      • watchGame

        public void watchGame​(java.lang.String gameId,
                              java.lang.String userName)
        Specified by:
        watchGame in interface IWebServer
      • sendWatchGameInfo

        public void sendWatchGameInfo​(java.lang.String userName,
                                      java.lang.String gameId,
                                      java.lang.String host,
                                      int port)
      • dumpInfo

        public void dumpInfo()
        Dump server state info into a static file, at the moment dump-info.txt
        Specified by:
        dumpInfo in interface IWebServer
      • dumpInfo

        public void dumpInfo​(java.io.PrintWriter pw)
        Dump info into given PrintWriter
        Parameters:
        pw - PrintWriter for the file to print dump to
      • isInvolvedInInstantGame

        private GameInfo isInvolvedInInstantGame​(java.lang.String initiatorName)
      • proposeGame

        public GameInfo proposeGame​(java.lang.String initiator,
                                    java.lang.String variant,
                                    java.lang.String viewmode,
                                    long startAt,
                                    int duration,
                                    java.lang.String summary,
                                    java.lang.String expire,
                                    boolean unlimitedMulligans,
                                    boolean balancedTowers,
                                    int min,
                                    int target,
                                    int max)
        Specified by:
        proposeGame in interface IWebServer
      • cancelIfNecessary

        public void cancelIfNecessary​(User user)
      • reEnrollIfNecessary

        public void reEnrollIfNecessary​(WebServerClient newclient)
      • tellAllGamesFromListToOne

        public void tellAllGamesFromListToOne​(WebServerClient client,
                                              java.util.ArrayList<GameInfo> games)
      • tellAllProposedGamesToOne

        public void tellAllProposedGamesToOne​(WebServerClient client)
      • tellAllRunningGamesToOne

        public void tellAllRunningGamesToOne​(WebServerClient client)
      • enrollUserToGame

        public void enrollUserToGame​(java.lang.String gameId,
                                     java.lang.String username)
        Specified by:
        enrollUserToGame in interface IWebServer
      • unenrollUserFromGame

        public void unenrollUserFromGame​(java.lang.String gameId,
                                         java.lang.String username)
        Specified by:
        unenrollUserFromGame in interface IWebServer
      • cancelGame

        public void cancelGame​(java.lang.String gameId,
                               java.lang.String byUser)
        Specified by:
        cancelGame in interface IWebServer
      • startGame

        public void startGame​(java.lang.String gameId,
                              User byUser)
        Specified by:
        startGame in interface IWebServer
      • attemptStartOnServer

        private void attemptStartOnServer​(GameInfo gi,
                                          User byUser)
      • startGameOnPlayerHost

        public void startGameOnPlayerHost​(java.lang.String gameId,
                                          java.lang.String hostingPlayer,
                                          java.lang.String playerHost,
                                          int port)
        A game was started by a WebClient user locally on his computer and is ready to accept the other players as remote client; so we notify them and tell them host and port to where to connect.
        Specified by:
        startGameOnPlayerHost in interface IWebServer
      • systemMessageToAll

        public void systemMessageToAll​(java.lang.String message)
      • informAllEnrolledThatStartFailed

        public void informAllEnrolledThatStartFailed​(GameInfo gi,
                                                     java.lang.String reason,
                                                     User byUser)
      • requestUserAttention

        public void requestUserAttention​(long when,
                                         java.lang.String sender,
                                         boolean isAdmin,
                                         java.lang.String recipient,
                                         java.lang.String message,
                                         int beepCount,
                                         long beepInterval,
                                         boolean windows)
        Specified by:
        requestUserAttention in interface IWebServer
      • informPingFailed

        private void informPingFailed​(java.lang.String sender,
                                      java.lang.String failMessage)
      • updateUserCounts

        public void updateUserCounts()
      • allTellUserCounts

        public void allTellUserCounts()
      • chatSubmit

        public void chatSubmit​(java.lang.String chatId,
                               java.lang.String sender,
                               java.lang.String message)
        Specified by:
        chatSubmit in interface IWebServer
      • handlePingQuotedName

        public void handlePingQuotedName​(java.lang.String sender,
                                         java.lang.String pingCommand)
      • handlePing

        public void handlePing​(java.lang.String sender,
                               java.lang.String pingCommand)
      • tellLastChatMessagesToOne

        public void tellLastChatMessagesToOne​(WebServerClient client,
                                              java.lang.String chatId)
      • sendMessageOfTheDayToOne

        public void sendMessageOfTheDayToOne​(WebServerClient client,
                                             java.lang.String chatId)
      • sendOldVersionWarningToOne

        public void sendOldVersionWarningToOne​(WebServerClient client,
                                               java.lang.String userName,
                                               java.lang.String chatId)
      • readLoginMessageFromFile

        private void readLoginMessageFromFile​(java.lang.String filename)
      • registerUser

        public java.lang.String registerUser​(java.lang.String username,
                                             java.lang.String password,
                                             java.lang.String email)
      • confirmRegistration

        public java.lang.String confirmRegistration​(java.lang.String username,
                                                    java.lang.String confirmationCode)
      • changeProperties

        public java.lang.String changeProperties​(java.lang.String username,
                                                 java.lang.String oldPW,
                                                 java.lang.String newPW,
                                                 java.lang.String email,
                                                 java.lang.Boolean isAdminObj)
        Specified by:
        changeProperties in interface IWebServer
      • updateOnline

        boolean updateOnline​(GameInfo gi)
        When a user logged in or out, this is called for every GameInfo to update how many of the enrolled players are currently online.
        Parameters:
        userDB - TODO
        Returns:
        true if the count of online users was changed i.e. GameInfo needs to be updated to all clients
      • countProposedGames

        private int countProposedGames​(boolean shallBeScheduled)
      • findByGameId

        private GameInfo findByGameId​(java.lang.String gameId)
      • findFromRunningGames

        private GameInfo findFromRunningGames​(java.lang.String gameId)
      • startOneGame

        private java.lang.String startOneGame​(GameInfo gi)
      • unregisterGame

        public void unregisterGame​(GameInfo gi,
                                   int port)
        unregister a game from runningGames (or proposedGames), and keep in endingGames until it's reaped
        Specified by:
        unregisterGame in interface IRunWebServer
      • unregisterGamePlayerPC

        public void unregisterGamePlayerPC​(GameInfo gi)
        unregister a game (run on player's PC) from runningGames, keep in endingGames until it's reaped
      • readGamesFromFile

        private void readGamesFromFile​(java.lang.String filename,
                                       java.util.HashMap<java.lang.String,​GameInfo> proposedGames)
      • saveGamesIfNeeded

        public void saveGamesIfNeeded()
      • storeGamesToFile

        private void storeGamesToFile​(java.lang.String filename)
      • getStringOption

        public java.lang.String getStringOption​(java.lang.String key)
      • getMaximumGameIdFromFiles

        private int getMaximumGameIdFromFiles()
        Searches the game directory tree for highest game number for which a game directory had been earlier created. Tree is expected to have groups per each 100 games; example: base base/nn00-nn99 base/nn00-nn99/nn00 base/nn00-nn99/nn04 base/nn00-nn99/nn98 base/mm00-mm99/mm12 base/mm00-mm99/mm87 Eventually, when we reach gameId 10000+, groupdirs will have the form base/kkk00-kkk99 base/kkk00-kkk99/kkk02 base/kkk00-kkk99/kkk87 Example, if last created game dir was 6789 ( "base/6700-6799/6789" ), this returns 6789.
        Returns:
        The highest game number for which a directory already exists, (otherwise 0 if therre is no dir at all)