A lot of work on searches module done
This commit is contained in:
		| @@ -133,13 +133,6 @@ namespace NadekoBot.Classes | ||||
|             token = JObject.Parse(content)["access_token"].ToString(); | ||||
|         } | ||||
|  | ||||
|         public static async Task<bool> ValidateQuery(Discord.Channel ch, string query) | ||||
|         { | ||||
|             if (!string.IsNullOrEmpty(query.Trim())) return true; | ||||
|             await ch.Send("Please specify search parameters.").ConfigureAwait(false); | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         public static async Task<string> FindYoutubeUrlByKeywords(string keywords) | ||||
|         { | ||||
|             if (string.IsNullOrWhiteSpace(keywords)) | ||||
| @@ -249,10 +242,7 @@ namespace NadekoBot.Classes | ||||
|  | ||||
|             return toReturn; | ||||
|         } | ||||
|  | ||||
|  | ||||
|          | ||||
|  | ||||
|         public static async Task<string> ShortenUrl(string url) | ||||
|         { | ||||
|             if (string.IsNullOrWhiteSpace(NadekoBot.Creds.GoogleAPIKey)) return url; | ||||
|   | ||||
| @@ -190,22 +190,6 @@ namespace NadekoBot.Modules.NSFW | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public static async Task<string> GetSafebooruImageLink(string tag) | ||||
|         { | ||||
|             var rng = new Random(); | ||||
|             var url = | ||||
|             $"http://safebooru.org/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 var webpage = await http.GetStringAsync(url).ConfigureAwait(false); | ||||
|                 var matches = Regex.Matches(webpage, "file_url=\"(?<url>.*?)\""); | ||||
|                 if (matches.Count == 0) | ||||
|                     return null; | ||||
|                 var match = matches[rng.Next(0, matches.Count)]; | ||||
|                 return matches[rng.Next(0, matches.Count)].Groups["url"].Value; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public static async Task<string> GetRule34ImageLink(string tag) | ||||
|         { | ||||
|             var rng = new Random(); | ||||
|   | ||||
| @@ -92,7 +92,7 @@ namespace NadekoBot.Modules.Searches.Commands | ||||
|                                   await e.Channel.SendFile("champ.png", champ.ImageStream).ConfigureAwait(false); | ||||
|                                   return; | ||||
|                               } | ||||
|                           var allData = JArray.Parse(await Classes.SearchHelper.GetResponseStringAsync($"http://api.champion.gg/champion/{name}?api_key={NadekoBot.Creds.LOLAPIKey}").ConfigureAwait(false)); | ||||
|                           var allData = JArray.Parse(await Classes.http.GetStringAsync($"http://api.champion.gg/champion/{name}?api_key={NadekoBot.Creds.LOLAPIKey}").ConfigureAwait(false)); | ||||
|                           JToken data = null; | ||||
|                           if (role != null) | ||||
|                           { | ||||
| @@ -132,7 +132,7 @@ namespace NadekoBot.Modules.Searches.Commands | ||||
|                               if (roles[i] == role) | ||||
|                                   roles[i] = ">" + roles[i] + "<"; | ||||
|                           } | ||||
|                           var general = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.champion.gg/stats/" + | ||||
|                           var general = JArray.Parse(await http.GetStringAsync($"http://api.champion.gg/stats/" + | ||||
|                                                                                                $"champs/{name}?api_key={NadekoBot.Creds.LOLAPIKey}") | ||||
|                                                                                                 .ConfigureAwait(false)) | ||||
|                                               .FirstOrDefault(jt => jt["role"].ToString() == role)?["general"]; | ||||
| @@ -22,7 +22,7 @@ namespace NadekoBot.Modules.Searches.Commands | ||||
|                 { | ||||
|                     int i = 0; | ||||
|                     await channel.SendMessageAsync("`List Of Commands:`\n```xl\n" + | ||||
|                                 string.Join("\n", JsonConvert.DeserializeObject<Dictionary<string, string>>(await SearchHelper.GetResponseStringAsync("http://memegen.link/templates/")) | ||||
|                                 string.Join("\n", JsonConvert.DeserializeObject<Dictionary<string, string>>(await http.GetStringAsync("http://memegen.link/templates/")) | ||||
|                                       .Select(kvp => Path.GetFileName(kvp.Value)) | ||||
|                                       .GroupBy(item => (i++) / 4) | ||||
|                                       .Select(ig => string.Concat(ig.Select(el => $"{el,-17}")))) | ||||
| @@ -73,7 +73,7 @@ namespace NadekoBot.Modules.Searches.Commands | ||||
|                     { | ||||
|                         var mapId = ResolveMap(e.GetArg("map")); | ||||
|                         var reqString = $"https://osu.ppy.sh/api/get_beatmaps?k={NadekoBot.Creds.OsuAPIKey}&{mapId}"; | ||||
|                         var obj = JArray.Parse(await SearchHelper.GetResponseStringAsync(reqString).ConfigureAwait(false))[0]; | ||||
|                         var obj = JArray.Parse(await http.GetStringAsync(reqString).ConfigureAwait(false))[0]; | ||||
|                         var sb = new System.Text.StringBuilder(); | ||||
|                         var starRating = Math.Round(Double.Parse($"{obj["difficultyrating"]}"), 2); | ||||
|                         var time = TimeSpan.FromSeconds(Double.Parse($"{obj["total_length"]}")).ToString(@"mm\:ss"); | ||||
| @@ -114,12 +114,12 @@ namespace NadekoBot.Modules.Searches.Commands | ||||
|                         } | ||||
| 
 | ||||
|                         var reqString = $"https://osu.ppy.sh/api/get_user_best?k={NadekoBot.Creds.OsuAPIKey}&u={Uri.EscapeDataString(e.GetArg("usr"))}&type=string&limit=5&m={m}"; | ||||
|                         var obj = JArray.Parse(await SearchHelper.GetResponseStringAsync(reqString).ConfigureAwait(false)); | ||||
|                         var obj = JArray.Parse(await http.GetStringAsync(reqString).ConfigureAwait(false)); | ||||
|                         var sb = new System.Text.StringBuilder($"`Top 5 plays for {e.GetArg("usr")}:`\n```xl" + Environment.NewLine); | ||||
|                         foreach (var item in obj) | ||||
|                         { | ||||
|                             var mapReqString = $"https://osu.ppy.sh/api/get_beatmaps?k={NadekoBot.Creds.OsuAPIKey}&b={item["beatmap_id"]}"; | ||||
|                             var map = JArray.Parse(await SearchHelper.GetResponseStringAsync(mapReqString).ConfigureAwait(false))[0]; | ||||
|                             var map = JArray.Parse(await http.GetStringAsync(mapReqString).ConfigureAwait(false))[0]; | ||||
|                             var pp = Math.Round(Double.Parse($"{item["pp"]}"), 2); | ||||
|                             var acc = CalculateAcc(item, m); | ||||
|                             var mods = ResolveMods(Int32.Parse($"{item["enabled_mods"]}")); | ||||
| @@ -85,7 +85,7 @@ namespace NadekoBot.Modules.Searches.Commands | ||||
|                     var hitboxUrl = $"https://api.hitbox.tv/media/status/{stream.Username}"; | ||||
|                     if (checkCache && cachedStatuses.TryGetValue(hitboxUrl, out result)) | ||||
|                         return result; | ||||
|                     response = await SearchHelper.GetResponseStringAsync(hitboxUrl).ConfigureAwait(false); | ||||
|                     response = await http.GetStringAsync(hitboxUrl).ConfigureAwait(false); | ||||
|                     data = JObject.Parse(response); | ||||
|                     isLive = data["media_is_live"].ToString() == "1"; | ||||
|                     result = new Tuple<bool, string>(isLive, data["media_views"].ToString()); | ||||
| @@ -95,7 +95,7 @@ namespace NadekoBot.Modules.Searches.Commands | ||||
|                     var twitchUrl = $"https://api.twitch.tv/kraken/streams/{Uri.EscapeUriString(stream.Username)}"; | ||||
|                     if (checkCache && cachedStatuses.TryGetValue(twitchUrl, out result)) | ||||
|                         return result; | ||||
|                     response = await SearchHelper.GetResponseStringAsync(twitchUrl).ConfigureAwait(false); | ||||
|                     response = await http.GetStringAsync(twitchUrl).ConfigureAwait(false); | ||||
|                     data = JObject.Parse(response); | ||||
|                     isLive = !string.IsNullOrWhiteSpace(data["stream"].ToString()); | ||||
|                     result = new Tuple<bool, string>(isLive, isLive ? data["stream"]["viewers"].ToString() : "0"); | ||||
| @@ -105,7 +105,7 @@ namespace NadekoBot.Modules.Searches.Commands | ||||
|                     var beamUrl = $"https://beam.pro/api/v1/channels/{stream.Username}"; | ||||
|                     if (checkCache && cachedStatuses.TryGetValue(beamUrl, out result)) | ||||
|                         return result; | ||||
|                     response = await SearchHelper.GetResponseStringAsync(beamUrl).ConfigureAwait(false); | ||||
|                     response = await http.GetStringAsync(beamUrl).ConfigureAwait(false); | ||||
|                     data = JObject.Parse(response); | ||||
|                     isLive = data["online"].ToObject<bool>() == true; | ||||
|                     result = new Tuple<bool, string>(isLive, data["viewersCurrent"].ToString()); | ||||
							
								
								
									
										584
									
								
								src/NadekoBot/Modules/Searches/SearchesModule.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										584
									
								
								src/NadekoBot/Modules/Searches/SearchesModule.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,584 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Modules.Searches.Commands.IMDB; | ||||
| using Newtonsoft.Json; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using NadekoBot.Services; | ||||
| using System.Threading.Tasks; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using Discord.API; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| namespace NadekoBot.Modules.Searches | ||||
| { | ||||
|     [Module("~", AppendSpace = false)] | ||||
|     public class SearchesModule : DiscordModule | ||||
|     { | ||||
|         private readonly Random rng; | ||||
|  | ||||
|         public SearchesModule(ILocalization loc, CommandService cmds, IBotConfiguration config, IDiscordClient client) : base(loc, cmds, config, client) | ||||
|         { | ||||
|             rng = new Random(); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Weather(IMessage imsg, string city, string country) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             city = city.Replace(" ", ""); | ||||
|             country = city.Replace(" ", ""); | ||||
|             string response; | ||||
|             using (var http = new HttpClient()) | ||||
|                 response = await http.GetStringAsync($"http://api.lawlypopzz.xyz/nadekobot/weather/?city={city}&country={country}").ConfigureAwait(false); | ||||
|  | ||||
|             var obj = JObject.Parse(response)["weather"]; | ||||
|  | ||||
|             await imsg.Channel.SendMessageAsync( | ||||
| $@"🌍 **Weather for** 【{obj["target"]}】 | ||||
| 📏 **Lat,Long:** ({obj["latitude"]}, {obj["longitude"]}) ☁ **Condition:** {obj["condition"]} | ||||
| 😓 **Humidity:** {obj["humidity"]}% 💨 **Wind Speed:** {obj["windspeedk"]}km/h / {obj["windspeedm"]}mph  | ||||
| 🔆 **Temperature:** {obj["centigrade"]}°C / {obj["fahrenheit"]}°F 🔆 **Feels like:** {obj["feelscentigrade"]}°C / {obj["feelsfahrenheit"]}°F | ||||
| 🌄 **Sunrise:** {obj["sunrise"]} 🌇 **Sunset:** {obj["sunset"]}").ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Youtube(IMessage imsg, [Remainder] string query) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             if (!(await ValidateQuery(imsg.Channel as ITextChannel, query).ConfigureAwait(false))) return; | ||||
|             var link = await FindYoutubeUrlByKeywords(query).ConfigureAwait(false); | ||||
|             if (string.IsNullOrWhiteSpace(link)) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("No results found for that query."); | ||||
|                 return; | ||||
|             } | ||||
|             var shortUrl = await link.ShortenUrl().ConfigureAwait(false); | ||||
|             await imsg.Channel.SendMessageAsync(shortUrl).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Anime(IMessage imsg, [Remainder] string query) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             if (!(await ValidateQuery(imsg.Channel as ITextChannel, query).ConfigureAwait(false))) return; | ||||
|             string result; | ||||
|             try | ||||
|             { | ||||
|                 result = (await GetAnimeData(query).ConfigureAwait(false)).ToString(); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Failed to find that anime.").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             await imsg.Channel.SendMessageAsync(result.ToString()).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|  | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Manga(IMessage imsg, [Remainder] string query) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             if (!(await ValidateQuery(imsg.Channel as ITextChannel, query).ConfigureAwait(false))) return; | ||||
|             string result; | ||||
|             try | ||||
|             { | ||||
|                 result = (await GetMangaData(query).ConfigureAwait(false)).ToString(); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Failed to find that manga.").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|             await imsg.Channel.SendMessageAsync(result).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Imdb(IMessage imsg, [Remainder] string query) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             if (!(await ValidateQuery(imsg.Channel as ITextChannel, query).ConfigureAwait(false))) return; | ||||
|             await e.Channel.SendIsTyping().ConfigureAwait(false); | ||||
|             string result; | ||||
|             try | ||||
|             { | ||||
|                 var movie = ImdbScraper.ImdbScrape(query, true); | ||||
|                 if (movie.Status) result = movie.ToString(); | ||||
|                 else result = "Failed to find that movie."; | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Failed to find that movie.").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             await imsg.Channel.SendMessageAsync(result.ToString()).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task RandomCat(IMessage imsg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync(JObject.Parse( | ||||
|                                 await http.GetStringAsync("http://www.random.cat/meow").ConfigureAwait(false))["file"].ToString()) | ||||
|                                     .ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task RandomDog(IMessage imsg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("http://random.dog/" + await http.GetStringAsync("http://random.dog/woof").ConfigureAwait(false)).ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task I(IMessage imsg, [Remainder] string query) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             if (string.IsNullOrWhiteSpace(query)) | ||||
|                 return; | ||||
|             try | ||||
|             { | ||||
|                 using (var http = new HttpClient()) | ||||
|                 { | ||||
|                     var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(query)}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&fields=items%2Flink&key={NadekoBot.Credentials.GoogleApiKey}"; | ||||
|                     var obj = JObject.Parse(await http.GetStringAsync(reqString).ConfigureAwait(false)); | ||||
|                     await imsg.Channel.SendMessageAsync(obj["items"][0]["link"].ToString()).ConfigureAwait(false); | ||||
|                 } | ||||
|             } | ||||
|             catch (HttpRequestException exception) | ||||
|             { | ||||
|                 if (exception.Message.Contains("403 (Forbidden)")) | ||||
|                 { | ||||
|                     await imsg.Channel.SendMessageAsync("Daily limit reached!"); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     await imsg.Channel.SendMessageAsync("Something went wrong."); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Ir(IMessage imsg, [Remainder] string query) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             if (string.IsNullOrWhiteSpace(query)) | ||||
|                 return; | ||||
|             try | ||||
|             { | ||||
|                 using (var http = new HttpClient()) | ||||
|                 { | ||||
|                     var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(query)}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&start={ rng.Next(1, 50) }&fields=items%2Flink&key={NadekoBot.Credentials.GoogleApiKey}"; | ||||
|                     var obj = JObject.Parse(await http.GetStringAsync(reqString).ConfigureAwait(false)); | ||||
|                     var items = obj["items"] as JArray; | ||||
|                     await imsg.Channel.SendMessageAsync(items[0]["link"].ToString()).ConfigureAwait(false); | ||||
|                 } | ||||
|             } | ||||
|             catch (HttpRequestException exception) | ||||
|             { | ||||
|                 if (exception.Message.Contains("403 (Forbidden)")) | ||||
|                 { | ||||
|                     await imsg.Channel.SendMessageAsync("Daily limit reached!"); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     await imsg.Channel.SendMessageAsync("Something went wrong."); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Lmgtfy(IMessage imsg, [Remainder] string ffs) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|  | ||||
|             if (string.IsNullOrWhiteSpace(ffs)) | ||||
|                 return; | ||||
|  | ||||
|             await imsg.Channel.SendMessageAsync(await $"<http://lmgtfy.com/?q={ Uri.EscapeUriString(ffs) }>".ShortenUrl()) | ||||
|                            .ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Google(IMessage imsg, [Remainder] string terms) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|  | ||||
|             terms = terms?.Trim(); | ||||
|             if (string.IsNullOrWhiteSpace(terms)) | ||||
|                 return; | ||||
|             await imsg.Channel.SendMessageAsync($"https://google.com/search?q={ HttpUtility.UrlEncode(terms).Replace(' ', '+') }") | ||||
|                            .ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Hearthstone(IMessage imsg, [Remainder] string name) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             var arg = e.GetArg("name"); | ||||
|             if (string.IsNullOrWhiteSpace(arg)) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("💢 Please enter a card name to search for.").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|             await imsg.Channel.TriggerTypingAsync().ConfigureAwait(false); | ||||
|             string response = ""; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 http.DefaultRequestHeaders.Clear(); | ||||
|                 http.DefaultRequestHeaders.Add("X-Mashape-Key", NadekoBot.Credentials.MashapeKey); | ||||
|                 response = await http.GetStringAsync($"https://omgvamp-hearthstone-v1.p.mashape.com/cards/search/{Uri.EscapeUriString(arg)}", headers) | ||||
|                                         .ConfigureAwait(false); | ||||
|                 try | ||||
|                 { | ||||
|                     var items = JArray.Parse(response); | ||||
|                     var images = new List<Image>(); | ||||
|                     if (items == null) | ||||
|                         throw new KeyNotFoundException("Cannot find a card by that name"); | ||||
|                     var cnt = 0; | ||||
|                     items.Shuffle(); | ||||
|                     foreach (var item in items.TakeWhile(item => cnt++ < 4).Where(item => item.HasValues && item["img"] != null)) | ||||
|                     { | ||||
|                         images.Add( | ||||
|                             Image.FromStream(await http.GetStreamAsync(item["img"].ToString()).ConfigureAwait(false))); | ||||
|                     } | ||||
|                     if (items.Count > 4) | ||||
|                     { | ||||
|                         await imsg.Channel.SendMessageAsync("⚠ Found over 4 images. Showing random 4.").ConfigureAwait(false); | ||||
|                     } | ||||
|                     await e.Channel.SendFile(arg + ".png", (await images.MergeAsync()).ToStream(System.Drawing.Imaging.ImageFormat.Png)) | ||||
|                                    .ConfigureAwait(false); | ||||
|                 } | ||||
|                 catch (Exception ex) | ||||
|                 { | ||||
|                     await imsg.Channel.SendMessageAsync($"💢 Error {ex.Message}").ConfigureAwait(false); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task UrbanDictionary(IMessage imsg, [Remainder] string query) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             var arg = query; | ||||
|             if (string.IsNullOrWhiteSpace(arg)) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("💢 Please enter a search term.").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|             await imsg.Channel.TriggerTypingAsync().ConfigureAwait(false); | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 http.DefaultRequestHeaders.Clear(); | ||||
|                 http.DefaultRequestHeaders.Add("X-Mashape-Key", NadekoBot.Credentials.MashapeKey); | ||||
|                 var res = await http.GetStringAsync($"https://mashape-community-urban-dictionary.p.mashape.com/define?term={Uri.EscapeUriString(arg)}", headers).ConfigureAwait(false); | ||||
|                 try | ||||
|                 { | ||||
|                     var items = JObject.Parse(res); | ||||
|                     var sb = new System.Text.StringBuilder(); | ||||
|                     sb.AppendLine($"`Term:` {items["list"][0]["word"].ToString()}"); | ||||
|                     sb.AppendLine($"`Definition:` {items["list"][0]["definition"].ToString()}"); | ||||
|                     sb.Append($"`Link:` <{await items["list"][0]["permalink"].ToString().ShortenUrl().ConfigureAwait(false)}>"); | ||||
|                     await imsg.Channel.SendMessageAsync(sb.ToString()); | ||||
|                 } | ||||
|                 catch | ||||
|                 { | ||||
|                     await imsg.Channel.SendMessageAsync("💢 Failed finding a definition for that term.").ConfigureAwait(false); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Hashtag(IMessage imsg, [Remainder] string query) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             var arg = query; | ||||
|             if (string.IsNullOrWhiteSpace(arg)) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("💢 Please enter a search term.").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|             await imsg.Channel.TriggerTypingAsync().ConfigureAwait(false); | ||||
|             string res = ""; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 http.DefaultRequestHeaders.Clear(); | ||||
|                 http.DefaultRequestHeaders.Add("X-Mashape-Key", NadekoBot.Credentials.MashapeKey); | ||||
|                 res = await http.GetStringAsync($"https://tagdef.p.mashape.com/one.{Uri.EscapeUriString(arg)}.json").ConfigureAwait(false); | ||||
|             } | ||||
|                  | ||||
|             try | ||||
|             { | ||||
|                 var items = JObject.Parse(res); | ||||
|                 var str = $@"`Hashtag:` {items["defs"]["def"]["hashtag"].ToString()} | ||||
| `Definition:` {items["defs"]["def"]["text"].ToString()} | ||||
| `Link:` <{await items["defs"]["def"]["uri"].ToString().ShortenUrl().ConfigureAwait(false)}>"); | ||||
|                 await imsg.Channel.SendMessageAsync(str); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("💢 Failed finidng a definition for that tag.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Quote(IMessage imsg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             var quote = NadekoBot.Config.Quotes[rng.Next(0, NadekoBot.Config.Quotes.Count)].ToString(); | ||||
|             await imsg.Channel.SendMessageAsync(quote).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Catfact(IMessage imsg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 var response = await http.GetStringAsync("http://catfacts-api.appspot.com/api/facts").ConfigureAwait(false); | ||||
|                 if (response == null) | ||||
|                     return; | ||||
|                 await imsg.Channel.SendMessageAsync($"🐈 `{JObject.Parse(response)["facts"][0].ToString()}`").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Yomama(IMessage imsg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 var response = await http.GetStringAsync("http://api.yomomma.info/").ConfigureAwait(false); | ||||
|                 await imsg.Channel.SendMessageAsync("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Randjoke(IMessage imsg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 var response = await http.GetStringAsync("http://tambal.azurewebsites.net/joke/random").ConfigureAwait(false); | ||||
|                 await imsg.Channel.SendMessageAsync("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task ChuckNorris(IMessage imsg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 var response = await http.GetStringAsync("http://tambal.azurewebsites.net/joke/random").ConfigureAwait(false); | ||||
|                 await imsg.Channel.SendMessageAsync("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task MagicItem(IMessage imsg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             var magicItems = JsonConvert.DeserializeObject<List<MagicItem>>(File.ReadAllText("data/magicitems.json")); | ||||
|             var item = magicItems[rng.Next(0, magicItems.Count)].ToString(); | ||||
|  | ||||
|             await imsg.Channel.SendMessageAsync(item).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Revav(IMessage imsg, [Remainder] string arg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             var usrStr = arg?.Trim().ToUpperInvariant(); | ||||
|  | ||||
|             if (string.IsNullOrWhiteSpace(usrStr)) | ||||
|                 return; | ||||
|  | ||||
|             var usr = (await channel.Guild.GetUsersAsync()).Where(u=>u.Username.ToUpperInvariant() == usrStr).FirstOrDefault(); | ||||
|  | ||||
|             if (usr == null || string.IsNullOrWhiteSpace(usr.AvatarUrl)) | ||||
|                 return; | ||||
|             await imsg.Channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}").ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Revimg(IMessage imsg, [Remainder] string imageLink) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             imageLink = imageLink?.Trim() ?? ""; | ||||
|  | ||||
|             if (string.IsNullOrWhiteSpace(imageLink)) | ||||
|                 return; | ||||
|             await imsg.Channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={imageLink}").ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Safebooru(IMessage imsg, [Remainder] string tag) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             tag = tag?.Trim() ?? ""; | ||||
|             var link = await GetSafebooruImageLink(tag).ConfigureAwait(false); | ||||
|             if (link == null) | ||||
|                 await imsg.Channel.SendMessageAsync("`No results.`"); | ||||
|             else | ||||
|                 await imsg.Channel.SendMessageAsync(link).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Wiki(IMessage imsg, [Remainder] string query) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             query = query?.Trim(); | ||||
|             if (string.IsNullOrWhiteSpace(query)) | ||||
|                 return; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 var result = await http.GetStringAsync("https://en.wikipedia.org//w/api.php?action=query&format=json&prop=info&redirects=1&formatversion=2&inprop=url&titles=" + Uri.EscapeDataString(query)); | ||||
|                 var data = JsonConvert.DeserializeObject<WikipediaApiModel>(result); | ||||
|                 if (data.Query.Pages[0].Missing) | ||||
|                     await imsg.Channel.SendMessageAsync("`That page could not be found.`"); | ||||
|                 else | ||||
|                     await imsg.Channel.SendMessageAsync(data.Query.Pages[0].FullUrl); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Clr(IMessage imsg, [Remainder] string color) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             var arg1 = e.GetArg("color")?.Trim()?.Replace("#", ""); | ||||
|             if (string.IsNullOrWhiteSpace(arg1)) | ||||
|                 return; | ||||
|             var img = new Bitmap(50, 50); | ||||
|  | ||||
|             var red = Convert.ToInt32(arg1.Substring(0, 2), 16); | ||||
|             var green = Convert.ToInt32(arg1.Substring(2, 2), 16); | ||||
|             var blue = Convert.ToInt32(arg1.Substring(4, 2), 16); | ||||
|             var brush = new SolidBrush(System.Drawing.Color.FromArgb(red, green, blue)); | ||||
|  | ||||
|             using (Graphics g = Graphics.FromImage(img)) | ||||
|             { | ||||
|                 g.FillRectangle(brush, 0, 0, 50, 50); | ||||
|                 g.Flush(); | ||||
|             } | ||||
|  | ||||
|             await imsg.Channel.SendFileAsync("arg1.png", img.ToStream()); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Videocall(IMessage imsg, [Remainder] string arg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 var allUsrs = imsg.MentionedUsers.Append(imsg.Author); | ||||
|                 var allUsrsArray = allUsrs.ToArray(); | ||||
|                 var str = allUsrsArray.Aggregate("http://appear.in/", (current, usr) => current + Uri.EscapeUriString(usr.Name[0].ToString())); | ||||
|                 str += new Random().Next(); | ||||
|                 foreach (var usr in allUsrsArray) | ||||
|                 { | ||||
|                     await (await (usr as IGuildUser).CreateDMChannelAsync()).SendMessageAsync(str).ConfigureAwait(false); | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 Console.WriteLine(ex); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Avatar(IMessage imsg, [Remainder] string mention) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             var usr = imsg.MentionedUsers.FirstOrDefault(); | ||||
|             if (usr == null) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Invalid user specified.").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|             await imsg.Channel.SendMessageAsync(await usr.AvatarUrl.ShortenUrl()).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         public static async Task<string> GetSafebooruImageLink(string tag) | ||||
|         { | ||||
|             var rng = new Random(); | ||||
|             var url = | ||||
|             $"http://safebooru.org/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; | ||||
|             using (var http = new HttpClient()) | ||||
|             { | ||||
|                 var webpage = await http.GetStringAsync(url).ConfigureAwait(false); | ||||
|                 var matches = Regex.Matches(webpage, "file_url=\"(?<url>.*?)\""); | ||||
|                 if (matches.Count == 0) | ||||
|                     return null; | ||||
|                 var match = matches[rng.Next(0, matches.Count)]; | ||||
|                 return matches[rng.Next(0, matches.Count)].Groups["url"].Value; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public static async Task<bool> ValidateQuery(ITextChannel ch, string query) | ||||
|         { | ||||
|             if (!string.IsNullOrEmpty(query.Trim())) return true; | ||||
|             await ch.SendMessageAsync("Please specify search parameters.").ConfigureAwait(false); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -19,6 +19,7 @@ namespace NadekoBot.Modules.Utility | ||||
|     { | ||||
|         public UtilityModule(ILocalization loc, CommandService cmds, IBotConfiguration config, IDiscordClient client) : base(loc, cmds, config, client) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|   | ||||
| @@ -16,8 +16,9 @@ namespace NadekoBot | ||||
|     { | ||||
|         public static CommandService Commands { get; private set; } | ||||
|         public static DiscordSocketClient Client { get; private set; } | ||||
|         public BotConfiguration Config { get; private set; } | ||||
|         public Localization Localizer { get; private set; } | ||||
|         public static BotConfiguration Config { get; private set; } | ||||
|         public static Localization Localizer { get; private set; } | ||||
|         public static BotCredentials Credentials { get; private set; } | ||||
|  | ||||
|         public async Task RunAsync(string[] args) | ||||
|         { | ||||
| @@ -34,6 +35,7 @@ namespace NadekoBot | ||||
|             Commands = new CommandService(); | ||||
|             Config = new BotConfiguration(); | ||||
|             Localizer = new Localization(); | ||||
|             Credentials = new BotCredentials(); | ||||
|              | ||||
|             //setup DI | ||||
|             var depMap = new DependencyMap(); | ||||
|   | ||||
							
								
								
									
										14
									
								
								src/NadekoBot/Services/IBotCredentials.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/NadekoBot/Services/IBotCredentials.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services | ||||
| { | ||||
|     public interface IBotCredentials | ||||
|     { | ||||
|         string Token { get; } | ||||
|         string GoogleApiKey { get; } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										23
									
								
								src/NadekoBot/Services/Impl/BotCredentials.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/NadekoBot/Services/Impl/BotCredentials.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Impl | ||||
| { | ||||
|     public class BotCredentials : IBotCredentials | ||||
|     { | ||||
|         public string GoogleApiKey { | ||||
|             get { | ||||
|                 throw new NotImplementedException(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public string Token { | ||||
|             get { | ||||
|                 throw new NotImplementedException(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,7 +1,9 @@ | ||||
| using Discord; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Net; | ||||
| using System.Text; | ||||
| using System.Text.RegularExpressions; | ||||
| using System.Threading.Tasks; | ||||
| @@ -47,5 +49,38 @@ namespace NadekoBot.Extensions | ||||
|             return list.ToArray(); | ||||
|         } | ||||
|  | ||||
|         public static async Task<string> ShortenUrl(this string url) | ||||
|         { | ||||
|             if (string.IsNullOrWhiteSpace(NadekoBot.Credentials.GoogleApiKey)) return url; | ||||
|             try | ||||
|             { | ||||
|                 var httpWebRequest = | ||||
|                     (HttpWebRequest)WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url?key=" + | ||||
|                                                        NadekoBot.Credentials.GoogleApiKey); | ||||
|                 httpWebRequest.ContentType = "application/json"; | ||||
|                 httpWebRequest.Method = "POST"; | ||||
|  | ||||
|                 using (var streamWriter = new StreamWriter(await httpWebRequest.GetRequestStreamAsync().ConfigureAwait(false))) | ||||
|                 { | ||||
|                     var json = "{\"longUrl\":\"" + Uri.EscapeDataString(url) + "\"}"; | ||||
|                     streamWriter.Write(json); | ||||
|                 } | ||||
|  | ||||
|                 var httpResponse = (await httpWebRequest.GetResponseAsync().ConfigureAwait(false)) as HttpWebResponse; | ||||
|                 var responseStream = httpResponse.GetResponseStream(); | ||||
|                 using (var streamReader = new StreamReader(responseStream)) | ||||
|                 { | ||||
|                     var responseText = await streamReader.ReadToEndAsync().ConfigureAwait(false); | ||||
|                     return Regex.Match(responseText, @"""id"": ?""(?<id>.+)""").Groups["id"].Value; | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 Console.WriteLine("Shortening of this url failed: " + url); | ||||
|                 Console.WriteLine(ex.ToString()); | ||||
|                 return url; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -324,7 +324,7 @@ namespace NadekoBot.Modules.Music.Classes | ||||
|             string file = null; | ||||
|             try | ||||
|             { | ||||
|                 file = await SearchHelper.GetResponseStringAsync(query).ConfigureAwait(false); | ||||
|                 file = await http.GetStringAsync(query).ConfigureAwait(false); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|   | ||||
| @@ -21,7 +21,7 @@ namespace NadekoBot.Modules.Music.Classes | ||||
|             if (string.IsNullOrWhiteSpace(NadekoBot.Creds.SoundCloudClientID)) | ||||
|                 throw new ArgumentNullException(nameof(NadekoBot.Creds.SoundCloudClientID)); | ||||
|  | ||||
|             var response = await SearchHelper.GetResponseStringAsync($"http://api.soundcloud.com/resolve?url={url}&client_id={NadekoBot.Creds.SoundCloudClientID}").ConfigureAwait(false); | ||||
|             var response = await http.GetStringAsync($"http://api.soundcloud.com/resolve?url={url}&client_id={NadekoBot.Creds.SoundCloudClientID}").ConfigureAwait(false); | ||||
|  | ||||
|             var responseObj = Newtonsoft.Json.JsonConvert.DeserializeObject<SoundCloudVideo>(response); | ||||
|             if (responseObj?.Kind != "track") | ||||
| @@ -40,7 +40,7 @@ namespace NadekoBot.Modules.Music.Classes | ||||
|             if (string.IsNullOrWhiteSpace(NadekoBot.Creds.SoundCloudClientID)) | ||||
|                 throw new ArgumentNullException(nameof(NadekoBot.Creds.SoundCloudClientID)); | ||||
|  | ||||
|             var response = await SearchHelper.GetResponseStringAsync($"http://api.soundcloud.com/tracks?q={Uri.EscapeDataString(query)}&client_id={NadekoBot.Creds.SoundCloudClientID}").ConfigureAwait(false); | ||||
|             var response = await http.GetStringAsync($"http://api.soundcloud.com/tracks?q={Uri.EscapeDataString(query)}&client_id={NadekoBot.Creds.SoundCloudClientID}").ConfigureAwait(false); | ||||
|  | ||||
|             var responseObj = JsonConvert.DeserializeObject<SoundCloudVideo[]>(response).Where(s => s.Streamable).FirstOrDefault(); | ||||
|             if (responseObj?.Kind != "track") | ||||
|   | ||||
| @@ -333,7 +333,7 @@ namespace NadekoBot.Modules.Music | ||||
|                         if (string.IsNullOrWhiteSpace(pl)) | ||||
|                             return; | ||||
|  | ||||
|                         var scvids = JObject.Parse(await SearchHelper.GetResponseStringAsync($"http://api.soundcloud.com/resolve?url={pl}&client_id={NadekoBot.Creds.SoundCloudClientID}").ConfigureAwait(false))["tracks"].ToObject<SoundCloudVideo[]>(); | ||||
|                         var scvids = JObject.Parse(await http.GetStringAsync($"http://api.soundcloud.com/resolve?url={pl}&client_id={NadekoBot.Creds.SoundCloudClientID}").ConfigureAwait(false))["tracks"].ToObject<SoundCloudVideo[]>(); | ||||
|                         await QueueSong(e.User, e.Channel, e.User.VoiceChannel, scvids[0].TrackLink).ConfigureAwait(false); | ||||
|  | ||||
|                         MusicPlayer mp; | ||||
|   | ||||
| @@ -1,92 +0,0 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Classes; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Diagnostics; | ||||
| using System.Text; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| /// <summary> | ||||
| /// I have no idea what am i doing | ||||
| /// </summary> | ||||
| namespace NadekoBot.Modules.Programming.Commands | ||||
| { | ||||
|     class HaskellRepl : DiscordCommand | ||||
|     { | ||||
|         ConcurrentQueue<KeyValuePair<string, Channel>> commandQueue = new ConcurrentQueue<KeyValuePair<string, Channel>>(); | ||||
|  | ||||
|         Thread haskellThread; | ||||
|  | ||||
|         public HaskellRepl(DiscordModule module) : base(module) | ||||
|         { | ||||
|             //start haskell interpreter | ||||
|  | ||||
|             haskellThread = new Thread(new ThreadStart(() => | ||||
|             { | ||||
|                 var p = Process.Start(new ProcessStartInfo | ||||
|                 { | ||||
|                     FileName = "stack", //shouldn't use repl, but a Language.Haskell.Interpreter somehow | ||||
|                     Arguments = "repl", | ||||
|                     UseShellExecute = false, | ||||
|                     RedirectStandardInput = true, | ||||
|                     RedirectStandardOutput = true, | ||||
|                     CreateNoWindow = true, | ||||
|                 }); | ||||
|  | ||||
|                 Task.Run(async () => | ||||
|                 { | ||||
|                     while (true) | ||||
|                     { | ||||
|                         while (commandQueue.Count == 0) | ||||
|                             await Task.Delay(100); | ||||
|  | ||||
|                         //read from queue | ||||
|                         KeyValuePair<string, Channel> com; | ||||
|                         if (!commandQueue.TryDequeue(out com)) | ||||
|                         { | ||||
|                             await Task.Delay(100); | ||||
|                             continue; | ||||
|                         } | ||||
|                         //var bytes = Encoding.ASCII.GetBytes(com.Key); | ||||
|  | ||||
|                         //send the command to the process | ||||
|                         p.StandardInput.WriteLine(com.Key); | ||||
|  | ||||
|                         //wait 50 ms for execution | ||||
|                         await Task.Delay(50); | ||||
|  | ||||
|                         //read everything from the output | ||||
|                         var outBuffer = new byte[1500]; | ||||
|  | ||||
|                         p.StandardOutput.BaseStream.Read(outBuffer, 0, 1500); | ||||
|  | ||||
|                         var outStr = Encoding.ASCII.GetString(outBuffer); | ||||
|                         //send to channel | ||||
|                         await com.Value.SendMessage($"```hs\nPrelude> {com.Key}\n" + outStr + "\n```"); | ||||
|                     } | ||||
|                 }); | ||||
|  | ||||
|             })); | ||||
|             haskellThread.Start(); | ||||
|  | ||||
|         } | ||||
|  | ||||
|         internal override void Init(CommandGroupBuilder cgb) | ||||
|         { | ||||
|             cgb.CreateCommand(Module.Prefix + "hs") | ||||
|                 .Description("Executes a haskell express with LAMBDABOT") | ||||
|                 .Parameter("command", ParameterType.Unparsed) | ||||
|                 .Do(e => | ||||
|                 { | ||||
|                     var com = e.GetArg("command")?.Trim(); | ||||
|                     if (string.IsNullOrWhiteSpace(com)) | ||||
|                         return; | ||||
|  | ||||
|                     //send a command and a channel to the queue | ||||
|                     commandQueue.Enqueue(new KeyValuePair<string, Channel>(com, e.Channel)); | ||||
|                 }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,26 +0,0 @@ | ||||
| using Discord.Modules; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Modules.Permissions.Classes; | ||||
| using NadekoBot.Modules.Programming.Commands; | ||||
|  | ||||
| namespace NadekoBot.Modules.Programming | ||||
| { | ||||
|     class ProgrammingModule : DiscordModule | ||||
|     { | ||||
|         public override string Prefix => NadekoBot.Config.CommandPrefixes.Programming; | ||||
|  | ||||
|         public ProgrammingModule() | ||||
|         { | ||||
|             commands.Add(new HaskellRepl(this)); | ||||
|         } | ||||
|  | ||||
|         public override void Install(ModuleManager manager) | ||||
|         { | ||||
|             manager.CreateCommands("", cgb => | ||||
|             { | ||||
|                 cgb.AddCheck(PermissionChecker.Instance); | ||||
|                 commands.ForEach(c => c.Init(cgb)); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,521 +0,0 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using Discord.Modules; | ||||
| using NadekoBot.Classes; | ||||
| using NadekoBot.Classes.JSONModels; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Modules.Permissions.Classes; | ||||
| using NadekoBot.Modules.Searches.Commands; | ||||
| using NadekoBot.Modules.Searches.Commands.IMDB; | ||||
| using Newtonsoft.Json; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Drawing; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Web; | ||||
|  | ||||
| namespace NadekoBot.Modules.Searches | ||||
| { | ||||
|     internal class SearchesModule : DiscordModule | ||||
|     { | ||||
|         private readonly Random rng; | ||||
|         public SearchesModule() | ||||
|         { | ||||
|             commands.Add(new LoLCommands(this)); | ||||
|             commands.Add(new StreamNotifications(this)); | ||||
|             commands.Add(new ConverterCommand(this)); | ||||
|             commands.Add(new RedditCommand(this)); | ||||
|             commands.Add(new WowJokeCommand(this)); | ||||
|             commands.Add(new CalcCommand(this)); | ||||
|             commands.Add(new OsuCommands(this)); | ||||
|             commands.Add(new PokemonSearchCommands(this)); | ||||
|             commands.Add(new MemegenCommands(this)); | ||||
|             rng = new Random(); | ||||
|         } | ||||
|  | ||||
|         public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.Searches; | ||||
|  | ||||
|         public override void Install(ModuleManager manager) | ||||
|         { | ||||
|             manager.CreateCommands("", cgb => | ||||
|             { | ||||
|  | ||||
|                 cgb.AddCheck(PermissionChecker.Instance); | ||||
|  | ||||
|                 commands.ForEach(cmd => cmd.Init(cgb)); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "we") | ||||
|                     .Description($"Shows weather data for a specified city and a country. BOTH ARE REQUIRED. Use country abbrevations. | `{Prefix}we Moscow RF`") | ||||
|                     .Parameter("city", ParameterType.Required) | ||||
|                     .Parameter("country", ParameterType.Required) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var city = e.GetArg("city").Replace(" ", ""); | ||||
|                         var country = e.GetArg("country").Replace(" ", ""); | ||||
|                         var response = await SearchHelper.GetResponseStringAsync($"http://api.lawlypopzz.xyz/nadekobot/weather/?city={city}&country={country}").ConfigureAwait(false); | ||||
|  | ||||
|                         var obj = JObject.Parse(response)["weather"]; | ||||
|  | ||||
|                         await channel.SendMessageAsync( | ||||
| $@"🌍 **Weather for** 【{obj["target"]}】 | ||||
| 📏 **Lat,Long:** ({obj["latitude"]}, {obj["longitude"]}) ☁ **Condition:** {obj["condition"]} | ||||
| 😓 **Humidity:** {obj["humidity"]}% 💨 **Wind Speed:** {obj["windspeedk"]}km/h / {obj["windspeedm"]}mph  | ||||
| 🔆 **Temperature:** {obj["centigrade"]}°C / {obj["fahrenheit"]}°F 🔆 **Feels like:** {obj["feelscentigrade"]}°C / {obj["feelsfahrenheit"]}°F | ||||
| 🌄 **Sunrise:** {obj["sunrise"]} 🌇 **Sunset:** {obj["sunset"]}").ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "yt") | ||||
|                     .Parameter("query", ParameterType.Unparsed) | ||||
|                     .Description($"Searches youtubes and shows the first result | `{Prefix}yt query`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")).ConfigureAwait(false))) return; | ||||
|                         var link = await SearchHelper.FindYoutubeUrlByKeywords(e.GetArg("query")).ConfigureAwait(false); | ||||
|                         if (string.IsNullOrWhiteSpace(link)) | ||||
|                         { | ||||
|                             await channel.SendMessageAsync("No results found for that query."); | ||||
|                             return; | ||||
|                         } | ||||
|                         var shortUrl = await SearchHelper.ShortenUrl(link).ConfigureAwait(false); | ||||
|                         await channel.SendMessageAsync(shortUrl).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "ani") | ||||
|                     .Alias(Prefix + "anime", Prefix + "aq") | ||||
|                     .Parameter("query", ParameterType.Unparsed) | ||||
|                     .Description($"Queries anilist for an anime and shows the first result. | `{Prefix}aq aquarion evol`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")).ConfigureAwait(false))) return; | ||||
|                         string result; | ||||
|                         try | ||||
|                         { | ||||
|                             result = (await SearchHelper.GetAnimeData(e.GetArg("query")).ConfigureAwait(false)).ToString(); | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await channel.SendMessageAsync("Failed to find that anime.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         await channel.SendMessageAsync(result.ToString()).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "imdb") | ||||
|                     .Parameter("query", ParameterType.Unparsed) | ||||
|                     .Description($"Queries imdb for movies or series, show first result. | `{Prefix}imdb Batman vs Superman`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")).ConfigureAwait(false))) return; | ||||
|                         await e.Channel.SendIsTyping().ConfigureAwait(false); | ||||
|                         string result; | ||||
|                         try | ||||
|                         { | ||||
|                             var movie = ImdbScraper.ImdbScrape(e.GetArg("query"), true); | ||||
|                             if (movie.Status) result = movie.ToString(); | ||||
|                             else result = "Failed to find that movie."; | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await channel.SendMessageAsync("Failed to find that movie.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         await channel.SendMessageAsync(result.ToString()).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "mang") | ||||
|                     .Alias(Prefix + "manga").Alias(Prefix + "mq") | ||||
|                     .Parameter("query", ParameterType.Unparsed) | ||||
|                     .Description($"Queries anilist for a manga and shows the first result. | `{Prefix}mq Shingeki no kyojin`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")).ConfigureAwait(false))) return; | ||||
|                         string result; | ||||
|                         try | ||||
|                         { | ||||
|                             result = (await SearchHelper.GetMangaData(e.GetArg("query")).ConfigureAwait(false)).ToString(); | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await channel.SendMessageAsync("Failed to find that anime.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|                         await channel.SendMessageAsync(result).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "randomcat") | ||||
|                     .Alias(Prefix + "meow") | ||||
|                     .Description($"Shows a random cat image. | `{Prefix}meow`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         await channel.SendMessageAsync(JObject.Parse( | ||||
|                             await SearchHelper.GetResponseStringAsync("http://www.random.cat/meow").ConfigureAwait(false))["file"].ToString()) | ||||
|                                 .ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "randomdog") | ||||
|                     .Alias(Prefix + "woof") | ||||
|                     .Description($"Shows a random dog image. | `{Prefix}woof`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         await channel.SendMessageAsync("http://random.dog/" + await SearchHelper.GetResponseStringAsync("http://random.dog/woof").ConfigureAwait(false)).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "i") | ||||
|                    .Description($"Pulls the first image found using a search parameter. Use ~ir for different results. | `{Prefix}i cute kitten`") | ||||
|                    .Parameter("query", ParameterType.Unparsed) | ||||
|                        .Do(async e => | ||||
|                        { | ||||
|                            if (string.IsNullOrWhiteSpace(e.GetArg("query"))) | ||||
|                                return; | ||||
|                            try | ||||
|                            { | ||||
|                                var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(e.GetArg("query"))}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&fields=items%2Flink&key={NadekoBot.Creds.GoogleAPIKey}"; | ||||
|                                var obj = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString).ConfigureAwait(false)); | ||||
|                                await channel.SendMessageAsync(obj["items"][0]["link"].ToString()).ConfigureAwait(false); | ||||
|                            } | ||||
|                            catch (HttpRequestException exception) | ||||
|                            { | ||||
|                                if (exception.Message.Contains("403 (Forbidden)")) | ||||
|                                { | ||||
|                                    await channel.SendMessageAsync("Daily limit reached!"); | ||||
|                                } | ||||
|                                else | ||||
|                                { | ||||
|                                    await channel.SendMessageAsync("Something went wrong."); | ||||
|                                } | ||||
|                            } | ||||
|                        }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "ir") | ||||
|                    .Description($"Pulls a random image using a search parameter. | `{Prefix}ir cute kitten`") | ||||
|                    .Parameter("query", ParameterType.Unparsed) | ||||
|                    .Do(async e => | ||||
|                     { | ||||
|                         if (string.IsNullOrWhiteSpace(e.GetArg("query"))) | ||||
|                             return; | ||||
|                         try | ||||
|                         { | ||||
|                             var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(e.GetArg("query"))}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&start={ rng.Next(1, 50) }&fields=items%2Flink&key={NadekoBot.Creds.GoogleAPIKey}"; | ||||
|                             var obj = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString).ConfigureAwait(false)); | ||||
|                             var items = obj["items"] as JArray; | ||||
|                             await channel.SendMessageAsync(items[0]["link"].ToString()).ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch (HttpRequestException exception) | ||||
|                         { | ||||
|                             if (exception.Message.Contains("403 (Forbidden)")) | ||||
|                             { | ||||
|                                 await channel.SendMessageAsync("Daily limit reached!"); | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|                                 await channel.SendMessageAsync("Something went wrong."); | ||||
|                             } | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "lmgtfy") | ||||
|                     .Description($"Google something for an idiot. | `{Prefix}lmgtfy query`") | ||||
|                     .Parameter("ffs", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (e.GetArg("ffs") == null || e.GetArg("ffs").Length < 1) return; | ||||
|                         await channel.SendMessageAsync(await $"http://lmgtfy.com/?q={ Uri.EscapeUriString(e.GetArg("ffs").ToString()) }".ShortenUrl()) | ||||
|                                        .ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "google") | ||||
|                     .Alias(Prefix + "g") | ||||
|                     .Description($"Get a google search link for some terms. | `{Prefix}google query`") | ||||
|                     .Parameter("terms", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var terms = e.GetArg("terms")?.Trim(); | ||||
|                         if (string.IsNullOrWhiteSpace(terms)) | ||||
|                             return; | ||||
|                         await channel.SendMessageAsync($"https://google.com/search?q={ HttpUtility.UrlEncode(terms).Replace(' ', '+') }") | ||||
|                                        .ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "hs") | ||||
|                   .Description($"Searches for a Hearthstone card and shows its image. Takes a while to complete. | `{Prefix}hs Ysera`") | ||||
|                   .Parameter("name", ParameterType.Unparsed) | ||||
|                   .Do(async e => | ||||
|                   { | ||||
|                       var arg = e.GetArg("name"); | ||||
|                       if (string.IsNullOrWhiteSpace(arg)) | ||||
|                       { | ||||
|                           await channel.SendMessageAsync("💢 Please enter a card name to search for.").ConfigureAwait(false); | ||||
|                           return; | ||||
|                       } | ||||
|                       await e.Channel.SendIsTyping().ConfigureAwait(false); | ||||
|                       var headers = new Dictionary<string, string> { { "X-Mashape-Key", NadekoBot.Creds.MashapeKey } }; | ||||
|                       var res = await SearchHelper.GetResponseStringAsync($"https://omgvamp-hearthstone-v1.p.mashape.com/cards/search/{Uri.EscapeUriString(arg)}", headers) | ||||
|                                                   .ConfigureAwait(false); | ||||
|                       try | ||||
|                       { | ||||
|                           var items = JArray.Parse(res); | ||||
|                           var images = new List<Image>(); | ||||
|                           if (items == null) | ||||
|                               throw new KeyNotFoundException("Cannot find a card by that name"); | ||||
|                           var cnt = 0; | ||||
|                           items.Shuffle(); | ||||
|                           foreach (var item in items.TakeWhile(item => cnt++ < 4).Where(item => item.HasValues && item["img"] != null)) | ||||
|                           { | ||||
|                               images.Add( | ||||
|                                   Image.FromStream(await SearchHelper.GetResponseStreamAsync(item["img"].ToString()).ConfigureAwait(false))); | ||||
|                           } | ||||
|                           if (items.Count > 4) | ||||
|                           { | ||||
|                               await channel.SendMessageAsync("⚠ Found over 4 images. Showing random 4.").ConfigureAwait(false); | ||||
|                           } | ||||
|                           await e.Channel.SendFile(arg + ".png", (await images.MergeAsync()).ToStream(System.Drawing.Imaging.ImageFormat.Png)) | ||||
|                                          .ConfigureAwait(false); | ||||
|                       } | ||||
|                       catch (Exception ex) | ||||
|                       { | ||||
|                           await channel.SendMessageAsync($"💢 Error {ex.Message}").ConfigureAwait(false); | ||||
|                       } | ||||
|                   }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "ud") | ||||
|                   .Description($"Searches Urban Dictionary for a word. | `{Prefix}ud Pineapple`") | ||||
|                   .Parameter("query", ParameterType.Unparsed) | ||||
|                   .Do(async e => | ||||
|                   { | ||||
|                       var arg = e.GetArg("query"); | ||||
|                       if (string.IsNullOrWhiteSpace(arg)) | ||||
|                       { | ||||
|                           await channel.SendMessageAsync("💢 Please enter a search term.").ConfigureAwait(false); | ||||
|                           return; | ||||
|                       } | ||||
|                       await e.Channel.SendIsTyping().ConfigureAwait(false); | ||||
|                       var headers = new Dictionary<string, string> { { "X-Mashape-Key", NadekoBot.Creds.MashapeKey } }; | ||||
|                       var res = await SearchHelper.GetResponseStringAsync($"https://mashape-community-urban-dictionary.p.mashape.com/define?term={Uri.EscapeUriString(arg)}", headers).ConfigureAwait(false); | ||||
|                       try | ||||
|                       { | ||||
|                           var items = JObject.Parse(res); | ||||
|                           var sb = new System.Text.StringBuilder(); | ||||
|                           sb.AppendLine($"`Term:` {items["list"][0]["word"].ToString()}"); | ||||
|                           sb.AppendLine($"`Definition:` {items["list"][0]["definition"].ToString()}"); | ||||
|                           sb.Append($"`Link:` <{await items["list"][0]["permalink"].ToString().ShortenUrl().ConfigureAwait(false)}>"); | ||||
|                           await channel.SendMessageAsync(sb.ToString()); | ||||
|                       } | ||||
|                       catch | ||||
|                       { | ||||
|                           await channel.SendMessageAsync("💢 Failed finding a definition for that term.").ConfigureAwait(false); | ||||
|                       } | ||||
|                   }); | ||||
|                 // thanks to Blaubeerwald | ||||
|                 cgb.CreateCommand(Prefix + "#") | ||||
|                  .Description($"Searches Tagdef.com for a hashtag. | `{Prefix}# ff`") | ||||
|                   .Parameter("query", ParameterType.Unparsed) | ||||
|                   .Do(async e => | ||||
|                   { | ||||
|                       var arg = e.GetArg("query"); | ||||
|                       if (string.IsNullOrWhiteSpace(arg)) | ||||
|                       { | ||||
|                           await channel.SendMessageAsync("💢 Please enter a search term.").ConfigureAwait(false); | ||||
|                           return; | ||||
|                       } | ||||
|                       await e.Channel.SendIsTyping().ConfigureAwait(false); | ||||
|                       var headers = new Dictionary<string, string> { { "X-Mashape-Key", NadekoBot.Creds.MashapeKey } }; | ||||
|                       var res = await SearchHelper.GetResponseStringAsync($"https://tagdef.p.mashape.com/one.{Uri.EscapeUriString(arg)}.json", headers).ConfigureAwait(false); | ||||
|                       try | ||||
|                       { | ||||
|                           var items = JObject.Parse(res); | ||||
|                           var sb = new System.Text.StringBuilder(); | ||||
|                           sb.AppendLine($"`Hashtag:` {items["defs"]["def"]["hashtag"].ToString()}"); | ||||
|                           sb.AppendLine($"`Definition:` {items["defs"]["def"]["text"].ToString()}"); | ||||
|                           sb.Append($"`Link:` <{await items["defs"]["def"]["uri"].ToString().ShortenUrl().ConfigureAwait(false)}>"); | ||||
|                           await channel.SendMessageAsync(sb.ToString()); | ||||
|                       } | ||||
|                       catch | ||||
|                       { | ||||
|                           await channel.SendMessageAsync("💢 Failed finidng a definition for that tag.").ConfigureAwait(false); | ||||
|                       } | ||||
|                   }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "quote") | ||||
|                     .Description($"Shows a random quote. | `{Prefix}quote`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var quote = NadekoBot.Config.Quotes[rng.Next(0, NadekoBot.Config.Quotes.Count)].ToString(); | ||||
|                         await channel.SendMessageAsync(quote).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "catfact") | ||||
|                     .Description($"Shows a random catfact from <http://catfacts-api.appspot.com/api/facts> | `{Prefix}catfact`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var response = await SearchHelper.GetResponseStringAsync("http://catfacts-api.appspot.com/api/facts").ConfigureAwait(false); | ||||
|                         if (response == null) | ||||
|                             return; | ||||
|                         await channel.SendMessageAsync($"🐈 `{JObject.Parse(response)["facts"][0].ToString()}`").ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "yomama") | ||||
|                     .Alias(Prefix + "ym") | ||||
|                     .Description($"Shows a random joke from <http://api.yomomma.info/> | `{Prefix}ym`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var response = await SearchHelper.GetResponseStringAsync("http://api.yomomma.info/").ConfigureAwait(false); | ||||
|                         await channel.SendMessageAsync("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "randjoke") | ||||
|                     .Alias(Prefix + "rj") | ||||
|                     .Description($"Shows a random joke from <http://tambal.azurewebsites.net/joke/random> | `{Prefix}rj`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var response = await SearchHelper.GetResponseStringAsync("http://tambal.azurewebsites.net/joke/random").ConfigureAwait(false); | ||||
|                         await channel.SendMessageAsync("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "chucknorris") | ||||
|                     .Alias(Prefix + "cn") | ||||
|                     .Description($"Shows a random chucknorris joke from <http://tambal.azurewebsites.net/joke/random> | `{Prefix}cn`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var response = await SearchHelper.GetResponseStringAsync("http://api.icndb.com/jokes/random/").ConfigureAwait(false); | ||||
|                         await channel.SendMessageAsync("`" + JObject.Parse(response)["value"]["joke"].ToString() + "` 😆").ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "magicitem") | ||||
|                     .Alias(Prefix + "mi") | ||||
|                     .Description($"Shows a random magicitem from <https://1d4chan.org/wiki/List_of_/tg/%27s_magic_items> | `{Prefix}mi`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var magicItems = JsonConvert.DeserializeObject<List<MagicItem>>(File.ReadAllText("data/magicitems.json")); | ||||
|                         var item = magicItems[rng.Next(0, magicItems.Count)].ToString(); | ||||
|  | ||||
|                         await channel.SendMessageAsync(item).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "revav") | ||||
|                     .Description($"Returns a google reverse image search for someone's avatar. | `{Prefix}revav \"@SomeGuy\"`") | ||||
|                     .Parameter("user", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var usrStr = e.GetArg("user")?.Trim(); | ||||
|  | ||||
|                         if (string.IsNullOrWhiteSpace(usrStr)) | ||||
|                             return; | ||||
|  | ||||
|                         var usr = e.Server.FindUsers(usrStr).FirstOrDefault(); | ||||
|  | ||||
|                         if (usr == null || string.IsNullOrWhiteSpace(usr.AvatarUrl)) | ||||
|                             return; | ||||
|                         await channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}").ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "revimg") | ||||
|                     .Description($"Returns a google reverse image search for an image from a link. | `{Prefix}revav Image link`") | ||||
|                     .Parameter("image", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var imgLink = e.GetArg("image")?.Trim(); | ||||
|  | ||||
|                         if (string.IsNullOrWhiteSpace(imgLink)) | ||||
|                             return; | ||||
|                         await channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={imgLink}").ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "safebooru") | ||||
|                     .Description($"Shows a random image from safebooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) | `{Prefix}safebooru yuri+kissing`") | ||||
|                     .Parameter("tag", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var tag = e.GetArg("tag")?.Trim() ?? ""; | ||||
|                         var link = await SearchHelper.GetSafebooruImageLink(tag).ConfigureAwait(false); | ||||
|                         if (link == null) | ||||
|                             await channel.SendMessageAsync("`No results.`"); | ||||
|                         else | ||||
|                             await channel.SendMessageAsync(link).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "wiki") | ||||
|                     .Description($"Gives you back a wikipedia link | `{Prefix}wiki query`") | ||||
|                     .Parameter("query", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var query = e.GetArg("query"); | ||||
|                         var result = await SearchHelper.GetResponseStringAsync("https://en.wikipedia.org//w/api.php?action=query&format=json&prop=info&redirects=1&formatversion=2&inprop=url&titles=" + Uri.EscapeDataString(query)); | ||||
|                         var data = JsonConvert.DeserializeObject<WikipediaApiModel>(result); | ||||
|                         if (data.Query.Pages[0].Missing) | ||||
|                             await channel.SendMessageAsync("`That page could not be found.`"); | ||||
|                         else | ||||
|                             await channel.SendMessageAsync(data.Query.Pages[0].FullUrl); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "clr") | ||||
|                     .Description($"Shows you what color corresponds to that hex. | `{Prefix}clr 00ff00`") | ||||
|                     .Parameter("color", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var arg1 = e.GetArg("color")?.Trim()?.Replace("#", ""); | ||||
|                         if (string.IsNullOrWhiteSpace(arg1)) | ||||
|                             return; | ||||
|                         var img = new Bitmap(50, 50); | ||||
|  | ||||
|                         var red = Convert.ToInt32(arg1.Substring(0, 2), 16); | ||||
|                         var green = Convert.ToInt32(arg1.Substring(2, 2), 16); | ||||
|                         var blue = Convert.ToInt32(arg1.Substring(4, 2), 16); | ||||
|                         var brush = new SolidBrush(System.Drawing.Color.FromArgb(red, green, blue)); | ||||
|  | ||||
|                         using (Graphics g = Graphics.FromImage(img)) | ||||
|                         { | ||||
|                             g.FillRectangle(brush, 0, 0, 50, 50); | ||||
|                             g.Flush(); | ||||
|                         } | ||||
|  | ||||
|                         await e.Channel.SendFile("arg1.png", img.ToStream()); | ||||
|                     }); | ||||
|  | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "videocall") | ||||
|                   .Description($"Creates a private <http://www.appear.in> video call link for you and other mentioned people. The link is sent to mentioned people via a private message. | `{Prefix}videocall \"@SomeGuy\"`") | ||||
|                   .Parameter("arg", ParameterType.Unparsed) | ||||
|                   .Do(async e => | ||||
|                   { | ||||
|                       try | ||||
|                       { | ||||
|                           var allUsrs = e.Message.MentionedUsers.Union(new User[] { e.User }); | ||||
|                           var allUsrsArray = allUsrs as User[] ?? allUsrs.ToArray(); | ||||
|                           var str = allUsrsArray.Aggregate("http://appear.in/", (current, usr) => current + Uri.EscapeUriString(usr.Name[0].ToString())); | ||||
|                           str += new Random().Next(); | ||||
|                           foreach (var usr in allUsrsArray) | ||||
|                           { | ||||
|                               await usr.SendMessage(str).ConfigureAwait(false); | ||||
|                           } | ||||
|                       } | ||||
|                       catch (Exception ex) | ||||
|                       { | ||||
|                           Console.WriteLine(ex); | ||||
|                       } | ||||
|                   }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "av") | ||||
|                     .Alias(Prefix + "avatar") | ||||
|                     .Parameter("mention", ParameterType.Required) | ||||
|                     .Description($"Shows a mentioned person's avatar. | `{Prefix}av \"@SomeGuy\"`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var usr = e.Channel.FindUsers(e.GetArg("mention")).FirstOrDefault(); | ||||
|                         if (usr == null) | ||||
|                         { | ||||
|                             await channel.SendMessageAsync("Invalid user specified.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|                         await channel.SendMessageAsync(await usr.AvatarUrl.ShortenUrl()).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user