Beispiel #1
0
        // GET to /deck => show current deck
        protected override Response GetHandler(Request request)
        {
            if (request.Authorization.IsNullOrWhiteSpace())
            {
                return(ResponseManager.BadRequest("Authoriazion Header required"));
            }

            if (!Authorized(request.Authorization))
            {
                return(ResponseManager.Unauthorized("check your username and password"));
            }

            string username = Session.GetUsername(ExtractAuthorizationToken(request.Authorization));

            var deckRepo = new DecksRepository();

            if (deckRepo.Empty(username))
            {
                return(ResponseManager.OK($"the deck for user {username} is empty"));
            }

            CardData[] cards = deckRepo.GetDeck(username);
            string     deck  = JsonSerializer.Serialize <CardData[]>(cards);

            return(ResponseManager.OK(deck));
        }
Beispiel #2
0
        // PUT to /deck => configure deck
        protected override Response PutHandler(Request request)
        {
            if (request.Authorization.IsNullOrWhiteSpace())
            {
                return(ResponseManager.BadRequest("Authoriazion Header required"));
            }

            if (request.Payload.IsNullOrWhiteSpace())
            {
                return(ResponseManager.BadRequest("No Payload"));
            }

            if (!Authorized(request.Authorization))
            {
                return(ResponseManager.Unauthorized("check your username and password"));
            }

            string username = Session.GetUsername(ExtractAuthorizationToken(request.Authorization));
            var    cards    = JsonSerializer.Deserialize <List <string> >(request.Payload);

            // easy solution - accept only four cards. what if user wants to change only one card?
            // consider making this dynamic
            if (cards.Count != Config.DECKSIZE)
            {
                return(ResponseManager.BadRequest($"Deck size must be {Config.DECKSIZE}"));
            }

            var decks = new DecksRepository();

            decks.UpdateDeck(username, cards.ToArray());  // TEST THIS

            return(ResponseManager.OK("deck updated successfully"));
        }
Beispiel #3
0
        // post to battles => requst for a battle
        protected override Response PostHandler(Request request)
        {
            if (request.Authorization.IsNullOrWhiteSpace())
            {
                return(ResponseManager.BadRequest("Authoriazion Header required"));
            }

            if (!Authorized(request.Authorization))
            {
                return(ResponseManager.Unauthorized("This action requires authorization"));
            }

            string username = Session.GetUsername(ExtractAuthorizationToken(request.Authorization));
            Player player   = new Player(username);

            var decksRepo = new DecksRepository();

            if (decksRepo.Empty(username))
            {
                return(ResponseManager.BadRequest($"The Deck for user {username} is empty, Configure your deck before entering a battle"));
            }

            var deck = decksRepo.GetDeck(username);

            player.MakeDeck(deck);

            if (GameHandler.Instance.Enqueued(username))
            {
                return(ResponseManager.BadRequest($"Player {username} is allready enqueued for a battle! You can't fight yourself"));
            }

            var resp = ResponseManager.Created();

            //  https://www.c-sharpcorner.com/UploadFile/1d42da/synchronization-events-and-wait-handles-in-C-Sharp/
            //  https://docs.microsoft.com/en-us/dotnet/api/system.threading.manualresetevent?view=net-5.0

            GameHandler.Instance.BattleEnded += (object sender, BattleEndedEventArgs args) =>
            {
                resp.AddPayload(args.BattleLog);
                GameHandler.Instance.ResetEvent.Set();      // send the signal, all waiting threads will start running (open the door)
                GameHandler.Instance.ResetEvent.Reset();    // reset the flag, new threads can wait (close the door)
            };

            GameHandler.Instance.EnqueuePlayer(player);
            GameHandler.Instance.ResetEvent.WaitOne(); // block thread untill it gets a signal

            return(resp);
        }
Beispiel #4
0
        private Response CreateTradeDeal(Request request)
        {
            TradeDeal deal     = JsonSerializer.Deserialize <TradeDeal>(request.Payload);
            string    username = Session.GetUsername(ExtractAuthorizationToken(request.Authorization));

            CardsRepository      cardsRepo = new CardsRepository();
            UsersRepository      usersRepo = new UsersRepository();
            TradeDealsRepository dealer    = new TradeDealsRepository();
            DecksRepository      decksRepo = new DecksRepository();

            if (!deal.Validate())
            {
                return(ResponseManager.BadRequest("invalid format for trade deal json object"));
            }

            if (dealer.DealExists(deal.Id))
            {
                return(ResponseManager.BadRequest($"trade deal with id {deal.Id} allready exists"));
            }

            if (username.IsNull())
            {
                return(ResponseManager.Unauthorized("No session found"));
            }

            if (!cardsRepo.CardExists(deal.CardId))
            {
                return(ResponseManager.NotFound($"card {deal.CardId} doesn't exist"));
            }

            if (!cardsRepo.InStack(username, deal.CardId))
            {
                return(ResponseManager.NotFound($"you don't own card {deal.CardId}"));
            }

            if (decksRepo.HasCardInDeck(username, deal.CardId))
            {
                return(ResponseManager.BadRequest($"card {deal.CardId} is in the deck for {username}. You can't trade cards in the deck"));
            }

            deal.OwnerId = usersRepo.GetUserID(username);
            dealer.AddDeal(deal);

            return(ResponseManager.Created($"trade deal {deal.Id} created"));
        }