Beispiel #1
0
        public GameInfo GameStatus(string Brief, string GameID, out HttpStatusCode statusCode)
        {
            lock (sync)
            {
                statusCode = OK;
                if (GameID == null || !(Int32.TryParse(GameID, out int result)))//|| !games.ContainsKey(GameID)|| result>=games.Count
                {
                    statusCode = Forbidden;
                    return(null);
                }
                else
                {
                    GameInfo status;
                    using (SqlConnection conn = new SqlConnection(BoggleDB))
                    {
                        conn.Open();
                        using (SqlTransaction trans = conn.BeginTransaction())
                        {
                            // if the user token doesn't exist in the data, set status forbiden and return.
                            using (SqlCommand cmd = new SqlCommand("select * from Games where GameID = @GameID", conn, trans))
                            {
                                Int32.TryParse(GameID, out int intGameID);
                                cmd.Parameters.AddWithValue("@GameID", intGameID);
                                using (SqlDataReader reader = cmd.ExecuteReader())
                                {
                                    while (reader.Read())
                                    {
                                        if (!reader.HasRows)
                                        {
                                            statusCode = Forbidden;
                                            trans.Commit();
                                            reader.Close();
                                            return(null);
                                        }
                                        else
                                        {
                                            statusCode = OK;
                                            status     = new GameInfo
                                            {
                                                GameState = reader["GameState"].ToString()
                                            };

                                            if (status.GameState == "pending")
                                            {
                                                reader.Close();
                                                trans.Commit();
                                                return(status);
                                            }
                                            else
                                            //active or completed
                                            {
                                                if (Brief != null && Brief == "yes")
                                                {
                                                    //gamestate,timeleft,players' score
                                                    Player player1 = new Player();
                                                    Player player2 = new Player();
                                                    player1.Score       = 0;
                                                    player2.Score       = 0;
                                                    player1.WordsPlayed = new List <WordPlayed>();
                                                    player2.WordsPlayed = new List <WordPlayed>();
                                                    string playerID1 = reader["Player1"].ToString();
                                                    string playerID2 = reader["Player2"].ToString();
                                                    status.Player1             = player1;
                                                    status.Player2             = player2;
                                                    status.Player1.WordsPlayed = null;
                                                    status.Player2.WordsPlayed = null;

                                                    Int32.TryParse(reader["TimeLimit"].ToString(), out int result1);
                                                    DateTime startTime = (DateTime)reader["StartTime"];
                                                    status.TimeLeft = ((result1) - (int)(DateTime.UtcNow - startTime).TotalSeconds);

                                                    reader.Close();
                                                    //get scores for players
                                                    using (SqlCommand cmd2 = new SqlCommand("select Score from Words where Player = @Player and GameID = @GameID", conn, trans))
                                                    {
                                                        cmd2.Parameters.AddWithValue("@Player", playerID1);
                                                        Int32.TryParse(GameID, out int intGameID2);
                                                        cmd2.Parameters.AddWithValue("@GameID", intGameID2);

                                                        using (SqlDataReader reader2 = cmd2.ExecuteReader())
                                                        {
                                                            while (reader2.Read())
                                                            {
                                                                if (reader2.IsDBNull(0))//)//||
                                                                {
                                                                    status.Player1.Score = 0;
                                                                }
                                                                status.Player1.Score += Convert.ToInt32(reader2["Score"]);//have to chekc if this works
                                                            }
                                                            reader2.Close();
                                                        }
                                                    }
                                                    using (SqlCommand cmd2 = new SqlCommand("select Score from Words where Player = @Player and GameID = @GameID", conn, trans))
                                                    {
                                                        cmd2.Parameters.AddWithValue("@Player", playerID2);
                                                        cmd2.Parameters.AddWithValue("@GameID", GameID);
                                                        using (SqlDataReader reader2 = cmd2.ExecuteReader())
                                                        {
                                                            while (reader2.Read())
                                                            {
                                                                if (reader2.IsDBNull(0))//)//||
                                                                {
                                                                    status.Player2.Score = 0;
                                                                }
                                                                status.Player2.Score += Convert.ToInt32(reader2["Score"]);
                                                            }
                                                            reader2.Close();
                                                        }
                                                    }


                                                    // if the game is over, update the gamestate to completed
                                                    if (((result1) - (int)(DateTime.UtcNow - startTime).TotalSeconds) <= 0)
                                                    {
                                                        //maybe wrong syntax. game id == the current game id
                                                        using (SqlCommand cmd2 = new SqlCommand("update Games set GameState = 'completed' where GameID = @GameID", conn, trans))
                                                        {
                                                            cmd2.Parameters.AddWithValue("@GameID", GameID);
                                                            status.TimeLeft = 0;
                                                            cmd2.ExecuteNonQuery();
                                                            return(status);
                                                        }
                                                    }
                                                    status.TimeLeft = ((result1) - (int)(DateTime.UtcNow - startTime).TotalSeconds);
                                                    trans.Commit();
                                                    return(status);
                                                }
                                                //no brief.
                                                else
                                                {
                                                    status.Board = reader["Board"].ToString();
                                                    Int32.TryParse(reader["TimeLimit"].ToString(), out int result1);
                                                    //Int32.TryParse(reader["StartTime"].ToString(), out int result2);
                                                    status.TimeLimit = result1;
                                                    status.TimeLeft  = ((result1) - (int)(DateTime.UtcNow - (DateTime)reader["StartTime"]).TotalSeconds);


                                                    Player player1 = new Player();
                                                    Player player2 = new Player();
                                                    player1.Score       = 0;
                                                    player2.Score       = 0;
                                                    player1.WordsPlayed = new List <WordPlayed>();
                                                    player2.WordsPlayed = new List <WordPlayed>();
                                                    string playerID1 = reader["Player1"].ToString();
                                                    string playerID2 = reader["Player2"].ToString();
                                                    status.Player1 = player1;
                                                    status.Player2 = player2;
                                                    DateTime startTime = (DateTime)reader["StartTime"];
                                                    reader.Close();
                                                    //get nicknames
                                                    using (SqlCommand cmd2 = new SqlCommand("select Nickname from Users where UserID = @UserID", conn, trans))
                                                    {
                                                        cmd2.Parameters.AddWithValue("@UserID", playerID1);
                                                        SqlDataReader reader2 = cmd2.ExecuteReader();
                                                        while (reader2.Read())
                                                        {
                                                            status.Player1.Nickname = (reader2.GetString(0));
                                                        }
                                                        reader2.Close();
                                                    }
                                                    using (SqlCommand cmd2 = new SqlCommand("select Nickname from Users where UserID = @UserID", conn, trans))
                                                    {
                                                        cmd2.Parameters.AddWithValue("@UserID", playerID2);
                                                        SqlDataReader reader2 = cmd2.ExecuteReader();
                                                        while (reader2.Read())
                                                        {
                                                            status.Player2.Nickname = (reader2.GetString(0));
                                                        }
                                                        reader2.Close();
                                                    }


                                                    //modify the score of each player
                                                    using (SqlCommand cmd2 = new SqlCommand("select Score from Words where Player = @Player and GameID = @GameID and not Score is NULL", conn, trans))
                                                    {
                                                        cmd2.Parameters.AddWithValue("@Player", playerID1);
                                                        cmd2.Parameters.AddWithValue("@GameID", GameID);
                                                        using (SqlDataReader reader2 = cmd2.ExecuteReader())
                                                        {
                                                            //determine if the words table contains the player
                                                            if (!reader2.HasRows)                                                            //)//||
                                                            {
                                                                status.Player1.Score = 0;
                                                            }
                                                            while (reader2.Read())
                                                            {
                                                                status.Player1.Score += Convert.ToInt32(reader2["Score"]);
                                                            }
                                                            reader2.Close();
                                                        }
                                                    }
                                                    using (SqlCommand cmd3 = new SqlCommand("select Score from Words where Player = @Player and GameID = @GameID and not Score is NULL", conn, trans))
                                                    {
                                                        cmd3.Parameters.AddWithValue("@Player", playerID2);
                                                        cmd3.Parameters.AddWithValue("@GameID", GameID);
                                                        using (SqlDataReader reader2 = cmd3.ExecuteReader())
                                                        {
                                                            //determine if the words table contains the player
                                                            if (!reader2.HasRows)                                                            //)//||
                                                            {
                                                                status.Player2.Score = 0;
                                                            }
                                                            while (reader2.Read())
                                                            {
                                                                status.Player2.Score += Convert.ToInt32(reader2["Score"]);
                                                            }
                                                            reader2.Close();
                                                        }
                                                    }
                                                    //at the moment when game status is called.
                                                    if (status.GameState == "active")
                                                    {
                                                        //if it is no longer an active game, set state to completed and return.
                                                        if (status.TimeLeft <= 0)
                                                        {
                                                            //maybe wrong syntax. game id == the current game id
                                                            using (SqlCommand cmd2 = new SqlCommand("update Games set GameState = 'completed' where GameID = @GameID", conn, trans))
                                                            {
                                                                cmd2.Parameters.AddWithValue("@GameID", GameID);
                                                                //Int32.TryParse(GameID, out int result3);
                                                                //cmd.Parameters.Add("@GameId", SqlDbType.Int).Value = result3;
                                                                status.TimeLeft = 0;
                                                                cmd2.ExecuteNonQuery();
                                                                status.GameState = "completed";
                                                                List <WordPlayed> wordsplayed1 = new List <WordPlayed>();
                                                                List <WordPlayed> wordsplayed2 = new List <WordPlayed>();
                                                                using (SqlCommand cmd3 = new SqlCommand("select * from Words where Player = @Player and GameID = @GameID", conn, trans))
                                                                {
                                                                    cmd3.Parameters.AddWithValue("@Player", playerID1);
                                                                    cmd3.Parameters.AddWithValue("@GameID", GameID);
                                                                    SqlDataReader reader2 = cmd3.ExecuteReader();
                                                                    while (reader2.Read())
                                                                    {
                                                                        string     word  = reader2["Word"].ToString();
                                                                        int        score = reader2.GetInt32(4);                                                                 //check later the parameter is the column number
                                                                        WordPlayed temp  = new WordPlayed();
                                                                        temp.Word  = word;
                                                                        temp.Score = score;
                                                                        wordsplayed1.Add(temp);
                                                                    }
                                                                    reader2.Close();
                                                                    status.Player1.WordsPlayed = wordsplayed1;
                                                                }
                                                                using (SqlCommand cmd3 = new SqlCommand("select * from Words where Player = @Player and GameID = @GameID", conn, trans))
                                                                {
                                                                    cmd3.Parameters.AddWithValue("@Player", playerID2);
                                                                    cmd3.Parameters.AddWithValue("@GameID", GameID);
                                                                    SqlDataReader reader2 = cmd3.ExecuteReader();
                                                                    while (reader2.Read())
                                                                    {
                                                                        string     word  = reader2["Word"].ToString();
                                                                        int        score = reader2.GetInt32(4);
                                                                        WordPlayed temp  = new WordPlayed();
                                                                        temp.Word  = word;
                                                                        temp.Score = score;
                                                                        wordsplayed2.Add(temp);
                                                                    }
                                                                    reader2.Close();
                                                                    status.Player2.WordsPlayed = wordsplayed2;
                                                                }
                                                                trans.Commit();
                                                                return(status);
                                                            }
                                                        }
                                                        //else, just set the timeleft and return.
                                                        status.TimeLeft = ((result1) - (int)(DateTime.UtcNow - startTime).TotalSeconds);
                                                        trans.Commit();
                                                        return(status);
                                                    }
                                                    //completed
                                                    else
                                                    {
                                                        List <WordPlayed> wordsplayed1 = new List <WordPlayed>();
                                                        List <WordPlayed> wordsplayed2 = new List <WordPlayed>();
                                                        using (SqlCommand cmd2 = new SqlCommand("select * from Words where Player = @Player and GameID = @GameID", conn, trans))
                                                        {
                                                            cmd2.Parameters.AddWithValue("@Player", playerID1);
                                                            cmd2.Parameters.AddWithValue("@GameID", GameID);
                                                            SqlDataReader reader2 = cmd2.ExecuteReader();
                                                            while (reader2.Read())
                                                            {
                                                                string     word  = reader2["Word"].ToString();
                                                                int        score = reader2.GetInt32(4);                                                         //check later the parameter is the column number
                                                                WordPlayed temp  = new WordPlayed();
                                                                temp.Word  = word;
                                                                temp.Score = score;
                                                                wordsplayed1.Add(temp);
                                                            }
                                                            reader2.Close();
                                                            status.Player1.WordsPlayed = wordsplayed1;
                                                        }
                                                        using (SqlCommand cmd2 = new SqlCommand("select * from Words where Player = @Player and GameID = @GameID", conn, trans))
                                                        {
                                                            cmd2.Parameters.AddWithValue("@Player", playerID2);
                                                            cmd2.Parameters.AddWithValue("@GameID", GameID);
                                                            SqlDataReader reader2 = cmd2.ExecuteReader();
                                                            while (reader2.Read())
                                                            {
                                                                string     word  = reader2["Word"].ToString();
                                                                int        score = reader2.GetInt32(4);
                                                                WordPlayed temp  = new WordPlayed();
                                                                temp.Word  = word;
                                                                temp.Score = score;
                                                                wordsplayed2.Add(temp);
                                                            }
                                                            reader2.Close();
                                                            status.Player2.WordsPlayed = wordsplayed2;
                                                        }
                                                        status.Player1.WordsPlayed = wordsplayed1;
                                                        status.Player2.WordsPlayed = wordsplayed2;
                                                        status.TimeLeft            = 0;
                                                        trans.Commit();
                                                        return(status);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    return(null);
                                }
                            }
                        }
                    }
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Returns the status of a game.
        /// </summary>
        public GameStatus GameStatus(string GameID, string Brief)
        {
            bool brief = false;

            if (Brief == "yes")
            {
                brief = true;
            }
            int GameId;

            int.TryParse(GameID, out GameId);
            GamesDB    game = QueryGame(GameId);
            GameStatus ret  = new GameStatus();

            if (game == null)
            {
                ret.HttpStatus = "403 Forbidden";
                return(ret);
            }
            if (game.Player2 == null)
            {
                ret.HttpStatus = "200 OK";
                ret.GameState  = "pending";
                return(ret);
            }
            else if (game.StartTime.AddSeconds(game.TimeLimit) < DateTime.Now)
            {
                ret.GameState = "completed";
                ret.TimeLeft  = 0;
            }
            else
            {
                ret.GameState = "active";
                ret.TimeLeft  = (game.StartTime.AddSeconds(game.TimeLimit) - DateTime.Now).Seconds + (game.StartTime.AddSeconds(game.TimeLimit) - DateTime.Now).Minutes * 60;
            }

            if (!brief)
            {
                ret.Board     = game.Board;
                ret.TimeLimit = game.TimeLimit;
            }

            //Player info
            PlayerModel P1 = new PlayerModel();
            PlayerModel P2 = new PlayerModel();

            ret.Player1 = P1;
            ret.Player2 = P2;
            P1.Score    = 0;
            P2.Score    = 0;
            if (!brief)
            {
                P1.Nickname = QueryUser(game.Player1);
                P2.Nickname = QueryUser(game.Player2);
            }

            LinkedList <WordsDB> words1 = QueryWord(GameId, game.Player1);
            LinkedList <WordsDB> words2 = QueryWord(GameId, game.Player2);

            //Player1 calculate score and words played
            List <WordPlayed> WordsPlayed = new List <WordPlayed>();

            foreach (WordsDB word in words1)
            {
                WordPlayed curr = new WordPlayed();
                curr.Word  = word.Word;
                curr.Score = word.Score;
                P1.Score  += curr.Score;
                WordsPlayed.Add(curr);
            }
            if (ret.GameState == "completed" && !brief)
            {
                P1.WordsPlayed = WordsPlayed;
            }
            //Player2 calculate score and words played
            WordsPlayed = new List <WordPlayed>();
            foreach (WordsDB word in words2)
            {
                WordPlayed curr = new WordPlayed();
                curr.Word  = word.Word;
                curr.Score = word.Score;
                P2.Score  += curr.Score;
                WordsPlayed.Add(curr);
            }
            if (ret.GameState == "completed" && !brief)
            {
                P2.WordsPlayed = WordsPlayed;
            }
            ret.HttpStatus = "200 OK";
            return(ret);
        }
Beispiel #3
0
        public WordPlayed PlayWord(UserInfo user, string GameID, out HttpStatusCode status)
        {
            lock (sync)
            {
                string trimmedWord = user.Word.Trim().ToUpper();
                int    scoreOfWord = 0;
                string boardString = "";

                if (!(Int32.TryParse(GameID, out int result)))
                {
                    status = Forbidden;
                    return(null);
                }


                if (user.UserToken == null || user.UserToken.Length == 0 || user.Word == null || user.Word.Length == 0 || user.Word.Trim().Length > 30)
                {
                    status = Forbidden;
                    return(null);
                }
                using (SqlConnection conn = new SqlConnection(BoggleDB))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        // determine whether GameID is valid (exists in Games table)
                        using (SqlCommand command = new SqlCommand("select GameID, Player1, Player2, Board from Games where Games.GameID = @GameID", conn, trans))
                        {
                            command.Parameters.AddWithValue("@GameID", GameID);
                            using (SqlDataReader reader = command.ExecuteReader())
                            {   // if GameID does not exist in games
                                if (!reader.HasRows)
                                {
                                    status = Forbidden;
                                    reader.Close();
                                    trans.Commit();
                                    return(null);
                                }
                                // determine whether user has valid userToken (Player1 or Player2 has user.UserToken)
                                while (reader.Read())
                                {
                                    string player1Token = reader["Player1"].ToString();
                                    string player2Token = reader["Player2"].ToString();
                                    boardString = reader["Board"].ToString();
                                    // if neither player1 nor player2 has user.UserToken
                                    if ((player1Token != user.UserToken) && (player2Token != user.UserToken))
                                    {
                                        status = Forbidden;
                                        reader.Close();

                                        trans.Commit();
                                        return(null);
                                    }
                                }
                                reader.Close();
                                // determine whether game state is not active
                                string         gameState = "";
                                HttpStatusCode a         = OK;
                                GameStatus("asd", GameID, out a);
                                using (SqlCommand cmd = new SqlCommand("select GameState from Games where Games.GameID = @GameID2", conn, trans))
                                {
                                    cmd.Parameters.AddWithValue("@GameID2", GameID);
                                    using (SqlDataReader reader2 = cmd.ExecuteReader())
                                    {
                                        while (reader2.Read())
                                        {
                                            gameState = reader2["GameState"].ToString();
                                        }
                                        reader2.Close();
                                    }
                                }



                                if (gameState != "active")
                                {
                                    status = Conflict;
                                    trans.Commit();
                                    return(null);
                                }


                                if (trimmedWord.Length < 3)
                                {
                                    scoreOfWord = 0;
                                }
                                else
                                {
                                    BoggleBoard board = new BoggleBoard(boardString);
                                    if (board.CanBeFormed(trimmedWord) && IsInDictionary(trimmedWord))
                                    {
                                        if (trimmedWord.Length < 5)
                                        {
                                            scoreOfWord = 1;
                                        }
                                        else if (trimmedWord.Length == 5)
                                        {
                                            scoreOfWord = 2;
                                        }
                                        else if (trimmedWord.Length == 6)
                                        {
                                            scoreOfWord = 3;
                                        }
                                        else if (trimmedWord.Length == 7)
                                        {
                                            scoreOfWord = 5;
                                        }
                                        else
                                        {
                                            scoreOfWord = 11;
                                        }
                                    }
                                    else
                                    {
                                        scoreOfWord = -1;
                                    }
                                }
                            }
                        }

                        // check if this word has already been played by this player in this game
                        using (SqlCommand command = new SqlCommand("select Word from Words where Words.GameID = @GameID and Words.Word = @Word and Words.Player = @Player", conn, trans))
                        {
                            command.Parameters.AddWithValue("@Word", trimmedWord);
                            command.Parameters.AddWithValue("@GameID", GameID);
                            command.Parameters.AddWithValue("@Player", user.UserToken);
                            using (SqlDataReader reader = command.ExecuteReader())
                            {   // if this word has already been played by this player in this game
                                if (reader.HasRows)
                                {
                                    scoreOfWord = 0;
                                }
                                reader.Close();
                            }
                        }


                        //update Word table
                        using (SqlCommand command = new SqlCommand("insert into Words(Word, GameID, Player, Score) values(@Word, @GameID, @Player, @Score)", conn, trans))
                        {
                            command.Parameters.AddWithValue("@GameID", GameID);
                            command.Parameters.AddWithValue("@Word", trimmedWord);
                            command.Parameters.AddWithValue("@Player", user.UserToken);
                            command.Parameters.AddWithValue("@Score", scoreOfWord);
                            command.ExecuteNonQuery();
                            status = OK;
                            trans.Commit();
                            WordPlayed word = new WordPlayed();
                            word.Score = scoreOfWord;
                            return(word);
                        }
                    }
                }
            }
        }
        public string PlayWord(string gameIDString, WordPlayed wordPlayed)
        {
            lock (sync)
            {
                int    gameID    = int.Parse(gameIDString);
                string UserToken = wordPlayed.UserToken;
                string Word      = wordPlayed.Word.ToUpper();

                // If Word is null or empty when trimmed, or if GameID or UserToken is missing or invalid,
                // or if UserToken is not a player in the game identified by GameID, responds with response code 403 (Forbidden).
                if (Word == null || Word.Trim() == string.Empty || !users.ContainsKey(UserToken) ||
                    (games[gameID].Player1Token != UserToken && games[gameID].Player2Token != UserToken))
                {
                    SetStatus(Forbidden);
                    return(null);
                }
                // Otherwise, if the game state is anything other than "active", responds with response code 409(Conflict).
                else if (games[gameID].GameState != "active")
                {
                    SetStatus(Conflict);
                    return(null);
                }
                else
                {
                    // Otherwise, records the trimmed Word as being played by UserToken in the game identified by GameID.
                    // Returns the score for Word in the context of the game(e.g. if Word has been played before the score is zero).
                    // Responds with status 200(OK).Note: The word is not case sensitive.
                    BoggleBoard board = new BoggleBoard(games[gameID].GameBoard);
                    int         score = 0;

                    // TODO Check if word exists in the dictionary
                    if (board.CanBeFormed(Word))
                    {
                        if (Word.Length > 2)
                        {
                            score++;
                        }
                        if (Word.Length > 4)
                        {
                            score++;
                        }
                        if (Word.Length > 5)
                        {
                            score++;
                        }
                        if (Word.Length > 6)
                        {
                            score += 2;
                        }
                        if (Word.Length > 7)
                        {
                            score += 6;
                        }

                        if (games[gameID].Player1Token == UserToken)
                        {
                            if (games[gameID].Player2WordScores.ContainsKey(Word))
                            {
                                games[gameID].Player2Score           -= games[gameID].Player2WordScores[Word];
                                games[gameID].Player2WordScores[Word] = score = 0;
                            }

                            if (games[gameID].Player1WordScores.ContainsKey(Word))
                            {
                                score = 0;
                            }
                            else
                            {
                                games[gameID].Player1WordScores.Add(Word, score);
                            }
                        }
                        else if (games[gameID].Player2Token == UserToken)
                        {
                            if (games[gameID].Player1WordScores.ContainsKey(Word))
                            {
                                games[gameID].Player1Score           -= games[gameID].Player1WordScores[Word];
                                games[gameID].Player1WordScores[Word] = score = 0;
                            }

                            if (games[gameID].Player2WordScores.ContainsKey(Word))
                            {
                                score = 0;
                            }
                            else
                            {
                                games[gameID].Player2WordScores.Add(Word, score);
                            }
                        }
                    }

                    SetStatus(OK);
                    return(score.ToString());
                }
            }
        }