Ejemplo n.º 1
0
        public async Task <string> CreateUserAsync(CreateUserOptions options, [FromServices] StateClient state)
        {
            string id = Guid.NewGuid().ToString();

            var user = UserActorProxy.CreateProxy(id);

            await user.SetDetailsAsync(
                new UserDetails
            {
                Email = options.Email,
                Name  = options.Name
            });

            var users = await state.GetStateAsync <HashSet <string> >("users");

            var emails = await state.GetStateAsync <Dictionary <string, string> >("emails");

            users ??= new HashSet <string>();
            emails ??= new Dictionary <string, string>();

            users.Add(id);
            emails[options.Email] = id;

            await state.SaveStateAsync("users", users);

            await state.SaveStateAsync("emails", emails);

            var deckManager = DeckManagerProxy.CreateProxy();

            await deckManager.CreateRandomDeckAsync(new CreateRandomDeckOptions { Name = "My Starter Deck", UserId = id });

            return(id);
        }
Ejemplo n.º 2
0
        public async Task <string> CreateGameAsync([FromBody] CreateGameOptions options, [FromServices] StateClient state)
        {
            // TODO: Verify user owns the deck.

            string id = Guid.NewGuid().ToString();

            var deck = DeckActorProxy.CreateProxy(options.DeckId);

            var deckDetails = await deck.GetDetailsAsync();

            var cards = await Task.WhenAll(
                deckDetails.Cards.Select(
                    async deckCard =>
            {
                var card = CardActorProxy.CreateProxy(deckCard.CardId);

                var cardDetails = await card.GetDetailsAsync();

                return(new GameCard
                {
                    CardId = deckCard.CardId,
                    Value = cardDetails.Value
                });
            }));

            var game = GameActorProxy.CreateProxy(id);

            await game.SetDetailsAsync(
                new GameDetails
            {
                Players =
                    new[]
                {
                    new GamePlayer
                    {
                        Cards  = cards,
                        UserId = options.UserId
                    },
                    CreateComputerPlayer(cards.Length)
                }
            });

            var games = await state.GetStateAsync <HashSet <string> >("games");

            games ??= new HashSet <string>();

            games.Add(id);

            await state.SaveStateAsync("games", games);

            var user = UserActorProxy.CreateProxy(options.UserId);

            await user.AddGameAsync(id);

            return(id);
        }
Ejemplo n.º 3
0
        public async Task <string> CreateCardAsync([FromBody] CardDetails details, [FromServices] StateClient state)
        {
            string id = Guid.NewGuid().ToString();

            await this.SetCardAsync(id, details, state);

            var user = UserActorProxy.CreateProxy(details.UserId);

            await user.AddCardAsync(id);

            return(id);
        }
Ejemplo n.º 4
0
        public async Task <string> CreateRandomDeckAsync([FromBody] CreateRandomDeckOptions options, [FromServices] StateClient state)
        {
            if (options.UserId == null)
            {
                throw new ArgumentException("UserId should be non-null.", nameof(options));
            }

            string id = Guid.NewGuid().ToString();

            int count = options.Count ?? 10;

            var details = new DeckDetails
            {
                Cards  = new DeckCard[count],
                Name   = options.Name,
                UserId = options.UserId
            };

            // TODO: Choose an appropriate seed.
            var random = new Random();

            using var cardManager = CardManagerProxy.CreateProxy();

            for (int i = 0; i < count; i++)
            {
                // TODO: Card manager should manage generation of IDs.
                int cardValue = random.Next(1, 100 + 1);

                string cardId = await cardManager.CreateCardAsync(
                    new CardDetails
                {
                    UserId = options.UserId,
                    Value  = cardValue
                });

                details.Cards[i] = new DeckCard {
                    CardId = cardId
                };
            }

            await this.SetDeckAsync(id, details, state);

            var user = UserActorProxy.CreateProxy(details.UserId);

            await user.AddDeckAsync(id);

            return(id);
        }