private void SQLConnect(ReportingMessage reportMessage, TrackingObject trackingObject)
        {
            string initSqlQuery = "CALL gameserverinit(@serverhash, @namex, @descriptionx, @gameportx, @gameaddressx, @protocolx, @programversion, @maxplayersx, @modcontrolx, @modcontrolshax, @gamemodex, @cheatsx, @warpmodex, @universex, @bannerx, @homepagex, @httpportx, @adminx, @teamx, @locationx, @fixedipx);";
            Dictionary <string, object> parameters = reportMessage.GetParameters();

            try
            {
                databaseConnection.ExecuteNonReader(initSqlQuery, parameters);
            }
            catch (Exception e)
            {
                Console.WriteLine("WARNING: Ignoring error on connection (add server), error: " + e.Message);
            }
            string playerSqlQuery = "CALL gameserverplayer(@hash, @player, '1')";

            foreach (string connectedPlayer in reportMessage.players)
            {
                Console.WriteLine("Player " + connectedPlayer + " joined " + reportMessage.serverHash);
                Dictionary <string, object> playerParams = new Dictionary <string, object>();
                playerParams["@hash"]   = reportMessage.serverHash;
                playerParams["@player"] = connectedPlayer;
                try
                {
                    databaseConnection.ExecuteNonReader(playerSqlQuery, playerParams);
                }
                catch (Exception e)
                {
                    Console.WriteLine("WARNING: Ignoring error on connection (add player), error: " + e.Message);
                }
                trackingObject.players = reportMessage.players;
            }
        }
        private void SQLDisconnect(string serverHash, TrackingObject trackingObject)
        {
            //Remove old players
            foreach (string player in trackingObject.players)
            {
                Dictionary <string, object> playerParams = new Dictionary <string, object>();
                playerParams["hash"]   = serverHash;
                playerParams["player"] = player;
                string sqlQuery = "CALL gameserverplayer(@hash ,@player, '0')";
                try
                {
                    databaseConnection.ExecuteNonReader(sqlQuery, playerParams);
                }
                catch (Exception e)
                {
                    Console.WriteLine("WARNING: Ignoring error on disconnect (remove player), error: " + e.Message);
                }
            }
            Dictionary <string, object> offlineParams = new Dictionary <string, object>();

            offlineParams["@hash"] = serverHash;
            string mySql = "CALL gameserveroffline(@hash)";

            try
            {
                databaseConnection.ExecuteNonReader(mySql, offlineParams);
            }
            catch (Exception e)
            {
                Console.WriteLine("WARNING: Ignoring error on disconnect (remove server), error: " + e.Message);
            }
        }
        private void SQLReport(ReportingMessage reportMessage, TrackingObject trackingObject)
        {
            //Take all the currently connected players and remove the players that were connected already to generate a list of players to be added
            List <string> addList = new List <string>(reportMessage.players);

            foreach (string player in trackingObject.players)
            {
                if (addList.Contains(player))
                {
                    addList.Remove(player);
                }
            }
            //Take all the old players connected and remove the players that are connected already to generate a list of players to be removed
            List <string> removeList = new List <string>(trackingObject.players);

            foreach (string player in reportMessage.players)
            {
                if (removeList.Contains(player))
                {
                    removeList.Remove(player);
                }
            }
            //Add new players
            foreach (string player in addList)
            {
                Console.WriteLine("Player " + player + " joined " + reportMessage.serverHash);
                Dictionary <string, object> playerParams = new Dictionary <string, object>();
                playerParams["hash"]   = reportMessage.serverHash;
                playerParams["player"] = player;
                string sqlQuery = "CALL gameserverplayer(@hash ,@player, '1')";
                try
                {
                    databaseConnection.ExecuteNonReader(sqlQuery, playerParams);
                }
                catch (Exception e)
                {
                    Console.WriteLine("WARNING: Ignoring error on report (add player), error: " + e.Message);
                }
            }
            //Remove old players
            foreach (string player in removeList)
            {
                Console.WriteLine("Player " + player + " left " + reportMessage.serverHash);
                Dictionary <string, object> playerParams = new Dictionary <string, object>();
                playerParams["hash"]   = reportMessage.serverHash;
                playerParams["player"] = player;
                string sqlQuery = "CALL gameserverplayer(@hash ,@player, '0')";
                try
                {
                    databaseConnection.ExecuteNonReader(sqlQuery, playerParams);
                }
                catch (Exception e)
                {
                    Console.WriteLine("WARNING: Ignoring error on report (remove player), error: " + e.Message);
                }
            }
            trackingObject.players = reportMessage.players;
        }
        public void HandleDisconnect(string serverID, int clientID)
        {
            ReferenceID thisReference = new ReferenceID(serverID, clientID);

            lock (connectedClients)
            {
                connectedClients.Remove(thisReference);
            }
            if (pairMatch.ContainsKey(thisReference))
            {
                string         serverHash     = pairMatch[thisReference];
                TrackingObject trackingObject = trackingObjects[serverHash];
                trackingObject.referenceCount--;
                Console.WriteLine(serverHash + " references: " + trackingObject.referenceCount);
                if (trackingObject.referenceCount == 0)
                {
                    SQLDisconnect(serverHash, trackingObject);
                    trackingObjects.Remove(serverHash);
                }
                pairMatch.Remove(thisReference);
            }
        }
        public void HandleReport(string serverID, int clientID, ReportingMessage reportMessage)
        {
            ReferenceID thisReference = new ReferenceID(serverID, clientID);

            lock (connectedClients)
            {
                connectedClients[thisReference] = reportMessage;
            }
            if (!pairMatch.ContainsKey(thisReference))
            {
                pairMatch.Add(thisReference, reportMessage.serverHash);
                if (!trackingObjects.ContainsKey(reportMessage.serverHash))
                {
                    trackingObjects.Add(reportMessage.serverHash, new TrackingObject());
                    SQLConnect(reportMessage, trackingObjects[reportMessage.serverHash]);
                }
                TrackingObject trackingObject = trackingObjects[reportMessage.serverHash];
                trackingObject.referenceCount++;
                Console.WriteLine(reportMessage.serverHash + " references: " + trackingObject.referenceCount);
            }
            SQLReport(reportMessage, trackingObjects[reportMessage.serverHash]);
        }