public async Task HangmanCommand() { if (Cache.HangmanInProgress.ContainsKey(Context.Channel.Id)) { await RespondAsync(":game_die: There is a game in progress in this channel!"); return; } var logger = _loggerFactory.CreateLogger("Hangman"); Cache.HangmanInProgress[Context.Channel.Id] = null; try { var card = await YuGiOhDbService.GetRandomCardAsync(); logger.Info(card.Name); var cts = new CancellationTokenSource(); var hangmanService = new HangmanService(card.Name); var criteria = BaseCriteria .AddCriterion(new NotCommandCriteria(GuildConfig)) .AddCriterion(new NotInlineSearchCriteria()); if (!GuildConfig.HangmanAllowWords) { criteria.AddCriterion(new CharacterOnlyCriteria()); } var time = TimeSpan.FromSeconds(GuildConfig.HangmanTime); await RespondAsync("You can now type more than a letter for hangman!\n" + $"As well as change the hangman time ({GuildConfig.Prefix}hangmantime <seconds>)! Ask an admin about it!\n" + $"You may also disable the ability to input more than one letter! ({GuildConfig.Prefix}hangmanwords <true/false>)\n" + $"You have **{time.ToPrettyString()}**!\n" + hangmanService.GetCurrentDisplay()); var _ = new Timer((cancelTokenSrc) => (cancelTokenSrc as CancellationTokenSource) !.Cancel(), cts, TimeSpan.FromSeconds(GuildConfig.HangmanTime), Timeout.InfiniteTimeSpan); SocketUser user = null; do { var input = await NextMessageAsync(criteria, token : cts.Token); if (cts.IsCancellationRequested) { break; } user = input.Author; switch (hangmanService.AddGuess(input.Content)) { case GuessStatus.Duplicate: await ReplyAsync($"You already guessed `{input}`!\n" + hangmanService.GetCurrentDisplay()); break; case GuessStatus.Nonexistent: await ReplyAsync($"```fix\n{hangmanService.GetHangman()}```\n" + hangmanService.GetCurrentDisplay()); break; case GuessStatus.Accepted: await ReplyAsync(hangmanService.GetCurrentDisplay()); break; } } while (!cts.IsCancellationRequested && hangmanService.CompletionStatus == CompletionStatus.Incomplete); if (cts.IsCancellationRequested) { await ReplyAsync($"Time is up! No one won! The card is `{hangmanService.Word}`"); } else { switch (hangmanService.CompletionStatus) { case CompletionStatus.Complete: await ReplyAsync($":trophy: The winner is **{(user as SocketGuildUser)!.Nickname ?? user!.Username}**!"); break; case CompletionStatus.Hanged: await ReplyAsync($"You have been hanged! The card was `{hangmanService.Word}`."); break; } } } catch (Exception ex) { logger.Error(ex, "There was a problem with hangman"); } finally { Cache.HangmanInProgress.TryRemove(Context.Channel.Id, out _); } }