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")));
/// <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) }); } }
/// <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"); } }
/// <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); } }
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] }); }