예제 #1
0
        private void UpdateMovies(MoviesRepository moviesRepo, OperationInfo op, OperationsRepository opsRepo)
        {
            op.StatusInfo = "Scraping movies";
            this.UpdateOperationInfo(op, opsRepo);

            var scraper = new ImdbScraper();

            var moviesScraped  = 0;
            var moviesToUpdate = moviesRepo.GetMoviesToUpdate();

            foreach (var movie in moviesToUpdate)
            {
                scraper.UpdateMovieDetails(movie);
                moviesRepo.Save(movie);

                moviesScraped++;
                op.ExtraData["moviesScraped"] = moviesScraped.ToString(CultureInfo.InvariantCulture);
                this.UpdateOperationInfo(op, opsRepo);

                op.CancellationTokenSource.Token.ThrowIfCancellationRequested();
            }
        }
예제 #2
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(Classes.Permissions.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. Weather api is very random if you make a mistake.")
                .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}");

                    var obj = JObject.Parse(response)["weather"];

                    await e.Channel.SendMessage(
                        $@"🌍 **Weather for** 【{obj["target"]}】
📏 **Lat,Long:** ({obj["latitude"]}, {obj["longitude"]}) ☁ **Condition:** {obj["condition"]}
😓 **Humidity:** {obj["humidity"]}% 💨 **Wind Speed:** {obj["windspeedm"]}mph / {obj["windspeedk"]}km/h 
🔆 **Temperature:** {obj["centigrade"]}°C / {obj["fahrenheit"]}°F 🔆 **Feels like:** {obj["feelscentigrade"]}°C / {obj["feelsfahrenheit"]}°F
🌄 **Sunrise:** {obj["sunrise"]} 🌇 **Sunset:** {obj["sunset"]}");
                });

                cgb.CreateCommand(Prefix + "yt")
                .Parameter("query", ParameterType.Unparsed)
                .Description("Searches youtubes and shows the first result")
                .Do(async e =>
                {
                    if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query"))))
                    {
                        return;
                    }

                    var shortUrl = await SearchHelper.ShortenUrl(await SearchHelper.FindYoutubeUrlByKeywords(e.GetArg("query")));
                    await e.Channel.SendMessage(shortUrl);
                });

                cgb.CreateCommand(Prefix + "ani")
                .Alias(Prefix + "anime", Prefix + "aq")
                .Parameter("query", ParameterType.Unparsed)
                .Description("Queries anilist for an anime and shows the first result.")
                .Do(async e =>
                {
                    if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query"))))
                    {
                        return;
                    }
                    string result;
                    try
                    {
                        result = (await SearchHelper.GetAnimeData(e.GetArg("query"))).ToString();
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Failed to find that anime.");
                        return;
                    }

                    await e.Channel.SendMessage(result.ToString());
                });

                cgb.CreateCommand(Prefix + "imdb")
                .Parameter("query", ParameterType.Unparsed)
                .Description("Queries imdb for movies or series, show first result.")
                .Do(async e =>
                {
                    if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query"))))
                    {
                        return;
                    }
                    await e.Channel.SendIsTyping();
                    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 e.Channel.SendMessage("Failed to find that movie.");
                        return;
                    }

                    await e.Channel.SendMessage(result.ToString());
                });

                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.")
                .Do(async e =>
                {
                    if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query"))))
                    {
                        return;
                    }
                    string result;
                    try
                    {
                        result = (await SearchHelper.GetMangaData(e.GetArg("query"))).ToString();
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Failed to find that anime.");
                        return;
                    }
                    await e.Channel.SendMessage(result);
                });

                cgb.CreateCommand(Prefix + "randomcat")
                .Description("Shows a random cat image.")
                .Do(async e =>
                {
                    await e.Channel.SendMessage(JObject.Parse(
                                                    await SearchHelper.GetResponseStringAsync("http://www.random.cat/meow"))["file"].ToString());
                });

                cgb.CreateCommand(Prefix + "i")
                .Description("Pulls the first image found using a search parameter. Use ~ir for different results.\n**Usage**: ~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));
                        await e.Channel.SendMessage(obj["items"][0]["link"].ToString());
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage($"💢 {ex.Message}");
                    }
                });

                cgb.CreateCommand(Prefix + "ir")
                .Description("Pulls a random image using a search parameter.\n**Usage**: ~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, 150) }&fields=items%2Flink&key={NadekoBot.Creds.GoogleAPIKey}";
                        var obj       = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString));
                        await e.Channel.SendMessage(obj["items"][0]["link"].ToString());
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage($"💢 {ex.Message}");
                    }
                });
                cgb.CreateCommand(Prefix + "lmgtfy")
                .Description("Google something for an idiot.")
                .Parameter("ffs", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (e.GetArg("ffs") == null || e.GetArg("ffs").Length < 1)
                    {
                        return;
                    }
                    await e.Channel.SendMessage(await $"http://lmgtfy.com/?q={ Uri.EscapeUriString(e.GetArg("ffs").ToString()) }".ShortenUrl());
                });

                cgb.CreateCommand(Prefix + "hs")
                .Description("Searches for a Hearthstone card and shows its image. Takes a while to complete.\n**Usage**:~hs Ysera")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("name");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 Please enter a card name to search for.");
                        return;
                    }
                    await e.Channel.SendIsTyping();
                    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);
                    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())));
                        }
                        if (items.Count > 4)
                        {
                            await e.Channel.SendMessage("⚠ Found over 4 images. Showing random 4.");
                        }
                        await e.Channel.SendFile(arg + ".png", (await images.MergeAsync()).ToStream(System.Drawing.Imaging.ImageFormat.Png));
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage($"💢 Error {ex.Message}");
                    }
                });

                cgb.CreateCommand(Prefix + "osu")
                .Description("Shows osu stats for a player.\n**Usage**:~osu Name")
                .Parameter("usr", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (string.IsNullOrWhiteSpace(e.GetArg("usr")))
                    {
                        return;
                    }

                    using (WebClient cl = new WebClient())
                    {
                        try
                        {
                            cl.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
                            cl.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.2; Win64; x64)");
                            cl.DownloadDataAsync(new Uri($"http://lemmmy.pw/osusig/sig.php?uname={ e.GetArg("usr") }&flagshadow&xpbar&xpbarhex&pp=2"));
                            cl.DownloadDataCompleted += async(s, cle) =>
                            {
                                try
                                {
                                    await e.Channel.SendFile($"{e.GetArg("usr")}.png", new MemoryStream(cle.Result));
                                    await e.Channel.SendMessage($"`Profile Link:`https://osu.ppy.sh/u/{Uri.EscapeDataString(e.GetArg("usr"))}\n`Image provided by https://lemmmy.pw/osusig`");
                                }
                                catch { }
                            };
                        }
                        catch
                        {
                            await e.Channel.SendMessage("💢 Failed retrieving osu signature :\\");
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "ud")
                .Description("Searches Urban Dictionary for a word.\n**Usage**:~ud Pineapple")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("query");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 Please enter a search term.");
                        return;
                    }
                    await e.Channel.SendIsTyping();
                    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);
                    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()}>");
                        await e.Channel.SendMessage(sb.ToString());
                    }
                    catch
                    {
                        await e.Channel.SendMessage("💢 Failed finding a definition for that term.");
                    }
                });
                // thanks to Blaubeerwald
                cgb.CreateCommand(Prefix + "#")
                .Description("Searches Tagdef.com for a hashtag.\n**Usage**:~# ff")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("query");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 Please enter a search term.");
                        return;
                    }
                    await e.Channel.SendIsTyping();
                    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);
                    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()}>");
                        await e.Channel.SendMessage(sb.ToString());
                    }
                    catch
                    {
                        await e.Channel.SendMessage("💢 Failed finidng a definition for that tag.");
                    }
                });

                cgb.CreateCommand(Prefix + "quote")
                .Description("Shows a random quote.")
                .Do(async e =>
                {
                    var quote = NadekoBot.Config.Quotes[rng.Next(0, NadekoBot.Config.Quotes.Count)].ToString();
                    await e.Channel.SendMessage(quote);
                });

                cgb.CreateCommand(Prefix + "catfact")
                .Description("Shows a random catfact from <http://catfacts-api.appspot.com/api/facts>")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://catfacts-api.appspot.com/api/facts");
                    if (response == null)
                    {
                        return;
                    }
                    await e.Channel.SendMessage($"🐈 `{JObject.Parse(response)["facts"][0].ToString()}`");
                });

                cgb.CreateCommand(Prefix + "yomama")
                .Alias(Prefix + "ym")
                .Description("Shows a random joke from <http://api.yomomma.info/>")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://api.yomomma.info/");
                    await e.Channel.SendMessage("`" + JObject.Parse(response)["joke"].ToString() + "` 😆");
                });

                cgb.CreateCommand(Prefix + "randjoke")
                .Alias(Prefix + "rj")
                .Description("Shows a random joke from <http://tambal.azurewebsites.net/joke/random>")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://tambal.azurewebsites.net/joke/random");
                    await e.Channel.SendMessage("`" + JObject.Parse(response)["joke"].ToString() + "` 😆");
                });

                cgb.CreateCommand(Prefix + "chucknorris")
                .Alias(Prefix + "cn")
                .Description("Shows a random chucknorris joke from <http://tambal.azurewebsites.net/joke/random>")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://api.icndb.com/jokes/random/");
                    await e.Channel.SendMessage("`" + JObject.Parse(response)["value"]["joke"].ToString() + "` 😆");
                });

                cgb.CreateCommand(Prefix + "mi")
                .Alias("magicitem")
                .Description("Shows a random magicitem from <https://1d4chan.org/wiki/List_of_/tg/%27s_magic_items>")
                .Do(async e =>
                {
                    var magicItems = JsonConvert.DeserializeObject <List <MagicItem> >(File.ReadAllText("data/magicitems.json"));
                    var item       = magicItems[rng.Next(0, magicItems.Count)].ToString();

                    await e.Channel.SendMessage(item);
                });

                cgb.CreateCommand(Prefix + "revav")
                .Description("Returns a google reverse image search for someone's avatar.")
                .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 e.Channel.SendMessage($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}");
                });
            });
        }
예제 #3
0
        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 e.Channel.SendMessage(
                        $@"🌍 **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 e.Channel.SendMessage("No results found for that query.");
                        return;
                    }
                    var shortUrl = await SearchHelper.ShortenUrl(link).ConfigureAwait(false);
                    await e.Channel.SendMessage(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 e.Channel.SendMessage("Failed to find that anime.").ConfigureAwait(false);
                        return;
                    }

                    await e.Channel.SendMessage(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 e.Channel.SendMessage("Failed to find that movie.").ConfigureAwait(false);
                        return;
                    }

                    await e.Channel.SendMessage(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 e.Channel.SendMessage("Failed to find that anime.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(result).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "randomcat")
                .Alias(Prefix + "meow")
                .Description($"Shows a random cat image. | `{Prefix}meow`")
                .Do(async e =>
                {
                    await e.Channel.SendMessage(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 e.Channel.SendMessage("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 e.Channel.SendMessage(obj["items"][0]["link"].ToString()).ConfigureAwait(false);
                    }
                    catch (HttpRequestException exception)
                    {
                        if (exception.Message.Contains("403 (Forbidden)"))
                        {
                            await e.Channel.SendMessage("Daily limit reached!");
                        }
                        else
                        {
                            await e.Channel.SendMessage("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 e.Channel.SendMessage(items[0]["link"].ToString()).ConfigureAwait(false);
                    }
                    catch (HttpRequestException exception)
                    {
                        if (exception.Message.Contains("403 (Forbidden)"))
                        {
                            await e.Channel.SendMessage("Daily limit reached!");
                        }
                        else
                        {
                            await e.Channel.SendMessage("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 e.Channel.SendMessage(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 e.Channel.SendMessage($"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 e.Channel.SendMessage("💢 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 e.Channel.SendMessage("⚠ 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 e.Channel.SendMessage($"💢 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 e.Channel.SendMessage("💢 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 e.Channel.SendMessage(sb.ToString());
                    }
                    catch
                    {
                        await e.Channel.SendMessage("💢 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 e.Channel.SendMessage("💢 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 e.Channel.SendMessage(sb.ToString());
                    }
                    catch
                    {
                        await e.Channel.SendMessage("💢 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 e.Channel.SendMessage(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 e.Channel.SendMessage($"🐈 `{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 e.Channel.SendMessage("`" + 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 e.Channel.SendMessage("`" + 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 e.Channel.SendMessage("`" + 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 e.Channel.SendMessage(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 e.Channel.SendMessage($"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 e.Channel.SendMessage($"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 e.Channel.SendMessage("`No results.`");
                    }
                    else
                    {
                        await e.Channel.SendMessage(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 e.Channel.SendMessage("`That page could not be found.`");
                    }
                    else
                    {
                        await e.Channel.SendMessage(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 e.Channel.SendMessage("Invalid user specified.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(await usr.AvatarUrl.ShortenUrl()).ConfigureAwait(false);
                });
            });
        }
예제 #4
0
        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.\n**Usage**: {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 e.Channel.SendMessage(
                        $@"🌍 **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")
                .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 e.Channel.SendMessage("No results found for that query.");
                        return;
                    }
                    var shortUrl = await SearchHelper.ShortenUrl(link).ConfigureAwait(false);
                    await e.Channel.SendMessage(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.")
                .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 e.Channel.SendMessage("Failed to find that anime.").ConfigureAwait(false);
                        return;
                    }

                    await e.Channel.SendMessage(result.ToString()).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "imdb")
                .Parameter("query", ParameterType.Unparsed)
                .Description("Queries imdb for movies or series, show first result.")
                .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 e.Channel.SendMessage("Failed to find that movie.").ConfigureAwait(false);
                        return;
                    }

                    await e.Channel.SendMessage(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.")
                .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 e.Channel.SendMessage("Failed to find that anime.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(result).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "randomcat")
                .Alias(Prefix + "meow")
                .Description("Shows a random cat image.")
                .Do(async e =>
                {
                    await e.Channel.SendMessage(JObject.Parse(
                                                    await SearchHelper.GetResponseStringAsync("http://www.random.cat/meow").ConfigureAwait(false))["file"].ToString())
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "i")
                .Description("Pulls the first image found using a search parameter. Use ~ir for different results.\n**Usage**: ~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 e.Channel.SendMessage(obj["items"][0]["link"].ToString()).ConfigureAwait(false);
                    }
                    catch (HttpRequestException exception)
                    {
                        if (exception.Message.Contains("403 (Forbidden)"))
                        {
                            await e.Channel.SendMessage("Daily limit reached!");
                        }
                        else
                        {
                            await e.Channel.SendMessage("Something went wrong.");
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "ir")
                .Description("Pulls a random image using a search parameter.\n**Usage**: ~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=50&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 e.Channel.SendMessage(items[rng.Next(0, items.Count)]["link"].ToString()).ConfigureAwait(false);
                    }
                    catch (HttpRequestException exception)
                    {
                        if (exception.Message.Contains("403 (Forbidden)"))
                        {
                            await e.Channel.SendMessage("Daily limit reached!");
                        }
                        else
                        {
                            await e.Channel.SendMessage("Something went wrong.");
                        }
                    }
                });
                cgb.CreateCommand(Prefix + "lmgtfy")
                .Description("Google something for an idiot.")
                .Parameter("ffs", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (e.GetArg("ffs") == null || e.GetArg("ffs").Length < 1)
                    {
                        return;
                    }
                    await e.Channel.SendMessage(await $"http://lmgtfy.com/?q={ Uri.EscapeUriString(e.GetArg("ffs").ToString()) }".ShortenUrl())
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "hs")
                .Description("Searches for a Hearthstone card and shows its image. Takes a while to complete.\n**Usage**:~hs Ysera")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("name");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 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 e.Channel.SendMessage("⚠ 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 e.Channel.SendMessage($"💢 Error {ex.Message}").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "osu")
                .Description("Shows osu stats for a player.\n**Usage**:~osu Name")
                .Parameter("usr", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (string.IsNullOrWhiteSpace(e.GetArg("usr")))
                    {
                        return;
                    }

                    using (WebClient cl = new WebClient())
                    {
                        try
                        {
                            cl.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
                            cl.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.2; Win64; x64)");
                            cl.DownloadDataAsync(new Uri($"http://lemmmy.pw/osusig/sig.php?uname={ e.GetArg("usr") }&flagshadow&xpbar&xpbarhex&pp=2"));
                            cl.DownloadDataCompleted += async(s, cle) =>
                            {
                                try
                                {
                                    await e.Channel.SendFile($"{e.GetArg("usr")}.png", new MemoryStream(cle.Result)).ConfigureAwait(false);
                                    await e.Channel.SendMessage($"`Profile Link:`https://osu.ppy.sh/u/{Uri.EscapeDataString(e.GetArg("usr"))}\n`Image provided by https://lemmmy.pw/osusig`").ConfigureAwait(false);
                                }
                                catch { }
                            };
                        }
                        catch
                        {
                            await e.Channel.SendMessage("💢 Failed retrieving osu signature :\\").ConfigureAwait(false);
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "ud")
                .Description("Searches Urban Dictionary for a word.\n**Usage**:~ud Pineapple")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("query");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 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 e.Channel.SendMessage(sb.ToString());
                    }
                    catch
                    {
                        await e.Channel.SendMessage("💢 Failed finding a definition for that term.").ConfigureAwait(false);
                    }
                });
                // thanks to Blaubeerwald
                cgb.CreateCommand(Prefix + "#")
                .Description("Searches Tagdef.com for a hashtag.\n**Usage**:~# ff")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("query");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 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 e.Channel.SendMessage(sb.ToString());
                    }
                    catch
                    {
                        await e.Channel.SendMessage("💢 Failed finidng a definition for that tag.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "quote")
                .Description("Shows a random quote.")
                .Do(async e =>
                {
                    var quote = NadekoBot.Config.Quotes[rng.Next(0, NadekoBot.Config.Quotes.Count)].ToString();
                    await e.Channel.SendMessage(quote).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "catfact")
                .Description("Shows a random catfact from <http://catfacts-api.appspot.com/api/facts>")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://catfacts-api.appspot.com/api/facts").ConfigureAwait(false);
                    if (response == null)
                    {
                        return;
                    }
                    await e.Channel.SendMessage($"🐈 `{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/>")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://api.yomomma.info/").ConfigureAwait(false);
                    await e.Channel.SendMessage("`" + 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>")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://tambal.azurewebsites.net/joke/random").ConfigureAwait(false);
                    await e.Channel.SendMessage("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "longtts")
                .Alias(Prefix + "ltts")
                .Parameter("text", ParameterType.Unparsed)
                .Description("Reads out text to speach in chunks.")
                .Do(async e =>
                {
                    string fullText         = e.GetArg("text");
                    int curIndex            = 0;
                    int startIndex          = 0;
                    int curChar             = 0;
                    string[] allWords       = fullText.Split(' ');
                    List <string> ttsOutput = new List <string>();
                    for (; curIndex < allWords.Length; curIndex++)
                    {
                        curChar += allWords[curIndex].Length;
                        if (curChar > 90)
                        {
                            string newTTS = "";
                            if (startIndex == curIndex)
                            {
                                newTTS = allWords[startIndex];
                                startIndex++;
                            }
                            else
                            {
                                for (int a = startIndex; a < curIndex; a++)
                                {
                                    newTTS += allWords[a] + " ";
                                }
                                startIndex = curIndex;
                            }
                            ttsOutput.Add(newTTS);
                            curChar = 0;
                        }
                    }
                    {
                        string newTTS = "";
                        for (int a = startIndex; a < curIndex; a++)
                        {
                            newTTS += allWords[a] + " ";
                        }
                        startIndex = curIndex;
                        ttsOutput.Add(newTTS);
                    }
                    var nadeko        = e.Server.GetUser(NadekoBot.Creds.BotId);
                    string nickBackup = nadeko.Nickname;
                    await nadeko.Edit(false, false, null, null, "֐");
                    foreach (var tts in ttsOutput)
                    {
                        Message x = await e.Channel.SendTTSMessage(tts);
                        while (x.State == MessageState.Queued)
                        {
                            System.Threading.Thread.Sleep(1);
                        }
                    }
                    await nadeko.Edit(false, false, null, null, nickBackup);
                });


                cgb.CreateCommand(Prefix + "chucknorris")
                .Alias(Prefix + "cn")
                .Description("Shows a random chucknorris joke from <http://tambal.azurewebsites.net/joke/random>")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://api.icndb.com/jokes/random/").ConfigureAwait(false);
                    await e.Channel.SendMessage("`" + 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>")
                .Do(async e =>
                {
                    var magicItems = JsonConvert.DeserializeObject <List <MagicItem> >(File.ReadAllText("data/magicitems.json"));
                    var item       = magicItems[rng.Next(0, magicItems.Count)].ToString();

                    await e.Channel.SendMessage(item).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "revav")
                .Description("Returns a google reverse image search for someone's avatar.")
                .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 e.Channel.SendMessage($"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.")
                .Parameter("image", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var imgLink = e.GetArg("image")?.Trim();

                    if (string.IsNullOrWhiteSpace(imgLink))
                    {
                        return;
                    }
                    await e.Channel.SendMessage($"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 +)\n**Usage**: ~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 e.Channel.SendMessage("`No results.`");
                    }
                    else
                    {
                        await e.Channel.SendMessage(link).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "wiki")
                .Description("Gives you back a wikipedia link")
                .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 e.Channel.SendMessage("`That page could not be found.`");
                    }
                    else
                    {
                        await e.Channel.SendMessage(data.Query.Pages[0].FullUrl);
                    }
                });

                cgb.CreateCommand(Prefix + "clr")
                .Description("Shows you what color corresponds to that hex.\n**Usage**: `~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.")
                .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);
                    }
                });
            });
        }
예제 #5
0
 public ImdbScraperController(ILogger <ImdbScraperController> logger, ImdbScraper imdbScraper, ImdbDbContext dbContext)
 {
     _logger      = logger;
     _imdbScraper = imdbScraper;
     _dbContext   = dbContext;
 }
예제 #6
0
 public UserController(ILogger <UserController> logger, ImdbScraper imdbScraper, ImdbDbContext dbContext, IMovieRecommender movieRecommender)
 {
     _logger           = logger;
     _dbContext        = dbContext;
     _movieRecommender = movieRecommender;
 }
예제 #7
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                commands.ForEach(cmd => cmd.Init(cgb));

                cgb.CreateCommand(Prefix + "we")
                .Description($"Zeigt Wetter-Daten für eine genannte Stadt und ein Land. BEIDES IST BENÖTIGT. Wetter Api ist sehr zufällig, wenn du einen Fehler machst. | `{Prefix}we Moskau 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 e.Channel.SendMessage(
                        $@"🌍 **Wetter in** 【{obj["target"]}】
                        📏 **Lat,Long:** ({obj["latitude"]}, {obj["longitude"]}) ☁ **Condition:** {obj["condition"]}
                        😓 **Luftfeuchtigkeit:** {obj["humidity"]}% 💨 **Wind Geschwindigkeit:** {obj["windspeedk"]}km/h / {obj["windspeedm"]}mph 
                        🔆 **Temperatur:** {obj["centigrade"]}°C / {obj["fahrenheit"]}°F 🔆 **Gefühlt:** {obj["feelscentigrade"]}°C / {obj["feelsfahrenheit"]}°F
                        🌄 **Sonnenaufgang:** {obj["sunrise"]} 🌇 **Sonnenuntergang:** {obj["sunset"]}").ConfigureAwait(false);
                });



                cgb.CreateCommand(Prefix + "yt")
                .Parameter("query", ParameterType.Unparsed)
                .Description($"Durchsucht Youtube und zeigt das erste Ergebnis. | `{Prefix}yt query`")
                .Do(async e =>
                {
                    if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query"))))
                    {
                        return;
                    }

                    var link = await SearchHelper.FindYoutubeUrlByKeywords(e.GetArg("query")).ConfigureAwait(false);
                    if (string.IsNullOrWhiteSpace(link))
                    {
                        await e.Channel.SendMessage("Kein Ergebnis mit diesem Begriff gefunden.");
                        return;
                    }
                    var shortUrl = await SearchHelper.ShortenUrl(link).ConfigureAwait(false);
                    await e.Channel.SendMessage(shortUrl).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "ani")
                .Alias(Prefix + "anime", Prefix + "aq")
                .Parameter("query", ParameterType.Unparsed)
                .Description($"Durchsucht anilist nach einem Anime und zeigt das erste Ergebnis. | `{Prefix}aq aquerion 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 e.Channel.SendMessage("Anime konnte nicht gefunden werden.").ConfigureAwait(false);
                        return;
                    }

                    await e.Channel.SendMessage(result.ToString()).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "imdb")
                .Parameter("query", ParameterType.Unparsed)
                .Description($"Durchsucht IMDB nach Filmen oder Serien und zeigt erstes Ergebnis. | `{Prefix}imdb query`")
                .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 = "Film nicht gefunden.";
                        }
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Film nicht gefunden.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(result.ToString());
                });

                cgb.CreateCommand(Prefix + "mang")
                .Alias(Prefix + "manga").Alias(Prefix + "mq")
                .Parameter("query", ParameterType.Unparsed)
                .Description($"Durchsucht anilist nach einem Manga und zeigt das erste Ergebnis. | `{Prefix}mq query`")
                .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 e.Channel.SendMessage("Manga konnte nicht gefunden werden.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(result).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "randomcat")
                .Alias(Prefix + "meow")
                .Description($"Zeigt ein zufälliges Katzenbild. | `{Prefix}meow`")
                .Do(async e =>
                {
                    await e.Channel.SendMessage(JObject.Parse(
                                                    await SearchHelper.GetResponseStringAsync("http://www.random.cat/meow").ConfigureAwait(false))["file"].ToString())
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "randomdog")
                .Alias(Prefix + "woof")
                .Description($"Zeigt ein zufälliges Hundebild. | `{Prefix}woof`")
                .Do(async e =>
                {
                    await e.Channel.SendMessage("http://random.dog/" + await SearchHelper.GetResponseStringAsync("http://random.dog/woof").ConfigureAwait(false)).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "i")
                .Description($"Zeigt das erste Ergebnis für eine Suche. Benutze ~ir für unterschiedliche Ergebnisse. | `{Prefix}i cute kitten`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    IMG:
                    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&safe=medium&num=1&searchType=image&fields=items%2Flink&key={MidnightBot.GetRndGoogleAPIKey ()}";
                        var obj       = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString).ConfigureAwait(false));

                        await e.Channel.SendMessage(obj["items"][0]["link"].ToString()).ConfigureAwait(false);
                    }
                    catch (HttpRequestException exception)
                    {
                        if (exception.Message.Contains("403 (Forbidden)"))
                        {
                            await e.Channel.SendMessage("Limit erreicht!").ConfigureAwait(false);
                        }
                        else
                        {
                            goto IMG;
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "ir")
                .Description($"Zeigt ein zufälliges Bild bei einem angegeben Suchwort. | `{Prefix}ir cute kitten`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var apikey = MidnightBot.GetRndGoogleAPIKey();
                    RANDOMIMG:
                    await e.Channel.SendIsTyping();
                    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&safe=medium&num=1&searchType=image&start={rng.Next(1,50)}&fields=items%2Flink&key={apikey}";
                        var obj       = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString).ConfigureAwait(false));
                        var items     = obj["items"] as JArray;
                        await e.Channel.SendMessage(items[0]["link"].ToString()).ConfigureAwait(false);
                    }
                    catch (HttpRequestException exception)
                    {
                        if (exception.Message.Contains("403 (Forbidden)"))
                        {
                            await e.Channel.SendMessage("Tägliches Limit erreicht!").ConfigureAwait(false);
                        }
                        else
                        {
                            goto RANDOMIMG;
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "lmgtfy")
                .Description($"Google etwas für einen Idioten. | `{Prefix}lmgtfy query`")
                .Parameter("ffs", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (e.GetArg("ffs") == null || e.GetArg("ffs").Length < 1)
                    {
                        return;
                    }
                    await e.Channel.SendMessage(await $"http://lmgtfy.com/?q={ Uri.EscapeUriString (e.GetArg ("ffs").ToString ()) }".ShortenUrl())
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "google")
                .Alias(Prefix + "g")
                .Description($"Gibt einen Google-Suchlink für einen Begriff zurück. | `{Prefix}google query`")
                .Parameter("terms", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var terms = e.GetArg("terms")?.Trim();
                    if (string.IsNullOrWhiteSpace(terms))
                    {
                        return;
                    }
                    await e.Channel.SendMessage($"https://google.com/search?q={ HttpUtility.UrlEncode(terms).Replace(' ', '+') }")
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "hs")
                .Description($"Sucht eine Heartstone-Karte und zeigt ihr Bild. Braucht eine Weile zum beenden. | `{Prefix}hs Ysera`")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("name");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 Bitte gib einen Kartennamen ein.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendIsTyping();
                    var headers = new Dictionary <string, string> {
                        { "X-Mashape-Key", MidnightBot.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("Es wurde keine Karte mit diesem Namen gefunden.");
                        }
                        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 e.Channel.SendMessage("⚠ Mehr als 4 Bilder gefunden. Zeige 4 Zufällige.").ConfigureAwait(false);
                        }
                        await e.Channel.SendFile(arg + ".png", (await images.MergeAsync()).ToStream(System.Drawing.Imaging.ImageFormat.Png))
                        .ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage($"💢 Error {ex.Message}").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "ud")
                .Description($"Durchsucht das Urban Dictionary nach einem Wort. | `{Prefix}ud Pineapple`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("query");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 Bitte gib einen Suchbegriff ein.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendIsTyping().ConfigureAwait(false);
                    var headers = new Dictionary <string, string> {
                        { "X-Mashape-Key", MidnightBot.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 e.Channel.SendMessage(sb.ToString());
                    }
                    catch
                    {
                        await e.Channel.SendMessage("💢 Keine Definition für den Begriff gefunden.").ConfigureAwait(false);
                    }
                });
                // thanks to Blaubeerwald
                cgb.CreateCommand(Prefix + "#")
                .Description($"Durchsucht Tagdef.com nach einem Hashtag. | `{Prefix}# ff`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("query");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 Bitte gib einen Suchbegriff ein.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendIsTyping();
                    var headers = new Dictionary <string, string> {
                        { "X-Mashape-Key", MidnightBot.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 e.Channel.SendMessage(sb.ToString());
                    }
                    catch
                    {
                        await e.Channel.SendMessage("💢 Keine Definition gefunden.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "quote")
                .Description($"Zeigt ein zufälliges Zitat. | `{Prefix}quote`")
                .Do(async e =>
                {
                    var quote = MidnightBot.Config.Quotes[rng.Next(0, MidnightBot.Config.Quotes.Count)].ToString();
                    await e.Channel.SendMessage(quote).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "catfact")
                .Description($"Zeigt einen zufälligen Katzenfakt von <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 e.Channel.SendMessage("`" + JObject.Parse(response)["facts"].ToString() + "`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "yomama")
                .Alias(Prefix + "ym")
                .Description($"Zeigt einen zufälligen Witz von <http://api.yomomma.info/> | `{Prefix}ym`")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://api.yomomma.info/").ConfigureAwait(false);
                    await e.Channel.SendMessage("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "randjoke")
                .Alias(Prefix + "rj")
                .Description($"Zeigt einen zufälligen Witz von <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 e.Channel.SendMessage("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "chucknorris")
                .Alias(Prefix + "cn")
                .Description($"Zeigt einen zufälligen Chuck Norris Witz von <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 e.Channel.SendMessage("`" + JObject.Parse(response)["value"]["joke"].ToString() + "` 😆").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "stardew")
                .Description($"Gibt einen Link zum Stardew Valley Wiki mit gegebenem Topic zurück. | `{Prefix}stardew Cow`")
                .Parameter("topic", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var topic = e.GetArg("topic")?.Trim().ToLowerInvariant();
                    if (string.IsNullOrWhiteSpace(topic))
                    {
                        return;
                    }

                    var upperTopic = topic[0].ToString().ToUpper() + topic.Substring(1);
                    topic.Replace(" ", "_");

                    await e.Channel.SendMessage($"Ich habe nach: {upperTopic} gesucht und folgendes gefunden: http://stardewvalleywiki.com/{topic}").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "magicitem")
                .Alias(Prefix + "mi")
                .Description($"Zeigt ein zufälliges Magic-Item von <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 e.Channel.SendMessage(item).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "revav")
                .Description($"Gibt ein Google Reverse Image Search für das Profilbild einer Person zurück. | `{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 e.Channel.SendIsTyping();
                    await e.Channel.SendMessage($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "revimg")
                .Description($"Gibt eine 'Google Reverse Image Search' für ein Bild von einem Link zurück. | `{Prefix}revav Image link`")
                .Parameter("image", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var imgLink = e.GetArg("image")?.Trim();

                    if (string.IsNullOrWhiteSpace(imgLink))
                    {
                        return;
                    }
                    await e.Channel.SendMessage($"https://images.google.com/searchbyimage?image_url={imgLink}").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "safebooru")
                .Description($"Zeigt ein zufälliges Hentai Bild von safebooru  mit einem gegebenen Tag. Ein Tag ist optional aber bevorzugt. Benutze + für mehrere Tags. | `{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 e.Channel.SendMessage("`Keine Ergebnisse.`");
                    }
                    else
                    {
                        await e.Channel.SendMessage(link).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "pony")
                .Alias(Prefix + "broni")
                .Description($"Shows a random image from bronibooru with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `{Prefix}pony scootaloo`")
                .Parameter("tag", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var tag   = e.GetArg("tag")?.Trim() ?? "";
                    var broni = await SearchHelper.GetBronibooruImageLink(tag).ConfigureAwait(false);
                    if (broni != null)
                    {
                        await e.Channel.SendMessage("Bronibooru: " + broni).ConfigureAwait(false);
                    }
                    await e.Channel.SendMessage("Search yielded no results.");
                });

                cgb.CreateCommand(Prefix + "wiki")
                .Description("Gibt einen Wikipedia-Link zurück.")
                .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 e.Channel.SendMessage("`Diese Seite konnte nicht gefunden werden.`");
                    }
                    else
                    {
                        await e.Channel.SendMessage(data.Query.Pages[0].FullUrl);
                    }
                });

                cgb.CreateCommand(Prefix + "clr")
                .Description($"Zeigt dir die zum Hex zugehörige Farbe.\n**Benutzung**: `{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($"Erstellt einen privaten <http://www.appear.in> Video Anruf Link für dich und andere erwähnte Personen. Der Link wird allen erwähnten Personen per persönlicher Nachricht geschickt. | `{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($"Zeigt den Avatar einer erwähnten Person. | `{Prefix}av @X`")
                .Do(async e =>
                {
                    var usr = e.Channel.FindUsers(e.GetArg("mention")).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("Ungültiger Benutzer.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(await usr.AvatarUrl.ShortenUrl()).ConfigureAwait(false);
                });
            });
        }
 public void GetFilmThreads()
 {
     var threads = new ImdbScraper().GetFilmThreads("tt2103281");
     Assert.AreEqual(10, threads.Count);
 }
        public void GetFilmThreads()
        {
            var threads = new ImdbScraper().GetFilmThreads("tt2103281");

            Assert.AreEqual(10, threads.Count);
        }