예제 #1
0
        private void DeleteGameQuery(string gToken, string uToken)
        {
            //Create a Connection
            MySqlConnection  conn = new MySqlConnection(connectionString);
            TransactionQuery TQ   = new TransactionQuery(conn);

            //Get the specific game from the DataBase
            TQ.addCommand("select count(*) from games where  GameToken = ?gameToken");
            TQ.addParms(new string[] { "gameToken" }, new string[] { gToken });
            TQ.addReadParms(new string[] { "count(*)" }, new bool[] { true });
            TQ.addConditions((result, command) =>
            {
                if (result.Dequeue().Equals("0"))
                {
                    SetResponse("gt");
                    return(false);
                }
                else
                {
                    return(true);
                }
            });

            //Check to make sure the gameStatus is  waiting
            TQ.addCommand("select GameState, Player1Token from games where GameToken = ?gameToken");
            TQ.addRepeatParm();
            TQ.addReadParms(new string[] { "GameState", "Player1Token" }, new bool[] { false, true });
            TQ.addConditions((result, command) =>
            {
                if (!result.Dequeue().Equals("waiting"))
                {
                    SetResponse("nw");
                    return(false);
                }
                if (result.Dequeue() != uToken)
                {
                    SetResponse("player");
                    return(false);
                }

                Queue <string> returnQ;
                if (TQ.injectComand("update games set GameState = 'canceled' where GameToken = ?GameToken",
                                    new string[, ] {
                }, new string[] { }, false, out returnQ))
                {
                    SetResponse("delete");
                }
                return(true);
            });

            if (!TQ.Transaction())
            {
                SetResponse("ISE");
                return;
            }
        }
예제 #2
0
        private UserToken MakeUserQuery(Player p)
        {
            string           userID = Guid.NewGuid().ToString();     //New GUID for a Unique player ID
            MySqlConnection  conn   = new MySqlConnection(connectionString);
            TransactionQuery TQ     = new TransactionQuery(conn);

            TQ.addCommand("insert into users (UserToken, Nickname) values(?UserToken, ?Nickname)");
            TQ.addParms(new string[] { "UserToken", "Nickname" }, new string[] { userID, p.nickname });

            if (!TQ.Transaction())
            {
                SetResponse("ISE");
                return(null);
            }
            appLog.WriteEntry("BoggleServer: Made User", EventLogEntryType.Information);
            return(new UserToken()
            {
                userToken = userID
            });
        }
예제 #3
0
        private WordValue PlayWordQuery(PlayWord w)
        {
            //Create a Connection
            MySqlConnection conn = new MySqlConnection(connectionString);

            //CreateTransaction Query Object
            TransactionQuery TQ = new TransactionQuery(conn);

            int player = 0;

            ///Check for games with gametoken
            TQ.addCommand("select count(*) from games where GameToken = ?gameToken");
            TQ.addParms(new string[] { "gameToken" }, new string[] { w.gameToken });
            TQ.addReadParms(new string[] { "count(*)" }, new bool[] { true });
            TQ.addConditions((result, command) =>
            {
                if (result.Dequeue().Equals("0"))
                {
                    SetResponse("gt");
                    return(false);
                }
                else
                {
                    Queue <string> returnQ;
                    TQ.injectComand("select Player1Token from games where GameToken = ?gameToken",
                                    new string[, ] {
                    }, new string[] { "Player1Token" }, true, out returnQ);
                    if (returnQ.Dequeue() == w.playerToken)
                    {
                        player = 1;
                    }

                    return(true);
                }
            });
            bool   status    = true;
            string gameState = "";

            ///Check if the gamestate is playing
            TQ.addCommand("select GameState from games where GameToken = ?gameToken");
            TQ.addParms(new string[] { }, new string[] { });
            TQ.addReadParms(new string[] { "GameState" }, new bool[] { true });
            TQ.addConditions((result, command) =>
            {
                gameState = result.Dequeue();
                if (gameState.Equals("playing"))
                {
                    return(true);
                }
                else if (player == 1)
                {
                    SetResponse("waitingPlay");
                    status = false;
                    return(false);
                }
                else
                {
                    SetResponse("wrongStatus");
                    status = false;
                    return(false);
                }
            });


            string board;

            //Get the board and see if word can be played
            TQ.addCommand("select Player2Token, Board from pairedGames where GameToken = ?gameToken");
            TQ.addParms(new string[] {  }, new string[] { });
            TQ.addReadParms(new string[] { "Player2Token", "Board" }, new bool[] { false, true });
            TQ.addConditions((result, command) =>
            {
                if (result.Dequeue() == w.playerToken)
                {
                    player = 2;
                }
                board         = result.Dequeue();
                BoggleBoard b = new BoggleBoard(board);
                points        = WordLookUp(w.word, board);

                if (player == 0)
                {
                    SetResponse("player");
                    return(false);
                }

                return(true);
            });
            int  totalScore = 0;
            bool repeat     = false;

            ///Check if word is already played
            TQ.addCommand("select count(Word) from words where GameToken = ?gameToken and PlayerToken = ?playerToken");
            TQ.addParms(new string[] { "playerToken" }, new string[] { w.playerToken });
            TQ.addReadParms(new string[] { "Count(Word)" }, new bool[] { true });
            TQ.addConditions((result, command) =>
            {
                command.CommandText = "select Word, Score from words where GameToken = ?gameToken and PlayerToken = ?playerToken";
                if (command.ExecuteNonQuery() == 0)
                {
                    throw new Exception("GET WORDS FAILED");
                }
                using (MySqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        if (reader.GetString("Word") == w.word)
                        {
                            points = 0;
                        }

                        totalScore += Convert.ToInt32(reader.GetString("Score"));
                    }
                }
                if (!repeat)
                {
                    totalScore         += points;
                    command.CommandText = "update pairedGames set Score" + player + "=?Score where GameToken=?gameToken";
                    command.Parameters.AddWithValue("Score", totalScore);
                    if (command.ExecuteNonQuery() == 0)
                    {
                        throw new Exception("Update player score failed");
                    }
                    command.CommandText = "insert into words (GameToken, PlayerToken, Word, Score) values (?gameToken, ?pt, ?word, ?wordscore)";
                    command.Parameters.AddWithValue("pt", w.playerToken);
                    command.Parameters.AddWithValue("word", w.word);
                    command.Parameters.AddWithValue("wordscore", points);
                    if (command.ExecuteNonQuery() == 0)
                    {
                        throw new Exception("insert word score failed");
                    }
                    return(true);
                }
                else
                {
                    return(false);
                }
            });

            if (!TQ.Transaction())
            {
                SetResponse("ISE");
                return(null);
            }
            else
            {
                if (status)
                {
                    return new WordValue()
                           {
                               wordScore = points
                           }
                }
                ;
                else
                {
                    return(null);
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Returns the Brief game status of a game with a particular GAME ID
        /// </summary>
        public BriefGame GetBriefStatus(string gt)
        {
            if (gt == null)
            {
                //403 Misssing parameters
                SetResponse("NF");
                return(null);
            }

            //Create a Connection and a CreateTransaction Query Object
            MySqlConnection  conn = new MySqlConnection(connectionString);
            TransactionQuery TQ   = new TransactionQuery(conn);

            //Variable for holding the status of the game, if status returns "", it means the queury didn't work
            string status = "";

            // Query Games table for the status of the given game token.
            TQ.addCommand("select GameState from games where GameToken = ?gameToken");
            TQ.addParms(new string[] { "gameToken" }, new string[] { gt });
            TQ.addReadParms(new string[] { "GameState" }, new bool[] { true });
            TQ.addConditions((result, command) =>
            {
                status = result.Dequeue();
                if (status == "waiting" || status == "finished")
                {
                    return(false);
                }
                else
                {
                    return(true);
                }
            });

            //Variables for keeping duration, score1 and score2.
            string startTime = "", sc1 = "0", sc2 = "0";
            int    duration = 0;

            ///Query the Paried Game for GetBrief status, get the duration, score for player1 and player 2
            TQ.addCommand("select  StartTime, Score1, Score2 from pairedGames where GameToken = ?gameToken");
            TQ.addReadParms(new string[] { "StartTime", "Score1", "Score2" }, new bool[] { false, false, true });
            TQ.addRepeatParm();
            TQ.addConditions((result, command) =>
            {
                startTime = result.Dequeue();
                sc1       = result.Dequeue();
                sc2       = result.Dequeue();
                GetTimeSpan(command, ref duration, ref status, startTime);
                return(true);
            });



            //Proccess the transactions
            if (!TQ.Transaction())
            {
                SetResponse("ISE");
                return(null);
            }
            if (status == "")
            {
                SetResponse("gt");
                return(null);
            }
            BriefGame bf = new BriefGame()
            {
                gameStatus = status, score1 = Convert.ToInt32(sc1), score2 = Convert.ToInt32(sc2), timeleft = duration
            };

            appLog.WriteEntry("BoggleServer: FullGame successfully returned", EventLogEntryType.Information);
            return(bf);
        }
예제 #5
0
        /// <summary>
        /// Returns the Full game status of a game with the particular GAME ID
        /// </summary>
        public FullGame GetStatus(string gt)
        {
            if (gt == null)
            {
                //403 Misssing parameters
                SetResponse("NF");
                return(null);
            }

            //Create a Connection and a CreateTransaction Query Object
            MySqlConnection  conn = new MySqlConnection(connectionString);
            TransactionQuery TQ   = new TransactionQuery(conn);
            Queue <string>   returnQ;

            //Variables for holding the strings that the query returns.
            string player2Token = "", player1Token = "", board = "", startTime = "",
                   score1 = "0", score2 = "0", p1Name = "", p2Name = "", status = "";
            int duration             = 0;
            int Limit                = 0;
            List <WordScore> p1Words = new List <WordScore>();
            List <WordScore> p2Words = new List <WordScore>();

            // Query Games table for the status and the Player1Token of the given game token.
            TQ.addCommand("select GameState, Player1Token from games where GameToken = ?gameToken");
            TQ.addParms(new string[] { "gameToken" }, new string[] { gt });
            TQ.addReadParms(new string[] { "GameState", "Player1Token" }, new bool[] { false, true });
            TQ.addConditions((result, command) =>
            {
                status       = result.Dequeue();
                player1Token = result.Dequeue();

                TQ.injectComand("select Nickname from users where UserToken = ?player1Token",
                                new string[, ] {
                    { "player1Token", player1Token }
                }, new string[] { "Nickname" }, true, out returnQ);
                p1Name = returnQ.Dequeue();

                if (status == "waiting" || status == "cancelled")
                {
                    return(false);
                }
                if (status == "finished")
                {
                    TQ.injectComand("select Word, Score from words where GameToken = ?gameToken and PlayerToken = ?player1Token",
                                    new string[, ] {
                    }, new string[] { "Word", "Score" }, true, out returnQ);

                    int count = returnQ.Count / 2;
                    while (count > 0)
                    {
                        p1Words.Add(new WordScore()
                        {
                            word = returnQ.Dequeue(), score = Convert.ToInt32(returnQ.Dequeue())
                        });
                        count--;
                    }
                }
                return(true);
            });

            TQ.addCommand("select Player2Token, Board, StartTime, Score1, Score2 from pairedGames where GameToken = ?gameToken");
            TQ.addReadParms(new string[] { "Player2Token", "Board", "StartTime", "Score1", "Score2" }, new bool[] { false, false, false, false, true });
            TQ.addRepeatParm();
            TQ.addConditions((result, command) =>
            {
                player2Token = result.Dequeue();
                board        = result.Dequeue();
                startTime    = result.Dequeue();
                score1       = result.Dequeue();
                score2       = result.Dequeue();
                Limit        = Convert.ToInt32(TotalTime);
                GetTimeSpan(command, ref duration, ref status, startTime);


                TQ.injectComand("select Nickname from users where UserToken = ?player2Token",
                                new string[, ] {
                    { "player2Token", player2Token }
                }, new string[] { "Nickname" }, true, out returnQ);
                p2Name = returnQ.Dequeue();

                if (status == "finished")
                {
                    TQ.injectComand("select Word, Score from words where GameToken = ?gameToken and PlayerToken = ?player2Token",
                                    new string[, ] {
                    }, new string[] { "Word", "Score" }, true, out returnQ);
                    int count = returnQ.Count / 2;
                    while (count > 0)
                    {
                        p2Words.Add(new WordScore()
                        {
                            word = returnQ.Dequeue(), score = Convert.ToInt32(returnQ.Dequeue())
                        });
                        count--;
                    }
                }
                return(true);
            });

            if (!TQ.Transaction())
            {
                SetResponse("ISE");
                return(null);
            }
            if (status == "")
            {
                SetResponse("gt");
                return(null);
            }

            // Create return object from extracted data
            PlayerStatus ps1 = new PlayerStatus()
            {
                Score = Convert.ToInt32(score1), nickname = p1Name, wordsPlayed = p1Words
            };
            PlayerStatus ps2 = new PlayerStatus()
            {
                Score = Convert.ToInt32(score2), nickname = p2Name, wordsPlayed = p2Words
            };
            FullGame fg = new FullGame()
            {
                player1 = ps1, player2 = ps2, board = board, gameStatus = status, timeleft = duration, timelimit = Limit
            };

            appLog.WriteEntry("BoggleServer: FullGame successfully returned", EventLogEntryType.Information);
            return(fg);
        }
예제 #6
0
        private GameToken joinGameQuery(Player p)
        {
            string queryGameToken = "";
            /////Query for asking if the user is in the Users Table
            MySqlConnection  conn = new MySqlConnection(connectionString);
            TransactionQuery TQ   = new TransactionQuery(conn);

            TQ.addCommand("select count(*) from users where UserToken=?UserToken");
            TQ.addParms(new string[] { "UserToken" }, new string[] { p.userToken });
            TQ.addReadParms(new string[] { "count(*)" }, new bool[] { true });
            TQ.addConditions((result, command) =>
            {
                if (result.Dequeue().Equals("0"))
                {
                    SetResponse("player");
                    return(false);
                }
                else
                {
                    return(true);
                }
            });

            TQ.addCommand("select count(*) from games where GameState=?GameState");
            TQ.addParms(new string[] { "GameState" }, new string[] { "waiting" });
            TQ.addReadParms(new string[] { "count(*)" }, new bool[] { true });
            TQ.addConditions((result, command) =>
            {
                if (result.Dequeue() == "0")
                {
                    queryGameToken      = Guid.NewGuid().ToString();
                    command.CommandText = "insert into games (GameToken, Player1Token, GameState)"
                                          + "values(?gameToken, ?UserToken,?GameState)";
                    command.Parameters.AddWithValue("gameToken", queryGameToken);
                    //Execute Query
                    if (command.ExecuteNonQuery() == 0)
                    {
                        throw new Exception("Did not insert player into new game");
                    }

                    return(false);
                }
                else
                {
                    return(true);
                }
            });

            TQ.addCommand("select GameToken, Player1Token from games where GameState=?GameState");
            TQ.addParms(new string[] {}, new string[] {});
            TQ.addReadParms(new string[] { "GameToken", "Player1Token" }, new bool[] { false, true });
            TQ.addConditions((result, command) =>
            {
                queryGameToken = result.Dequeue();
                if (result.Dequeue() == p.userToken)
                {
                    SetResponse("same");                //409 Conflict Response(player already in game)
                    return(false);
                }
                else
                {
                    command.CommandText = "update games set GameState = ?gs where GameToken = ?gt";
                    command.Parameters.AddWithValue("gs", "playing");
                    command.Parameters.AddWithValue("gt", queryGameToken);
                    if (command.ExecuteNonQuery() == 0)
                    {
                        throw new Exception("update gamestate failed");
                    }
                    BoggleBoard b;
                    if (String.IsNullOrEmpty(initial))
                    {
                        b = new BoggleBoard(initial);
                    }
                    else
                    {
                        b = new BoggleBoard();
                    }
                    command.CommandText = "insert into pairedGames (GameToken, Player2Token, Score1, Score2, Board, Duration, StartTime)"
                                          + " values(?gt, ?Player2Token, 0, 0, ?Board, 0, ?StartTime)";
                    command.Parameters.AddWithValue("Player2Token", p.userToken);
                    command.Parameters.AddWithValue("Board", b.ToString());
                    command.Parameters.AddWithValue("StartTime", DateTime.Now.ToString());
                    if (command.ExecuteNonQuery() == 0)
                    {
                        throw new Exception("update gamestate failed");
                    }
                    return(true);
                }
            });

            if (!TQ.Transaction())
            {
                SetResponse("ISE");
                return(null);
            }

            return(new GameToken()
            {
                gameToken = queryGameToken
            });
        }