private async Task <DialogTurnResult> Ask(WaterfallStepContext stepContext, CancellationToken cancellationToken) { var scenarioDetails = (ScenarioDetails)stepContext.Options; #pragma warning disable 4014 _userService.InsertOrMergeAsync(new User(stepContext.Context.Activity)); #pragma warning restore 4014 var userId = new UserId(stepContext.Context.Activity); if (scenarioDetails == null) { // либо первый раз запускаем, либо надо дать пользователю шанс выбрать сценарий if (scenarioDetails == null) { return(await stepContext.ReplaceDialogAsync(nameof(ScenarioListDialog), userId, cancellationToken)); } //scenarioDetails = _scenarioService.GetLastScenarioDetailsExceptGameOver(userId, null); // этот фин ушами чтобы пробросить scenarioDetails - вызывается один раз, когда происходит инициализация return(await stepContext.ReplaceDialogAsync(nameof(ScenarioDialog), scenarioDetails, cancellationToken)); } scenarioDetails.UserId = userId; var puzzle = _scenarioService.GetNextPuzzle(userId, scenarioDetails.ScenarioId, scenarioDetails.LastPuzzleDetails?.PuzzleId, scenarioDetails.LastPuzzleDetails?.ActualAnswer); var puzzleDetails = new PuzzleDetails(puzzle); // грязный хак с пробрасыванием времени, которое проставляется при вопросах с задержкой if (scenarioDetails.LastPuzzleDetails != null && puzzleDetails.PuzzleId == scenarioDetails.LastPuzzleDetails.PuzzleId) { // такой кейс возникает, когда мы пробрасываем PuzzleDetails из WaitingDialog в методе Check // и потом его заменем парой строчек выше puzzleDetails.QuestionAskedAt = scenarioDetails.LastPuzzleDetails.QuestionAskedAt; puzzleDetails.AnswerTimeNoLessThan = scenarioDetails.LastPuzzleDetails.AnswerTimeNoLessThan; } if (puzzleDetails.IsLastPuzzle) { await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text($"{puzzleDetails.Question}") }, cancellationToken); return(await stepContext.EndDialogAsync(puzzleDetails, cancellationToken)); } return(await stepContext.BeginDialogAsync( puzzleDetails.PuzzleType.ToString(), puzzleDetails, cancellationToken)); }
public void VanshTest(string input, string expectedOutput) { var actualOutput = PuzzleDetails.VanishAnswer(input); Assert.AreEqual(expectedOutput, actualOutput); }