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); } } } } } } }
/// <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); }
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()); } } }