private SqlParameter[] simplifyGameState(DetailedGameState pendingGame)
        {
            var spcArray = new SqlParameter[6];

            spcArray[0] = new SqlParameter("@GameID", pendingGame.gameID);
            spcArray[1] = new SqlParameter("@Player1", pendingGame.Player1.userID);

            // might change later, needed to prevent null reference
            // player 2 can be null which is why we need this if statement
            if (pendingGame.Player2 != null)
            {
                spcArray[2] = new SqlParameter("@Player2", pendingGame.Player2.userID);
            }
            else
            {
                spcArray[2] = new SqlParameter("@Player2", SqlChars.Null);
            }

            // same with the board
            if (pendingGame.Board != null)
            {
                spcArray[3] = new SqlParameter("@Board", pendingGame.Board);
            }
            else
            {
                spcArray[3] = new SqlParameter("@Board", SqlChars.Null);
            }

            spcArray[4] = new SqlParameter("@TimeLimit", pendingGame.TimeLimit);
            spcArray[5] = new SqlParameter("@StartTime", DateTime.Now);

            return(spcArray);
        }
        private void addGameToDB(DetailedGameState pendingGame)
        {
            if (pendingGame.Player1 == null)
            {
                using (SqlConnection conn = new SqlConnection(BoggleDB))
                {
                    conn.Open();

                    SqlCommand cmd = new SqlCommand(string.Format("DElETE FROM Games WHERE GameID={0}", pendingGame.gameID)
                                                    , conn);
                    cmd.ExecuteNonQuery();
                }
                return;
            }
            SqlParameter[] contents = simplifyGameState(pendingGame);
            using (SqlConnection conn = new SqlConnection(BoggleDB))
            {
                conn.Open();

                SqlCommand cmd = new SqlCommand("IF NOT EXISTS(SELECT 1 FROM Games WHERE GameID=@GameID)" +
                                                " Insert INTO Games (GameId,Player1,Player2,Board,TimeLimit,StartTime) VALUES(@GameID,@Player1,@Player2,@Board,@TimeLimit,@StartTime)" +
                                                " else" +
                                                " UPDATE Games SET Player1=@Player1,Player2=@Player2,Board=@Board,TimeLimit=@TimeLimit,StartTime=@StartTime WHERE GameID=@GameID"
                                                , conn);

                cmd.Parameters.AddRange(contents);

                cmd.ExecuteNonQuery();
            }
        }
        private int getPlayerScore(DetailedGameState game, string userToken)
        {
            using (SqlConnection conn = new SqlConnection(BoggleDB))
            {
                conn.Open();
                var sql = string.Format("SELECT * FROM Words WHERE Game_ID={0} AND Player_ID={1}", game.gameID, userToken);

                //get the words where id and game match
                //divi the scores between players
                SqlCommand cmd      = new SqlCommand(sql, conn);
                int        toReturn = 0;
                var        rdr      = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    toReturn += (int)rdr["Score"];
                }
                return(toReturn);
            }
        }
        private DetailedGameState detailGame(object[] input)
        {
            var toReturn = new DetailedGameState();

            toReturn.gameID      = (int)input[0];
            toReturn.Player1     = findPlayer(input[1]);
            toReturn.Player2     = findPlayer(input[2]);
            toReturn.Board       = input[3] is DBNull ? null : (string)input[3];
            toReturn.TimeLimit   = input[4] == typeof(DBNull) ? 0 : (int)input[4];
            toReturn.boggleBoard = toReturn.Board == null ? null : new BoggleBoard((string)input[3]);
            if (input[5].GetType() != typeof(DBNull))
            {
                // pulled this out so it's easier to read
                int elapsedTime = (int)(DateTime.Now - (DateTime)input[5]).TotalSeconds;
                // gets time left
                toReturn.TimeLeft = toReturn.TimeLimit - elapsedTime > 0 ? toReturn.TimeLimit - elapsedTime : 0;
            }
            toReturn.GameState = (input[2] == null ? "pending" : toReturn.TimeLeft == 0 ? "completed" : "active");

            return(toReturn);
        }
        /// <summary>
        /// Plays the word in game.
        /// </summary>
        /// <param name="GameID">The game identifier.</param>
        /// <param name="m">The m.</param>
        /// <returns></returns>
        public ScoreInfo PlayWordInGame(string GameID, Move m)
        {
            m.Word = m.Word.Trim();
            int tempGameId;

            if (!int.TryParse(GameID, out tempGameId) || m.Word == null || m.Word == "")
            {
                SetStatus(Forbidden);
                return(new ScoreInfo());
            }

            lock (sync)
            {
                DetailedGameState gameInQuestion = getGameWithID(tempGameId);
                if (gameInQuestion.Player1.userID != m.UserToken && gameInQuestion.Player2.userID != m.UserToken)
                {
                    SetStatus(Forbidden);
                    return(new ScoreInfo());
                }
                if (gameInQuestion.GameState != "active")
                {
                    SetStatus(Conflict);
                    return(new ScoreInfo());
                }
                int toReturn = calculateScore(gameInQuestion.boggleBoard, m.Word);

                if (toReturn == -2)
                {
                    SetStatus(Conflict);
                    return(new ScoreInfo());
                }
                if (!addMove(tempGameId, m.Word, m.UserToken, toReturn))
                {
                    toReturn = -1;
                }

                SetStatus(OK);
                return(new ScoreInfo(toReturn));
            }
        }
 public void CancelJoin(UserIDInfo ut)
 {
     lock (sync)
     {
         string UserToken   = ut.UserToken;
         var    player      = findPlayer(UserToken);
         var    pendingGame = getGameWithID(GameIDCounter);
         try
         {
             if (pendingGame.Player1.userID == UserToken)
             {
                 pendingGame = new DetailedGameState(GameIDCounter);
                 addGameToDB(pendingGame);
                 SetStatus(OK);
                 return;
             }
         }
         catch
         {
         }
         SetStatus(Forbidden);
     }
 }
        /// <summary>
        /// Attempts the join.
        /// </summary>
        /// <param name="ja">The join ateempt info.</param>
        /// <returns></returns>
        public GameIDInfo AttemptJoin(JoinAttempt ja)
        {
            int    TimeLimit = ja.TimeLimit;
            string UserToken = ja.UserToken;

            lock (sync)
            {
                // check if invalid game arguments are given
                if (TimeLimit < 5 || TimeLimit > 120 || ja == null || ja.UserToken == null)
                {
                    SetStatus(Forbidden);
                    return(null);
                }

                // need to check if user is in the Users sql table, otherwise we can't make a game
                PlayerInfo foundPlayer = findPlayer(UserToken);
                if (foundPlayer == null)
                {
                    SetStatus(Forbidden);
                    return(null);
                }
                var pendingGame = getGameWithID(GameIDCounter);
                // now we know valid arguments are given
                // this is like a thing that only works if there are pending games?
                try
                {
                    if (UserToken == pendingGame.Player1.userID)
                    {
                    }
                }
                // this is thrown by the getGameWithID method
                catch (FormatException)
                {
                    SetStatus(Forbidden);
                    return(null);
                }
                // this is if there isnt a pending game and I try to get a userID from it
                // so if there isnt a new pending game we make one with the player
                catch (NullReferenceException)
                {
                    pendingGame           = new DetailedGameState(GameIDCounter);
                    pendingGame.Player1   = foundPlayer;
                    pendingGame.TimeLimit = Convert.ToInt32(TimeLimit);
                    addGameToDB(pendingGame);
                    SetStatus(Accepted);
                    return(new GameIDInfo(pendingGame.gameID.ToString()));
                }

                DetailedGameState savedGame = pendingGame;
                if (UserToken == savedGame.Player1.userID)
                {
                    SetStatus(Conflict);
                    return(new GameIDInfo("user already in game"));
                }

                savedGame.Player2 = foundPlayer;
                if (savedGame.Player2 == null)
                {
                    SetStatus(Forbidden);
                    return(new GameIDInfo("bad id for player 2"));
                }
                savedGame.TimeLimit   = (savedGame.TimeLimit + TimeLimit) / 2;
                savedGame.TimeLeft    = savedGame.TimeLimit;
                savedGame.GameState   = "active";
                savedGame.boggleBoard = new BoggleBoard();
                savedGame.Board       = savedGame.boggleBoard.ToString();

                addGameToDB(savedGame);
                SetStatus(Created);
                string toReturn = savedGame.gameID.ToString();
                GameIDCounter++;
                return(new GameIDInfo(toReturn));
            }
        }