using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; using DSharpPlus.CommandsNext; using DSharpPlus.CommandsNext.Attributes; using DSharpPlus.Entities; using DSharpPlus.VoiceNext; using System.Text.RegularExpressions; using System.Linq; using System.Collections.Generic; using Newtonsoft.Json; using System.Text; using DSharpPlus; using DSharpPlus.CommandsNext.Exceptions; using DSharpPlus.EventArgs; using DSharpPlus.VoiceNext.Codec; using Microsoft.Extensions.Logging; using DSharpPlus.Interactivity; using DSharpPlus.Interactivity.Extensions; namespace StarsiegeBot { [Group("ex")] [Hidden] [Description("Experimental commands. May break the bot.")] class StarsiegeCommands : BaseCommandModule { private readonly List QuizQuestions; private readonly Random rnd = new Random(); public StarsiegeCommands() { // Load all the Quick Chat texts and sound wav file info. var json = ""; using (var fs = File.OpenRead("questions.json")) using (var sr = new StreamReader(fs, new UTF8Encoding(false))) json = sr.ReadToEnd(); Dictionary tempQC = JsonConvert.DeserializeObject>(json); QuizQuestions = Enumerable.ToList(tempQC.Values); } [Command("quiz")] [Hidden] [Description("")] public async Task Quiz(CommandContext ctx) { await ctx.TriggerTypingAsync(); DiscordEmbedBuilder embed = new DiscordEmbedBuilder(); int[] ids = { rnd.Next(QuizQuestions.Count), rnd.Next(QuizQuestions.Count), rnd.Next(QuizQuestions.Count), rnd.Next(QuizQuestions.Count)}; int selection = rnd.Next(ids.Length); int mainId = ids[selection]; string[] options = { "a", "b", "c", "d" }; var correctAnswer = DiscordEmoji.FromName(ctx.Client, $":regional_indicator_{options[selection]}:"); Questions myQuestion = QuizQuestions[mainId]; embed.Description = myQuestion.Question; embed.AddField($":regional_indicator_{options[0]}:", QuizQuestions[ids[0]].Answers[rnd.Next(QuizQuestions[ids[0]].Answers.Length)], true); embed.AddField($":regional_indicator_{options[1]}:", QuizQuestions[ids[1]].Answers[rnd.Next(QuizQuestions[ids[1]].Answers.Length)], true); embed.AddField("_ _", "_ _", false); embed.AddField($":regional_indicator_{options[2]}:", QuizQuestions[ids[2]].Answers[rnd.Next(QuizQuestions[ids[2]].Answers.Length)], true); embed.AddField($":regional_indicator_{options[3]}:", QuizQuestions[ids[3]].Answers[rnd.Next(QuizQuestions[ids[3]].Answers.Length)], true); var message = await ctx.RespondAsync(embed); foreach (var item in options) { var itemEmote = DiscordEmoji.FromName(ctx.Client, $":regional_indicator_{item}:"); await message.CreateReactionAsync(itemEmote); } var result = message.WaitForReactionAsync(ctx.Message.Author,TimeSpan.FromSeconds(5d)); if (!result.Result.TimedOut) { if (result.Result.Result.Emoji == correctAnswer) await ctx.RespondAsync("**CORRECT!!**"); else await ctx.RespondAsync($"Sorry, the right answer was {correctAnswer}"); } else await ctx.RespondAsync("Sorry, time ran out!"); } [Command("test")] [Hidden] public async Task CollectionCommand(CommandContext ctx) { var message = await ctx.RespondAsync("React here!"); var reactions = await message.CollectReactionsAsync(); var strBuilder = new StringBuilder(); Dictionary winners = new Dictionary(); Dictionary losers = new Dictionary(); var correctEmote = reactions[0].Emoji; foreach (var reaction in reactions) { foreach (var person in reaction.Users) { if ( ! correctEmote.Equals(reaction.Emoji)) { losers.Add(person, true); } else { winners.Add(person, true); } } } foreach (KeyValuePair pair in winners) { if (losers.ContainsKey(pair.Key)) { winners.Remove(pair.Key); } } strBuilder.AppendLine("Winners are:"); foreach (KeyValuePair item in winners) { strBuilder.AppendLine(item.Key.Mention); } await ctx.RespondAsync(strBuilder.ToString()); } } public class Questions { [JsonProperty("question")] public string Question { get; private set; } [JsonProperty("answer")] public string[] Answers { get; private set; } [JsonProperty("points")] public int Points { get; private set; } } }