NadekoBot/src/NadekoBot/Modules/Searches/Searches.cs

492 lines
21 KiB
C#
Raw Normal View History

2016-08-15 23:38:28 +00:00
using Discord;
using Discord.Commands;
using NadekoBot.Modules.Searches.Commands.IMDB;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Linq;
using System.Net.Http;
using NadekoBot.Services;
using System.Threading.Tasks;
using NadekoBot.Attributes;
using NadekoBot.Extensions;
using System.Text.RegularExpressions;
using System.Net;
using NadekoBot.Modules.Searches.Commands.Models;
2016-08-15 23:38:28 +00:00
namespace NadekoBot.Modules.Searches
{
[Module("~", AppendSpace = false)]
2016-08-18 21:00:54 +00:00
public class Searches : DiscordModule
2016-08-15 23:38:28 +00:00
{
private IYoutubeService _yt { get; }
2016-08-18 21:00:54 +00:00
public Searches(ILocalization loc, CommandService cmds, IBotConfiguration config, IDiscordClient client, IYoutubeService youtube) : base(loc, cmds, config, client)
2016-08-15 23:38:28 +00:00
{
_yt = youtube;
2016-08-15 23:38:28 +00:00
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
public async Task Weather(IMessage imsg, string city, string country)
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
city = city.Replace(" ", "");
country = city.Replace(" ", "");
string response;
using (var http = new HttpClient())
response = await http.GetStringAsync($"http://api.lawlypopzz.xyz/nadekobot/weather/?city={city}&country={country}").ConfigureAwait(false);
var obj = JObject.Parse(response)["weather"];
await channel.SendMessageAsync(
2016-08-15 23:38:28 +00:00
$@"🌍 **Weather for** 【{obj["target"]}】
📏 **Lat,Long:** ({obj["latitude"]}, {obj["longitude"]}) **Condition:** {obj["condition"]}
😓 **Humidity:** {obj["humidity"]}% 💨 **Wind Speed:** {obj["windspeedk"]}km/h / {obj["windspeedm"]}mph
🔆 **Temperature:** {obj["centigrade"]}°C / {obj["fahrenheit"]}°F 🔆 **Feels like:** {obj["feelscentigrade"]}°C / {obj["feelsfahrenheit"]}°F
🌄 **Sunrise:** {obj["sunrise"]} 🌇 **Sunset:** {obj["sunset"]}").ConfigureAwait(false);
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Youtube(IMessage imsg, [Remainder] string query = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
if (!(await ValidateQuery(imsg.Channel as ITextChannel, query).ConfigureAwait(false))) return;
var result = (await _yt.FindVideosByKeywordsAsync(query, 1)).FirstOrDefault();
if (string.IsNullOrWhiteSpace(result))
2016-08-15 23:38:28 +00:00
{
await channel.SendMessageAsync("No results found for that query.");
2016-08-15 23:38:28 +00:00
return;
}
var shortUrl = await result.ShortenUrl().ConfigureAwait(false);
await channel.SendMessageAsync(shortUrl).ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Imdb(IMessage imsg, [Remainder] string query = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
if (!(await ValidateQuery(imsg.Channel as ITextChannel, query).ConfigureAwait(false))) return;
await imsg.Channel.TriggerTypingAsync().ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
string result;
try
{
var movie = await ImdbScraper.ImdbScrape(query, true);
2016-08-15 23:38:28 +00:00
if (movie.Status) result = movie.ToString();
else result = "Failed to find that movie.";
}
catch
{
await channel.SendMessageAsync("Failed to find that movie.").ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
return;
}
await channel.SendMessageAsync(result.ToString()).ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
public async Task RandomCat(IMessage imsg)
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
using (var http = new HttpClient())
{
await channel.SendMessageAsync(JObject.Parse(
2016-08-15 23:38:28 +00:00
await http.GetStringAsync("http://www.random.cat/meow").ConfigureAwait(false))["file"].ToString())
.ConfigureAwait(false);
}
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
public async Task RandomDog(IMessage imsg)
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
using (var http = new HttpClient())
{
await channel.SendMessageAsync("http://random.dog/" + await http.GetStringAsync("http://random.dog/woof").ConfigureAwait(false)).ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task I(IMessage imsg, [Remainder] string query = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
if (string.IsNullOrWhiteSpace(query))
return;
try
{
using (var http = new HttpClient())
{
var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(query)}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&fields=items%2Flink&key={NadekoBot.Credentials.GoogleApiKey}";
var obj = JObject.Parse(await http.GetStringAsync(reqString).ConfigureAwait(false));
await channel.SendMessageAsync(obj["items"][0]["link"].ToString()).ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
}
catch (HttpRequestException exception)
{
if (exception.Message.Contains("403 (Forbidden)"))
{
await channel.SendMessageAsync("Daily limit reached!");
2016-08-15 23:38:28 +00:00
}
else
{
await channel.SendMessageAsync("Something went wrong.");
2016-08-15 23:38:28 +00:00
}
}
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Ir(IMessage imsg, [Remainder] string query = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
if (string.IsNullOrWhiteSpace(query))
return;
try
{
using (var http = new HttpClient())
{
2016-08-20 14:02:06 +00:00
var rng = new Random();
2016-08-15 23:38:28 +00:00
var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(query)}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&start={ rng.Next(1, 50) }&fields=items%2Flink&key={NadekoBot.Credentials.GoogleApiKey}";
var obj = JObject.Parse(await http.GetStringAsync(reqString).ConfigureAwait(false));
var items = obj["items"] as JArray;
await channel.SendMessageAsync(items[0]["link"].ToString()).ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
}
catch (HttpRequestException exception)
{
if (exception.Message.Contains("403 (Forbidden)"))
{
await channel.SendMessageAsync("Daily limit reached!");
2016-08-15 23:38:28 +00:00
}
else
{
await channel.SendMessageAsync("Something went wrong.");
2016-08-15 23:38:28 +00:00
}
}
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Lmgtfy(IMessage imsg, [Remainder] string ffs = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
if (string.IsNullOrWhiteSpace(ffs))
return;
await channel.SendMessageAsync(await $"<http://lmgtfy.com/?q={ Uri.EscapeUriString(ffs) }>".ShortenUrl())
2016-08-15 23:38:28 +00:00
.ConfigureAwait(false);
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Google(IMessage imsg, [Remainder] string terms = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
terms = terms?.Trim();
if (string.IsNullOrWhiteSpace(terms))
return;
await channel.SendMessageAsync($"https://google.com/search?q={ WebUtility.UrlEncode(terms).Replace(' ', '+') }")
2016-08-15 23:38:28 +00:00
.ConfigureAwait(false);
}
////todo drawing
//[LocalizedCommand, LocalizedDescription, LocalizedSummary]
//[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
//public async Task Hearthstone(IMessage imsg, [Remainder] string name = null)
//{
2016-08-18 15:33:45 +00:00
// var channel = imsg.Channel as ITextChannel;
// var arg = e.GetArg("name");
// if (string.IsNullOrWhiteSpace(arg))
// {
// await channel.SendMessageAsync("💢 Please enter a card name to search for.").ConfigureAwait(false);
// return;
// }
// await imsg.Channel.TriggerTypingAsync().ConfigureAwait(false);
// string response = "";
// using (var http = new HttpClient())
// {
// http.DefaultRequestHeaders.Clear();
// http.DefaultRequestHeaders.Add("X-Mashape-Key", NadekoBot.Credentials.MashapeKey);
// response = await http.GetStringAsync($"https://omgvamp-hearthstone-v1.p.mashape.com/cards/search/{Uri.EscapeUriString(arg)}", headers)
// .ConfigureAwait(false);
// try
// {
// var items = JArray.Parse(response).Shuffle().ToList();
// var images = new List<Image>();
// if (items == null)
// throw new KeyNotFoundException("Cannot find a card by that name");
// var cnt = 0;
// foreach (var item in items.TakeWhile(item => cnt++ < 4).Where(item => item.HasValues && item["img"] != null))
// {
// images.Add(
// Image.FromStream(await http.GetStreamAsync(item["img"].ToString()).ConfigureAwait(false)));
// }
// if (items.Count > 4)
// {
// await channel.SendMessageAsync("⚠ Found over 4 images. Showing random 4.").ConfigureAwait(false);
// }
// await channel.SendMessageAsync(arg + ".png", (await images.MergeAsync()).ToStream(System.Drawing.Imaging.ImageFormat.Png))
// .ConfigureAwait(false);
// }
// catch (Exception ex)
// {
// await channel.SendMessageAsync($"💢 Error {ex.Message}").ConfigureAwait(false);
// }
// }
//}
2016-08-15 23:38:28 +00:00
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task UrbanDictionary(IMessage imsg, [Remainder] string query = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
var arg = query;
if (string.IsNullOrWhiteSpace(arg))
{
await channel.SendMessageAsync("💢 Please enter a search term.").ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
return;
}
await imsg.Channel.TriggerTypingAsync().ConfigureAwait(false);
using (var http = new HttpClient())
{
http.DefaultRequestHeaders.Clear();
http.DefaultRequestHeaders.Add("X-Mashape-Key", NadekoBot.Credentials.MashapeKey);
var res = await http.GetStringAsync($"https://mashape-community-urban-dictionary.p.mashape.com/define?term={Uri.EscapeUriString(arg)}").ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
try
{
var items = JObject.Parse(res);
var sb = new System.Text.StringBuilder();
sb.AppendLine($"`Term:` {items["list"][0]["word"].ToString()}");
sb.AppendLine($"`Definition:` {items["list"][0]["definition"].ToString()}");
sb.Append($"`Link:` <{await items["list"][0]["permalink"].ToString().ShortenUrl().ConfigureAwait(false)}>");
await channel.SendMessageAsync(sb.ToString());
2016-08-15 23:38:28 +00:00
}
catch
{
await channel.SendMessageAsync("💢 Failed finding a definition for that term.").ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
}
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Hashtag(IMessage imsg, [Remainder] string query = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
var arg = query;
if (string.IsNullOrWhiteSpace(arg))
{
await channel.SendMessageAsync("💢 Please enter a search term.").ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
return;
}
await imsg.Channel.TriggerTypingAsync().ConfigureAwait(false);
string res = "";
using (var http = new HttpClient())
{
http.DefaultRequestHeaders.Clear();
http.DefaultRequestHeaders.Add("X-Mashape-Key", NadekoBot.Credentials.MashapeKey);
res = await http.GetStringAsync($"https://tagdef.p.mashape.com/one.{Uri.EscapeUriString(arg)}.json").ConfigureAwait(false);
}
2016-08-16 14:53:38 +00:00
2016-08-15 23:38:28 +00:00
try
{
var items = JObject.Parse(res);
var str = $@"`Hashtag:` {items["defs"]["def"]["hashtag"].ToString()}
`Definition:` {items["defs"]["def"]["text"].ToString()}
`Link:` <{await items["defs"]["def"]["uri"].ToString().ShortenUrl().ConfigureAwait(false)}>";
await channel.SendMessageAsync(str);
2016-08-15 23:38:28 +00:00
}
catch
{
await channel.SendMessageAsync("💢 Failed finding a definition for that tag.").ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
}
//todo DB
//[LocalizedCommand, LocalizedDescription, LocalizedSummary]
//[RequireContext(ContextType.Guild)]
//public async Task Quote(IMessage imsg)
//{
2016-08-18 15:33:45 +00:00
// var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
// var quote = NadekoBot.Config.Quotes[rng.Next(0, NadekoBot.Config.Quotes.Count)].ToString();
// await channel.SendMessageAsync(quote).ConfigureAwait(false);
//}
2016-08-15 23:38:28 +00:00
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
public async Task Catfact(IMessage imsg)
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
using (var http = new HttpClient())
{
var response = await http.GetStringAsync("http://catfacts-api.appspot.com/api/facts").ConfigureAwait(false);
if (response == null)
return;
await channel.SendMessageAsync($"🐈 `{JObject.Parse(response)["facts"][0].ToString()}`").ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Revav(IMessage imsg, [Remainder] string arg = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
var usrStr = arg?.Trim().ToUpperInvariant();
if (string.IsNullOrWhiteSpace(usrStr))
return;
2016-08-16 14:53:38 +00:00
var usr = (await channel.Guild.GetUsersAsync()).Where(u => u.Username.ToUpperInvariant() == usrStr).FirstOrDefault();
2016-08-15 23:38:28 +00:00
if (usr == null || string.IsNullOrWhiteSpace(usr.AvatarUrl))
return;
await channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}").ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Revimg(IMessage imsg, [Remainder] string imageLink = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
imageLink = imageLink?.Trim() ?? "";
if (string.IsNullOrWhiteSpace(imageLink))
return;
await channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={imageLink}").ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Safebooru(IMessage imsg, [Remainder] string tag = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
tag = tag?.Trim() ?? "";
var link = await GetSafebooruImageLink(tag).ConfigureAwait(false);
if (link == null)
await channel.SendMessageAsync("`No results.`");
2016-08-15 23:38:28 +00:00
else
await channel.SendMessageAsync(link).ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Wiki(IMessage imsg, [Remainder] string query = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
query = query?.Trim();
if (string.IsNullOrWhiteSpace(query))
return;
using (var http = new HttpClient())
{
var result = await http.GetStringAsync("https://en.wikipedia.org//w/api.php?action=query&format=json&prop=info&redirects=1&formatversion=2&inprop=url&titles=" + Uri.EscapeDataString(query));
var data = JsonConvert.DeserializeObject<WikipediaApiModel>(result);
if (data.Query.Pages[0].Missing)
await channel.SendMessageAsync("`That page could not be found.`");
2016-08-15 23:38:28 +00:00
else
await channel.SendMessageAsync(data.Query.Pages[0].FullUrl);
2016-08-15 23:38:28 +00:00
}
}
2016-08-16 13:04:49 +00:00
////todo drawing
//[LocalizedCommand, LocalizedDescription, LocalizedSummary]
//[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
//public async Task Clr(IMessage imsg, [Remainder] string color = null)
//{
2016-08-18 15:33:45 +00:00
// var channel = imsg.Channel as ITextChannel;
// color = color?.Trim().Replace("#", "");
// if (string.IsNullOrWhiteSpace((string)color))
// return;
// var img = new Bitmap(50, 50);
// var red = Convert.ToInt32(color.Substring(0, 2), 16);
// var green = Convert.ToInt32(color.Substring(2, 2), 16);
// var blue = Convert.ToInt32(color.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 channel.SendFileAsync("arg1.png", img.ToStream());
//}
2016-08-15 23:38:28 +00:00
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Videocall(IMessage imsg, [Remainder] string arg = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
try
{
var allUsrs = imsg.MentionedUsers.Append(imsg.Author);
var allUsrsArray = allUsrs.ToArray();
var str = allUsrsArray.Aggregate("http://appear.in/", (current, usr) => current + Uri.EscapeUriString(usr.Username[0].ToString()));
2016-08-15 23:38:28 +00:00
str += new Random().Next();
foreach (var usr in allUsrsArray)
{
await (await (usr as IGuildUser).CreateDMChannelAsync()).SendMessageAsync(str).ConfigureAwait(false);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[RequireContext(ContextType.Guild)]
2016-08-18 15:33:45 +00:00
public async Task Avatar(IMessage imsg, [Remainder] string mention = null)
2016-08-15 23:38:28 +00:00
{
2016-08-18 15:33:45 +00:00
var channel = imsg.Channel as ITextChannel;
2016-08-15 23:38:28 +00:00
var usr = imsg.MentionedUsers.FirstOrDefault();
if (usr == null)
{
await channel.SendMessageAsync("Invalid user specified.").ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
return;
}
await channel.SendMessageAsync(await usr.AvatarUrl.ShortenUrl()).ConfigureAwait(false);
2016-08-15 23:38:28 +00:00
}
public static async Task<string> GetSafebooruImageLink(string tag)
{
var rng = new Random();
var url =
$"http://safebooru.org/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}";
using (var http = new HttpClient())
{
var webpage = await http.GetStringAsync(url).ConfigureAwait(false);
var matches = Regex.Matches(webpage, "file_url=\"(?<url>.*?)\"");
if (matches.Count == 0)
return null;
var match = matches[rng.Next(0, matches.Count)];
return matches[rng.Next(0, matches.Count)].Groups["url"].Value;
}
}
public static async Task<bool> ValidateQuery(ITextChannel ch, string query)
{
if (!string.IsNullOrEmpty(query.Trim())) return true;
await ch.SendMessageAsync("Please specify search parameters.").ConfigureAwait(false);
return false;
}
}
2016-08-16 14:53:38 +00:00
}