public List <JsonCard> ShowCards(string token) { using var conn = new NpgsqlConnection(ConnectionString); conn.Open(); string username = GetUsernameFromToken(token); List <JsonCard> cards = new List <JsonCard>(); var cmd = new NpgsqlCommand("Select cards.id, name, damage from cards inner join player_cards on cards.id = player_cards.card_id where player_cards.username = @username", conn); cmd.Parameters.AddWithValue("username", username); cmd.Prepare(); try { var reader = cmd.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { var temp = new JsonCard(); temp.Id = (string)reader[0]; temp.Name = (string)reader[1]; temp.Damage = (double)((decimal)reader[2]); cards.Add(temp); } return(cards); } return(null); } catch (PostgresException) { return(null); } }
public string ExecuteBattle(string username) { using var conn = new NpgsqlConnection(ConnectionString); conn.Open(); //Check if user has deck var cmd = new NpgsqlCommand("Select * from player_deck where username = @username", conn); cmd.Parameters.AddWithValue("username", username); cmd.Prepare(); //Check if Battle entry without user exists var cmd2 = new NpgsqlCommand("Select id from battle where player1 != @username and player2 is null", conn); cmd2.Parameters.AddWithValue("username", username); cmd2.Prepare(); //Create Battle entry if necessary var cmd3 = new NpgsqlCommand("INSERT INTO battle (player1) VALUES (@username)", conn); cmd3.Parameters.AddWithValue("username", username); cmd3.Prepare(); var cmdUpdate = new NpgsqlCommand("UPDATE battle SET player2 = @username where id = @id", conn); //Get created BattleID var cmdBattle = new NpgsqlCommand("Select id from battle where player1 = @username", conn); cmdBattle.Parameters.AddWithValue("username", username); cmdBattle.Prepare(); //If Battle entry exists already execute battle var cmd4 = new NpgsqlCommand("Select player1 from battle where id = @id", conn); var cmd5 = new NpgsqlCommand("Select id, name, damage from cards inner join player_deck on cards.id = player_deck.card_id where username = @username", conn); var cmd6 = new NpgsqlCommand("Select id, name, damage from cards inner join player_deck on cards.id = player_deck.card_id where username = @username", conn); //reduce Elo var cmdLoser = new NpgsqlCommand("UPDATE player SET elo = (elo-5) where username = @username", conn); var cmdWinner = new NpgsqlCommand("UPDATE player SET elo = (elo+3) where username = @username", conn); //Save Battle in BattleLog var cmd9 = new NpgsqlCommand("INSERT INTO battle_log (id, battle_text, winner) VALUES (@id, @battle_text, @winner)", conn); //Loop until BattleLog exists var cmd10 = new NpgsqlCommand("Select battle_text from battle_log where id = @id", conn); try { //Check if user has deck var reader = cmd.ExecuteReader(); if (!reader.HasRows) { return("No deck found!"); } reader.Close(); //Check if Battle entry without user exists var reader2 = cmd2.ExecuteReader(); //If Battle entry exists already -> execute battle int battleId; if (reader2.HasRows) { reader2.Read(); battleId = (int)reader2[0]; reader2.Close(); cmd4.Parameters.AddWithValue("id", battleId); cmd4.Prepare(); var reader4 = cmd4.ExecuteReader(); if (!reader4.HasRows) { return(null); } reader4.Read(); var player1 = (string)reader4[0]; var player2 = username; reader4.Close(); cmdUpdate.Parameters.AddWithValue("username", username); cmdUpdate.Parameters.AddWithValue("id", battleId); cmdUpdate.Prepare(); cmdUpdate.ExecuteNonQuery(); cmd5.Parameters.AddWithValue("username", player1); cmd5.Prepare(); cmd6.Parameters.AddWithValue("username", player2); cmd6.Prepare(); var cardList1 = new List <ICard>(); var cardList2 = new List <ICard>(); var reader5 = cmd5.ExecuteReader(); if (!reader5.HasRows) { return(null); } while (reader5.Read()) { var card = new JsonCard(); card.Id = (string)reader5[0]; card.Name = (string)reader5[1]; card.Damage = (double)((decimal)reader5[2]); cardList1.Add(card.ConvertToCard()); } reader5.Close(); var reader6 = cmd6.ExecuteReader(); if (!reader6.HasRows) { return(null); } while (reader6.Read()) { var card = new JsonCard(); card.Id = (string)reader6[0]; card.Name = (string)reader6[1]; card.Damage = (double)((decimal)reader6[2]); cardList2.Add(card.ConvertToCard()); } reader6.Close(); //DB inputs var deck1 = new CardDeck(); var deck2 = new CardDeck(); var users = new List <User>(); var user1 = new User(); var user2 = new User(); deck1.Cards = cardList1; deck2.Cards = cardList2; user1.SelectedDeck = deck1; user2.SelectedDeck = deck2; user1.Username = player1; user2.Username = player2; users.Add(user1); users.Add(user2); Battle battle = new Battle(users); var log = battle.Fight(); //reduce elo if (log.Winner != null) { cmdWinner.Parameters.AddWithValue("username", log.Winner.Username); cmdWinner.Prepare(); cmdLoser.Parameters.AddWithValue("username", player1.Equals(log.Winner.Username) ? player2 : player1); cmdLoser.Prepare(); cmdLoser.ExecuteNonQuery(); cmdWinner.ExecuteNonQuery(); } //Save Battle in BattleLog cmd9.Parameters.AddWithValue("id", battleId); cmd9.Parameters.AddWithValue("battle_text", log.Log); if (log.Winner != null) { cmd9.Parameters.AddWithValue("winner", log.Winner.Username); } else { cmd9.Parameters.AddWithValue("winner", ""); } cmd9.Prepare(); cmd9.ExecuteNonQuery(); } //Create Battle entry if necessary else { reader2.Close(); var reader3 = cmd3.ExecuteNonQuery(); if (reader3 == -1) { return(null); } //Get created battleID // ReSharper disable once PossibleNullReferenceException battleId = (int)cmdBattle.ExecuteScalar(); } //Loop until BattleLog exists cmd10.Parameters.AddWithValue("id", battleId); cmd10.Prepare(); while (true) { var reader10 = cmd10.ExecuteReader(); if (reader10.HasRows) { reader10.Read(); return((string)reader10[0]); } reader10.Close(); System.Threading.Thread.Sleep(1000); } } catch (PostgresException e) { Console.WriteLine(e.MessageText); return(null); } }
public int ExecuteTrade(string username, string tradeId, string cardId) { using var conn = new NpgsqlConnection(ConnectionString); conn.Open(); var tradeCardJson = new JsonCard(); var tradeRequest = new TradeCards(); //Check if trade exists var cmd = new NpgsqlCommand("Select * from trade where id = @id", conn); cmd.Parameters.AddWithValue("id", tradeId); cmd.Prepare(); //Check if user owns trade var cmd2 = new NpgsqlCommand("Select * from trade where username = @username and id = @id", conn); cmd2.Parameters.AddWithValue("username", username); cmd2.Parameters.AddWithValue("id", tradeId); cmd2.Prepare(); //Check if user owns card and get card data var cmd3 = new NpgsqlCommand("Select id, name, damage from player_cards inner join cards on player_cards.card_id = cards.id where username = @username and card_id = @card_id", conn); cmd3.Parameters.AddWithValue("username", username); cmd3.Parameters.AddWithValue("card_id", cardId); cmd3.Prepare(); //Get trade data var cmd4 = new NpgsqlCommand("Select id, username, card_id, typ, element, damage from trade where id = @id", conn); cmd4.Parameters.AddWithValue("id", tradeId); cmd4.Prepare(); //Check if card to be traded meets requirements //Delete trade request var cmd5 = new NpgsqlCommand("DELETE FROM trade where card_id = @card_id", conn); //Update player_cards information (needs card_id from tradeRequest) var cmd6 = new NpgsqlCommand("UPDATE player_cards SET username = @username where card_id = @card_id", conn); cmd6.Parameters.AddWithValue("username", username); //Update second player_cards information (needs username from tradeRequest) var cmd7 = new NpgsqlCommand("UPDATE player_cards SET username = @username where card_id = @card_id", conn); cmd7.Parameters.AddWithValue("card_id", cardId); try { //check if Trade request exists var reader = cmd.ExecuteReader(); if (!reader.HasRows) { return(-2); } reader.Close(); //Check if user owns trade var reader2 = cmd2.ExecuteReader(); if (reader2.HasRows) { return(-3); } reader2.Close(); //Check if user owns card and get card data var reader3 = cmd3.ExecuteReader(); if (!reader3.HasRows) { return(-4); } while (reader3.Read()) { tradeCardJson.Id = (string)reader3[0]; tradeCardJson.Name = (string)reader3[1]; tradeCardJson.Damage = (double)((decimal)reader3[2]); } var tradeCard = tradeCardJson.ConvertToCard(); reader3.Close(); var reader4 = cmd4.ExecuteReader(); while (reader4.Read()) { //id, username, card_id, typ, element, damage tradeRequest.Id = (string)reader4[0]; tradeRequest.Username = (string)reader4[1]; tradeRequest.CardId = (string)reader4[2]; tradeRequest.RequirementType = (string)reader4[3]; tradeRequest.RequirementElement = (string)reader4[4]; tradeRequest.RequirementDamage = (double)((decimal)reader4[5]); } reader4.Close(); //Check if card to be traded meets requirements if (tradeCard.Damage < tradeRequest.RequirementDamage) { return(-10); } if (!tradeRequest.RequirementType.Equals("")) { if (tradeRequest.RequirementType.ToLower().Equals("monster") && tradeCard is SpellCard) { return(-11); } if (tradeRequest.RequirementType.ToLower().Equals("spell") && tradeCard.GetType().IsSubclassOf(typeof(MonsterCard))) { return(-11); } } if (!tradeRequest.RequirementElement.Equals("")) { if (tradeRequest.RequirementElement.ToLower().Equals("fire") && !(tradeCard.Element is Fire)) { return(-12); } if (tradeRequest.RequirementElement.ToLower().Equals("water") && !(tradeCard.Element is Water)) { return(-12); } if ((tradeRequest.RequirementElement.ToLower().Equals("normal") || tradeRequest.RequirementElement.ToLower().Equals("regular")) && !(tradeCard.Element is Normal)) { return(-12); } } cmd5.Parameters.AddWithValue("card_id", tradeRequest.CardId); cmd5.Prepare(); if (cmd5.ExecuteNonQuery() == -1) { return(-13); } cmd6.Parameters.AddWithValue("card_id", tradeRequest.CardId); cmd6.Prepare(); if (cmd6.ExecuteNonQuery() == -1) { return(-14); } cmd7.Parameters.AddWithValue("username", tradeRequest.Username); cmd7.Prepare(); if (cmd7.ExecuteNonQuery() == -1) { return(-14); } return(1); } catch (PostgresException) { return(-1); } }