예제 #1
0
        private EventActivityBinder <GameSaga, Create> HandleCreate() =>
        When(CreateSagaReceived)
        .Then(ctx => logger.LogInformation(SagaMessage(ctx, "Saga created")))
        .ThenAsync(async ctx =>
        {
            var saga = ctx.Instance;

            var ep = await ctx.GetSendEndpoint(rmqConfig.GetEndpoint(Queues.Dictionary));
            await ep.Send(new SelectWord
            {
                CorrelationId = saga.CorrelationId,
                Language      = saga.Language
            });
        })
        .Then(ctx => logger.LogInformation(SagaMessage(ctx, "Setup game sent")));
예제 #2
0
        /// <summary>
        /// Prepare for game
        /// - Guesses
        /// - GuessedWord
        /// - WordLeft
        /// </summary>
        /// <param name="ctx"></param>
        /// <returns></returns>
        public async Task Consume(ConsumeContext <SetupProcessing> ctx)
        {
            var msg = ctx.Message;

            var ep = await ctx.GetSendEndpoint(rmqConfig.GetEndpoint(Queues.GameSaga));

            using (var scope = logger.BeginScope($"CorrelationId={msg.CorrelationId}"))
            {
                var word = msg.Word.ToLowerInvariant();

                var game = await dbContext.GameSagas.Find(x => x.CorrelationId == msg.CorrelationId)
                           .FirstAsync();

                game.Word     = word;
                game.WordLeft = word;

                game.GuessedWord = Enumerable.Range(0, word.Length)
                                   .Select(x => '-')
                                   .ToArray();

                game.Guesses = new List <char>();

                await dbContext.GameSagas.ReplaceOneAsync(x => x.CorrelationId == game.CorrelationId, game);

                logger.LogInformation("Processing setup done");

                await ep.Send(new ProcessingSetup
                {
                    CorrelationId = msg.CorrelationId,
                    GuessedWord   = string.Join("", game.GuessedWord)
                });
            }
        }
예제 #3
0
        /// <summary>
        /// Select a word for Hangman game
        /// </summary>
        public async Task Consume(ConsumeContext <SelectWord> ctx)
        {
            var msg = ctx.Message;

            using (var scope = logger.BeginScope($"CorrelationId={msg.CorrelationId}"))
            {
                var ep = await ctx.GetSendEndpoint(rmqConfig.GetEndpoint(Queues.GameSaga));

                var word = wordGenerator.Get(msg.Language);

                logger.LogInformation($"Selected word {word}");

                await ep.Send(new WordSelected
                {
                    CorrelationId = msg.CorrelationId,
                    Word          = word
                });

                logger.LogTrace("Consumed");
            }
        }
예제 #4
0
        /// <summary>
        /// Process a new turn
        /// </summary>
        public async Task Consume(ConsumeContext <ProcessTurn> ctx)
        {
            var msg = ctx.Message;

            using (var scope = logger.BeginScope($"CorrelationId={msg.CorrelationId}"))
            {
                var gameSaga = await dbContext.GameSagas
                               .Find(x => x.CorrelationId == msg.CorrelationId)
                               .FirstAsync();

                var ep = await ctx.GetSendEndpoint(rmqConfig.GetEndpoint(Queues.GameSaga));

                // If this guess is already presented - do not accept, notify saga
                if (gameSaga.Guesses.Contains(msg.Guess))
                {
                    logger.LogInformation("Duplicate");

                    await ep.Send(new TurnProcessed
                    {
                        CorrelationId = msg.CorrelationId,
                        Accepted      = false,
                        GuessedWord   = string.Join("", gameSaga.GuessedWord),
                        Guesses       = gameSaga.Guesses,
                        HasWon        = false
                    });

                    return;
                }

                // remove guessed letters
                gameSaga.WordLeft = gameSaga.WordLeft.Replace(msg.Guess.ToString(), "");

                bool hasGuessed = CheckGuess(gameSaga);

                gameSaga.Guesses.Add(msg.Guess);

                await dbContext.GameSagas
                .ReplaceOneAsync(x => x.CorrelationId == gameSaga.CorrelationId, gameSaga);

                logger.LogInformation($"HasGuessed: {hasGuessed}");

                // notify saga
                await ep.Send(new TurnProcessed
                {
                    CorrelationId = msg.CorrelationId,
                    Accepted      = true,
                    GuessedWord   = string.Join("", gameSaga.GuessedWord),
                    Guesses       = gameSaga.Guesses,
                    HasWon        = string.IsNullOrEmpty(gameSaga.WordLeft),
                    HasGuessed    = hasGuessed
                });
            }

            ///<summary>
            /// Check if letter was guessed and update GuessedWord
            ///</summary>
            bool CheckGuess(GameSaga gameSaga)
            {
                var hasGuessed = false;

                for (int i = 0; i < gameSaga.Word.Length; i++)
                {
                    if (gameSaga.Word[i] == msg.Guess)
                    {
                        gameSaga.GuessedWord[i] = msg.Guess;
                        hasGuessed = true;
                    }
                }
                return(hasGuessed);
            }
        }
예제 #5
0
        public async Task Guess(Guid id, string guess)
        {
            var ep = await busControl.GetSendEndpoint(rmqConfig.GetEndpoint(Queues.GameSaga));

            await ep.Send(new MakeTurn { CorrelationId = id, Guess = guess.ToLowerInvariant()[0] });
        }