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