using Discord; using Discord.Commands; using Discord.WebSocket; using NerdsTeaserBot.Misc; using NerdsTeaserBot.Modules.Models; using Nerd_STF; using Nerd_STF.Lists; using Newtonsoft.Json.Linq; using System; using System.Net.Http; using System.Threading.Tasks; using static Discord.Format; using static NerdsTeaserBot.Const; namespace NerdsTeaserBot.Modules.Commands { [Name("Fun")] [Summary("Commands that can be used for fun")] public class FunModule : ModuleBase { internal static JArray jokes = null; [Command("cate")] [Summary("Finds an image of a cate on the internet and relays it back")] public async Task Cate() { HttpClient client = new(); JArray array = JArray.Parse(await client.GetStringAsync("https://api.thecatapi.com/v1/images/search?size=full")); JObject cate = (JObject)array[0]; EmbedBuilder e = new() { Footer = new() { Text = "Cate found using 'https://thecatapi.com'" }, Timestamp = DateTime.Now, Title = "Cate Detected", ImageUrl = cate["url"].ToString(), }; await ReplyAsync("", false, e.Build()); } [Command("doge")] [Summary("Finds an image of a doge on the internet and relays it back")] public async Task Doge() { HttpClient client = new(); JArray array = JArray.Parse(await client.GetStringAsync("https://api.thedogapi.com/v1/images/search?size=full")); JObject doge = (JObject)array[0]; EmbedBuilder e = new() { Footer = new() { Text = "Doge found using 'https://thedogapi.com'" }, Timestamp = DateTime.Now, Title = "Doge Detected", ImageUrl = doge["url"].ToString(), }; await ReplyAsync("", false, e.Build()); } [Command("joke")] [Summary("Gives a random joke to you. Punchline and everything")] public async Task Joke() { if (jokes == null) jokes = JArray.Parse(await new HttpClient().GetStringAsync("https://raw.githubusercontent.com/15Dkatz/official_joke_api/master/jokes/index.json")); JObject joke = (JObject)jokes[new Random().Next(0, jokes.Count)]; EmbedBuilder e = new() { Color = Colors.DefaultColor, Description = Italics(joke["setup"].ToString()) + "\n" + Spoiler(joke["punchline"].ToString()), Footer = new() { Text = "Joke found using 'https://github.com/15Dkatz/official_joke_api'" }, Timestamp = DateTime.Now, Title = "Definitely Funny Joke Incoming", }; await ReplyAsync("", false, e.Build()); } [Command("pocketsand")] [Summary("Pocketsands a user")] public async Task Pocketsand([Summary("The user to pocketsand")] IUser user) { EmbedBuilder e = new() { Color = Color.Orange, Description = Context.User.Mention + " pocketsands " + user.Mention + "! Shi-Shi Sha!", ImageUrl = "https://cdn.discordapp.com/attachments/786036378613710928/851972369941528586/pocketsand.gif", Timestamp = DateTime.Now, Title = "Pocketsanded!", }; await ReplyAsync("Hey " + user.Mention + ", you just got...", false, e.Build()); } [Command("poll")] [Summary("Creates a poll with the specified name and options")] public async Task Poll([Remainder][Summary("The options for the poll. Quote each option with ''. The first option is the title, the next are selections")] string options) { string[] letterEmotes = new[] { "🇦", "🇧", "🇨", "🇩", "🇪", "🇫", "🇬", "🇭", "🇮", "🇯", "🇰", "🇱", "🇲", "🇳", "🇴", "🇵", "🇶", "🇷", "🇸", "🇹", "🇺", "🇻", "🇼", "🇽", "🇾", "🇿" }; const string letters = "abcdefghijklmnopqrstuvwxyz"; if (!options.StartsWith("'") || !options.EndsWith("'")) { LogModule.LogMessage(LogSeverity.Error, "Options must start and end with a '"); return; } string[] splits = options.Trim()[1..(options.Length - 1)].Split("' '"); if (splits.Length == 1) { await Poll("'" + splits[0] + "' 'Yes' 'No'"); return; } if (splits.Length > 21) { LogModule.LogMessage(LogSeverity.Error, "There cannot be more than 21 options (including the title)"); return; } EmbedBuilder e = new() { Color = Colors.DefaultColor, Description = "", Timestamp = DateTime.Now, Title = ":bar_chart: " + splits[0], }; for (int i = 1; i < splits.Length; i++) e.Description += ":regional_indicator_" + letters[i - 1] + ": - " + Code(splits[i]) + "\n"; IUserMessage msg = await ReplyAsync("", false, e.Build()); for (int i = 1; i < splits.Length; i++) await msg.AddReactionAsync(new Emoji(letterEmotes[i - 1])); } [Command("pollbutton")] [Summary("Creates a poll with the specified name and options, and uses buttons to track interactions [NOTE: This is not perfectly stable]")] public async Task Pollbutton([Remainder][Summary("The options for the poll. Quote each option with ''. The first option is the title, the next are selections")] string options) { string[] letterEmotes = new[] { "🇦", "🇧", "🇨", "🇩", "🇪", "🇫", "🇬", "🇭", "🇮", "🇯", "🇰", "🇱", "🇲", "🇳", "🇴", "🇵", "🇶", "🇷", "🇸", "🇹", "🇺", "🇻", "🇼", "🇽", "🇾", "🇿" }; const string letters = "abcdefghijklmnopqrstuvwxyz"; if (!options.StartsWith("'") || !options.EndsWith("'")) { LogModule.LogMessage(LogSeverity.Error, "Options must start and end with a '"); return; } string[] splits = options.Trim()[1..(options.Length - 1)].Split("' '"); if (splits.Length == 1) { await Pollbutton("'" + splits[0] + "' 'Yes' 'No'"); return; } if (splits.Length > 26) { LogModule.LogMessage(LogSeverity.Error, "There cannot be more than 26 options (including the title)"); return; } EmbedBuilder e = new() { Color = Colors.DefaultColor, Description = "", Timestamp = DateTime.Now, Title = ":bar_chart: " + splits[0], }; for (int i = 1; i < splits.Length; i++) e.Description += ":regional_indicator_" + letters[i - 1] + ": - " + Code(splits[i]) + "\n"; int buttons = splits.Length - 1; ComponentBuilder c = new() { ActionRows = new(), }; string hash = Hashes.SHA256(splits[0] + DateTime.Now); for (int i = 1; i < splits.Length; i++) { ActionRowBuilder a = new(); int j = 0; for (_ = 0; i < splits.Length; i++) { if (j >= 5) { i--; break; } ButtonBuilder b = new() { CustomId = "poll " + i + " " + hash, Emote = new Emoji(letterEmotes[i - 1]), Label = splits[i], Style = ButtonStyle.Primary, }; a.WithComponent(b.Build()); j++; } c.ActionRows.Add(a); } IUserMessage msg = await ReplyAsync("", false, e.Build(), component: c.Build()); Data.misc.Data.polls.Add(new Poll() { hash = hash, voters = new(), }); } [Command("quote")] [Summary("Quotes a user on a message")] public async Task Quote([Summary("The user to quote")] IUser user, [Remainder][Summary("The message you want to quote")] string quote) { ComponentBuilder c = new(); ButtonBuilder b = new() { CustomId = "delete " + user.Username + "#" + user.Discriminator, Label = "Delete", Style = ButtonStyle.Danger, }; c.WithButton(b); EmbedBuilder e = new() { Color = Colors.DefaultColor, Description = Format.Quote(Italics('"' + quote + '"')) + "\n\n" + Bold("- " + user.Mention), }; e.WithFooter("The person this is targeted towards can choose to delete this message."); await ReplyAsync("", false, e.Build(), component: c.Build()); } [Command("randomfact")] [Summary("Shows a random fact found on the internet")] public async Task Randomfact() { HttpClient client = new(); JObject obj = JObject.Parse(await client.GetStringAsync("https://uselessfacts.jsph.pl/random.json?language=en")); EmbedBuilder e = new() { Color = Colors.DefaultColor, Description = Code(obj["text"].ToString().Replace("`", "'")), Timestamp = DateTime.Now, Title = "Random Fact by " + obj["source"].ToString(), Url = obj["source_url"].ToString() }; e.WithFooter("Fact found using 'https://uselessfacts.jsph.pl'"); await ReplyAsync("", false, e.Build()); } [Command("say")] [Summary("Causes the bot to say what you want it to (Deletes the original message)")] public async Task Say([Remainder][Summary("The message for the bot to say")] string message) { await Context.Message.DeleteAsync(); EmbedBuilder e = new() { Color = Colors.DefaultColor, Description = message, }; await ReplyAsync("", false, e.Build()); } [Command("sayfor")] [Summary("Causes the bot to say what you want it to, but as someone else (Deletes the original message)")] public async Task Sayfor([Summary("The user the bot pretends to be")] IUser user, [Remainder][Summary("The message for the bot to say")] string message) { await Context.Message.DeleteAsync(); ComponentBuilder c = new(); ButtonBuilder b = new() { CustomId = "delete " + user.Username + "#" + user.Discriminator, Label = "Delete", Style = ButtonStyle.Danger, }; c.WithButton(b); EmbedBuilder e = new() { Color = Colors.DefaultColor, Description = message, Title = "Message from " + user.Username + "#" + user.Discriminator, }; e.WithFooter("The person this is targeted towards can choose to delete this message."); await ReplyAsync("", false, e.Build(), component: c.Build()); } [Command("what")] [Summary("Number 7: Student watches porn, and gets naked.")] public async Task What([Remainder][Summary("the")] string msg = "Don't insult Delaware it's fire") { string response; response = msg.Trim().ToLower() switch { "ball" or "nut" or "balls" or "nuts" => "nuts.\n" + "balls, even.", "cock" or "dick" => "dick.\n" + "cock, even.", "don't insult delaware it's fire" => "when you dont change the message", "ok" => "please become funny", "penis" => "𝓹𝓮𝓷𝓲𝓼", "testicals" => "clearly somebody doesnt know how to fucking spell testicles. just use 'balls,' bitch", "testicles" => "𝓽𝓮𝓼𝓽𝓲𝓬𝓵𝓮𝓼", _ => "mmm im so hungry", }; EmbedBuilder e = new() { Color = Colors.RandColor, Description = response, Timestamp = DateTime.Now, }; await ReplyAsync("", false, e.Build()); } [Command("8ball")] [Summary("Gives a question, and the bot answers it (pretty badly)")] public async Task Ball8([Remainder][Summary("The question to ask the bot")] string question) { (string, float)[] answers = new[] { ("Definitely", 0.9f), ("Don't Ask Me", -1), ("I Don't Know", -1), ("I Don't Really Know", -1), ("Maybe", 0.5f), ("Maybe?", 0.5f), ("Never Happening", 0), ("No", 0.2f), ("Nope", 0.1f), ("Not At All", 0), ("Not Sure", -1), ("Yes", 0.8f), ("100%", 1f), }; EmbedBuilder e = new() { Color = Color.DarkGrey, Description = "", Footer = new() { Text = "Question: " + question }, Timestamp = DateTime.Now, }; for (int i = 0; i < new Random().Next(1, 4); i++) e.Description += "u"; for (int i = 0; i < new Random().Next(1, 8); i++) e.Description += "h"; for (int i = 0; i < new Random().Next(1, 6); i++) e.Description += "."; IUserMessage msg = await ReplyAsync("", false, e.Build()); await Task.Delay(new Random().Next(1500, 3000)); (string, float) response = answers[new Random().Next(0, answers.Length)]; e.Color = Colors.DefaultColor; e.Description = Bold(response.Item1) + "\n\n"; e.Title = "8Ball Question"; if (response.Item2 >= 0) { e.Description += Code((response.Item2 * 100) + "%") + "\n"; for (int i = 0; i < (int)(response.Item2 * 10); i++) e.Description += ":green_square:"; for (int i = (int)(response.Item2 * 10); i < 10; i++) e.Description += ":white_large_square:"; } else { e.Description += Code("?? %") + "\n"; for (int i = 0; i < 10; i++) e.Description += ":grey_question:"; } await msg.ModifyAsync(x => x.Embed = e.Build()); } } }