Пример #1
0
        public ResponseContext Post(Dictionary <string, object> param)
        {
            RequestContext request = (RequestContext)param["request"];
            MtcgClient     client  = (MtcgClient)param["client"];

            if (!request.Headers.ContainsKey("Content-Type") || request.Headers["Content-Type"] != "application/json")
            {
                return(new ResponseContext(request, new KeyValuePair <StatusCode, object>(StatusCode.UnsupportedMediaType, "")));
            }

            if (client.User.Deck.GetAllCards().Any())
            {
                return(new ResponseContext(request, new KeyValuePair <StatusCode, object>(StatusCode.Conflict, "Deck is already configured. Use PUT instead if you want to update")));
            }

            CardCollectionDto deckDto = JsonSerializer.Deserialize <CardCollectionDto>(request.Payload);

            deckDto.CardCollectionType = typeof(Deck);
            Deck deck;

            if (deckDto == null || deckDto.CardGuids.Count != 4 || (deck = deckDto.ToObject() as Deck) == null)
            {
                return(new ResponseContext(request,
                                           new KeyValuePair <StatusCode, object>(StatusCode.BadRequest,
                                                                                 "Either the deck does not contain 4 cards or some cards do not exist")));
            }

            return(new ResponseContext(request, _userController.ConfigureDeck(ref client, deck)));
        }
Пример #2
0
        public virtual ResponseContext Post(Dictionary <string, object> param)
        {
            RequestContext request = (RequestContext)param["request"];

            if (!request.Headers.ContainsKey("Content-Type") || request.Headers["Content-Type"] != "application/json")
            {
                return(new ResponseContext(request, new KeyValuePair <StatusCode, object>(StatusCode.UnsupportedMediaType, "")));
            }

            CardCollectionDto packageDto = JsonSerializer.Deserialize <CardCollectionDto>(request.Payload);

            packageDto.CardCollectionType = typeof(Package);
            Package package;

            if (packageDto == null || packageDto.CardGuids.Count != 5 || (package = packageDto.ToObject() as Package) == null)
            {
                return(new ResponseContext(request,
                                           new KeyValuePair <StatusCode, object>(StatusCode.BadRequest,
                                                                                 "Either the package does not contain 5 cards or some cards do not exist")));
            }

            return(new ResponseContext(request, _packageController.CreatePackage(package)));
        }
        public bool AcquirePackage(ref MtcgClient client, PackageType type)
        {
            Package           package    = null;
            CardCollectionDto packageDto = null;
            int    price = 0;
            string statement;

            if (type == PackageType.Random)
            {
                packageDto = new CardCollectionDto()
                {
                    CardGuids          = AcquireRandomPackage(),
                    CardCollectionType = typeof(Package)
                };
                price = GetPackagePrice(PackageType.Random);
            }
            else
            {
                statement = "SELECT * FROM mtcg.\"Package\" p, mtcg.\"PackageType\" pT " +
                            "WHERE pt.\"Id\"=@packageTypeId AND p.\"PackageTypeId\"=pT.\"Id\" " +
                            "ORDER BY RANDOM() " +
                            "LIMIT 1;";

                using (NpgsqlCommand cmd = new NpgsqlCommand(statement, PostgreSQLSingleton.GetInstance.Connection))
                {
                    cmd.Parameters.Add("packageTypeId", NpgsqlDbType.Integer).Value = (int)type;
                    cmd.Prepare();
                    using (var reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
                    {
                        if (reader.HasRows)
                        {
                            reader.Read();
                            packageDto = new CardCollectionDto()
                            {
                                CardGuids          = JsonSerializer.Deserialize <List <Guid> >(reader["Cards"].ToString()),
                                CardCollectionType = typeof(Package)
                            };
                            price = (int)reader["Price"];
                        }
                    };
                }
            }

            package = packageDto?.ToObject() as Package;

            if (package == null)
            {
                return(false);
            }

            package.PackageType = type;

            //save old properties to fallback if necessary
            Stack <Package> oldUnopenedPackages = new Stack <Package>(new Stack <Package>(client.User.CurrentUnopenedPackages));

            client.User.RemoveCoins(price);
            client.User.AddPackage(package);

            statement = "UPDATE mtcg.\"User\" " +
                        "SET \"Coins\"=@coins, \"UnopenedPackages\"=@unopenedPackages " +
                        "WHERE \"Username\"=@username AND \"Password_Hash\"=@password";
            string[] credentials = client.User.Credentials.Split(':', 2);
            using (NpgsqlCommand cmd = new NpgsqlCommand(statement, PostgreSQLSingleton.GetInstance.Connection))
            {
                cmd.Parameters.Add("username", NpgsqlDbType.Varchar).Value         = credentials[0];
                cmd.Parameters.Add("password", NpgsqlDbType.Bytea).Value           = Encoding.UTF8.GetBytes(credentials[1]);
                cmd.Parameters.Add("coins", NpgsqlDbType.Integer).Value            = client.User.Coins;
                cmd.Parameters.Add("unopenedPackages", NpgsqlDbType.Varchar).Value = JsonSerializer.Serialize(client.User.CurrentUnopenedPackages);
                cmd.Prepare();
                if (cmd.ExecuteNonQuery() != 1)
                {
                    client.User.AddCoins(price);
                    client.User.CurrentUnopenedPackages = oldUnopenedPackages;
                    return(false);
                }
            }

            return(true);
        }