2016-08-15 23:38:28 +00:00
using Discord ;
using Discord.Commands ;
using Newtonsoft.Json ;
using Newtonsoft.Json.Linq ;
using System ;
using System.Linq ;
2016-11-06 21:04:24 +00:00
using System.Text ;
2016-08-15 23:38:28 +00:00
using System.Net.Http ;
using NadekoBot.Services ;
using System.Threading.Tasks ;
using NadekoBot.Attributes ;
using System.Text.RegularExpressions ;
2016-08-16 12:11:45 +00:00
using System.Net ;
2016-08-20 20:35:27 +00:00
using NadekoBot.Modules.Searches.Models ;
2016-09-14 01:38:44 +00:00
using System.Collections.Generic ;
using ImageProcessorCore ;
using NadekoBot.Extensions ;
using System.IO ;
2016-10-15 21:11:45 +00:00
using NadekoBot.Modules.Searches.Commands.OMDB ;
2016-08-15 23:38:28 +00:00
namespace NadekoBot.Modules.Searches
{
2016-09-10 19:45:12 +00:00
[NadekoModule("Searches", "~")]
2016-08-20 17:38:55 +00:00
public partial class Searches : DiscordModule
2016-08-15 23:38:28 +00:00
{
2016-08-21 14:16:11 +00:00
private IGoogleApiService _google { get ; }
2016-08-16 12:11:45 +00:00
2016-09-30 03:58:44 +00:00
public Searches ( ILocalization loc , CommandService cmds , ShardedDiscordClient client , IGoogleApiService youtube ) : base ( loc , cmds , client )
2016-08-15 23:38:28 +00:00
{
2016-08-21 14:16:11 +00:00
_google = youtube ;
2016-08-15 23:38:28 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Weather ( IUserMessage umsg , string city , string country )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
city = city . Replace ( " " , "" ) ;
country = city . Replace ( " " , "" ) ;
string response ;
using ( var http = new HttpClient ( ) )
2016-10-10 00:27:33 +00:00
response = await http . GetStringAsync ( $"http://api.ninetales.us/nadekobot/weather/?city={city}&country={country}" ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
var obj = JObject . Parse ( response ) [ "weather" ] ;
2016-08-20 14:33:18 +00:00
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);
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Youtube ( IUserMessage umsg , [ Remainder ] string query = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-09-13 16:12:27 +00:00
if ( ! ( await ValidateQuery ( channel , query ) . ConfigureAwait ( false ) ) ) return ;
2016-08-21 22:37:39 +00:00
var result = ( await _google . GetVideosByKeywordsAsync ( query , 1 ) ) . FirstOrDefault ( ) ;
2016-08-16 12:11:45 +00:00
if ( string . IsNullOrWhiteSpace ( result ) )
2016-08-15 23:38:28 +00:00
{
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "No results found for that query." ) ;
2016-08-15 23:38:28 +00:00
return ;
}
2016-08-20 22:47:39 +00:00
await channel . SendMessageAsync ( result ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Imdb ( IUserMessage umsg , [ Remainder ] string query = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
2016-09-13 16:12:27 +00:00
if ( ! ( await ValidateQuery ( channel , query ) . ConfigureAwait ( false ) ) ) return ;
2016-08-28 02:33:09 +00:00
await umsg . Channel . TriggerTypingAsync ( ) . ConfigureAwait ( false ) ;
2016-10-15 21:11:45 +00:00
var movie = await OmdbProvider . FindMovie ( query ) ;
if ( movie = = null )
2016-08-15 23:38:28 +00:00
{
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "Failed to find that movie." ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
return ;
}
2016-10-15 21:11:45 +00:00
await channel . SendMessageAsync ( movie . ToString ( ) ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task RandomCat ( IUserMessage umsg )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
using ( var http = new HttpClient ( ) )
{
2016-08-20 14:33:18 +00:00
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 ) ;
}
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task RandomDog ( IUserMessage umsg )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
using ( var http = new HttpClient ( ) )
{
2016-08-20 14:33:18 +00:00
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
}
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task I ( IUserMessage umsg , [ Remainder ] string query = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
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 ) ) ;
2016-08-20 14:33:18 +00:00
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)" ) )
{
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "Daily limit reached!" ) ;
2016-08-15 23:38:28 +00:00
}
else
{
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "Something went wrong." ) ;
2016-08-15 23:38:28 +00:00
}
}
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Ir ( IUserMessage umsg , [ Remainder ] string query = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
if ( string . IsNullOrWhiteSpace ( query ) )
return ;
try
{
using ( var http = new HttpClient ( ) )
{
2016-09-10 19:40:25 +00:00
var rng = new NadekoRandom ( ) ;
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 ;
2016-08-20 14:33:18 +00:00
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)" ) )
{
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "Daily limit reached!" ) ;
2016-08-15 23:38:28 +00:00
}
else
{
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "Something went wrong." ) ;
2016-08-15 23:38:28 +00:00
}
}
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Lmgtfy ( IUserMessage umsg , [ Remainder ] string ffs = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
if ( string . IsNullOrWhiteSpace ( ffs ) )
return ;
2016-08-21 14:16:11 +00:00
await channel . SendMessageAsync ( await _google . ShortenUrl ( $"<http://lmgtfy.com/?q={ Uri.EscapeUriString(ffs) }>" ) )
2016-08-15 23:38:28 +00:00
. ConfigureAwait ( false ) ;
}
2016-11-09 06:30:20 +00:00
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task Shorten ( IUserMessage msg , [ Remainder ] string arg )
{
if ( string . IsNullOrWhiteSpace ( arg ) )
return ;
await msg . Channel . SendMessageAsync ( await NadekoBot . Google . ShortenUrl ( arg ) . ConfigureAwait ( false ) ) ;
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Google ( IUserMessage umsg , [ Remainder ] string terms = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
terms = terms ? . Trim ( ) ;
if ( string . IsNullOrWhiteSpace ( terms ) )
return ;
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( $"https://google.com/search?q={ WebUtility.UrlEncode(terms).Replace(' ', '+') }" )
2016-08-15 23:38:28 +00:00
. ConfigureAwait ( false ) ;
}
2016-09-14 12:34:10 +00:00
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-09-14 01:38:44 +00:00
[RequireContext(ContextType.Guild)]
public async Task Hearthstone ( IUserMessage umsg , [ Remainder ] string name = null )
{
var channel = ( ITextChannel ) umsg . Channel ;
var arg = name ;
if ( string . IsNullOrWhiteSpace ( arg ) )
{
2016-11-08 21:05:04 +00:00
await channel . SendMessageAsync ( "💢 `Please enter a card name to search for.`" ) . ConfigureAwait ( false ) ;
2016-09-14 01:38:44 +00:00
return ;
}
2016-11-08 21:05:04 +00:00
if ( string . IsNullOrWhiteSpace ( NadekoBot . Credentials . MashapeKey ) )
{
await channel . SendMessageAsync ( "💢 `Bot owner didn't specify MashapeApiKey. You can't use this functionality.`" ) . ConfigureAwait ( false ) ;
return ;
}
2016-09-14 01:38:44 +00:00
await umsg . 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)}" )
. 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" ) ;
2016-09-16 17:20:37 +00:00
foreach ( var item in items . Where ( item = > item . HasValues & & item [ "img" ] ! = null ) . Take ( 4 ) )
2016-09-14 01:38:44 +00:00
{
2016-10-28 08:04:15 +00:00
using ( var sr = await http . GetStreamAsync ( item [ "img" ] . ToString ( ) ) )
2016-09-14 01:38:44 +00:00
{
var imgStream = new MemoryStream ( ) ;
await sr . CopyToAsync ( imgStream ) ;
imgStream . Position = 0 ;
images . Add ( new Image ( imgStream ) ) ;
}
}
string msg = null ;
if ( items . Count > 4 )
{
msg = "⚠ Found over 4 images. Showing random 4." ;
}
var ms = new MemoryStream ( ) ;
images . Merge ( ) . SaveAsPng ( ms ) ;
ms . Position = 0 ;
await channel . SendFileAsync ( ms , arg + ".png" , msg ) . ConfigureAwait ( false ) ;
}
catch ( Exception ex )
{
await channel . SendMessageAsync ( $"💢 Error {ex.Message}" ) . ConfigureAwait ( false ) ;
}
}
}
2016-08-15 23:38:28 +00:00
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-10-08 09:55:56 +00:00
public async Task UrbanDict ( IUserMessage umsg , [ Remainder ] string query = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
2016-11-08 21:05:04 +00:00
if ( string . IsNullOrWhiteSpace ( NadekoBot . Credentials . MashapeKey ) )
{
await channel . SendMessageAsync ( "💢 `Bot owner didn't specify MashapeApiKey. You can't use this functionality.`" ) . ConfigureAwait ( false ) ;
return ;
}
2016-08-15 23:38:28 +00:00
var arg = query ;
if ( string . IsNullOrWhiteSpace ( arg ) )
{
2016-11-08 21:05:04 +00:00
await channel . SendMessageAsync ( "💢 `Please enter a search term.`" ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
return ;
}
2016-08-28 02:33:09 +00:00
await umsg . Channel . TriggerTypingAsync ( ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
using ( var http = new HttpClient ( ) )
{
http . DefaultRequestHeaders . Clear ( ) ;
http . DefaultRequestHeaders . Add ( "X-Mashape-Key" , NadekoBot . Credentials . MashapeKey ) ;
2016-08-16 12:11:45 +00:00
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 ) ;
2016-11-06 21:04:24 +00:00
var sb = new StringBuilder ( ) ;
2016-08-15 23:38:28 +00:00
sb . AppendLine ( $"`Term:` {items[" list "][0][" word "].ToString()}" ) ;
sb . AppendLine ( $"`Definition:` {items[" list "][0][" definition "].ToString()}" ) ;
2016-08-21 14:16:11 +00:00
sb . Append ( $"`Link:` <{await _google.ShortenUrl(items[" list "][0][" permalink "].ToString()).ConfigureAwait(false)}>" ) ;
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( sb . ToString ( ) ) ;
2016-08-15 23:38:28 +00:00
}
catch
{
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "💢 Failed finding a definition for that term." ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
}
}
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Hashtag ( IUserMessage umsg , [ Remainder ] string query = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
var arg = query ;
if ( string . IsNullOrWhiteSpace ( arg ) )
{
2016-11-08 21:05:04 +00:00
await channel . SendMessageAsync ( "💢 `Please enter a search term.`" ) . ConfigureAwait ( false ) ;
return ;
}
if ( string . IsNullOrWhiteSpace ( NadekoBot . Credentials . MashapeKey ) )
{
await channel . SendMessageAsync ( "💢 `Bot owner didn't specify MashapeApiKey. You can't use this functionality.`" ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
return ;
}
2016-11-08 21:05:04 +00:00
2016-08-28 02:33:09 +00:00
await umsg . Channel . TriggerTypingAsync ( ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
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 ( ) }
2016-08-21 14:16:11 +00:00
` Link : ` < { await _google . ShortenUrl ( items [ "defs" ] [ "def" ] [ "uri" ] . ToString ( ) ) . ConfigureAwait ( false ) } > ";
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( str ) ;
2016-08-15 23:38:28 +00:00
}
catch
{
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "💢 Failed finding a definition for that tag." ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
}
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Catfact ( IUserMessage umsg )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
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 ;
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( $"🐈 `{JObject.Parse(response)[" facts "][0].ToString()}`" ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
}
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-10-19 10:59:17 +00:00
public async Task Revav ( IUserMessage umsg , [ Remainder ] IUser usr = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
2016-10-19 10:59:17 +00:00
if ( usr = = null )
usr = umsg . Author ;
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( $"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}" ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Revimg ( IUserMessage umsg , [ Remainder ] string imageLink = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
imageLink = imageLink ? . Trim ( ) ? ? "" ;
if ( string . IsNullOrWhiteSpace ( imageLink ) )
return ;
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( $"https://images.google.com/searchbyimage?image_url={imageLink}" ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Safebooru ( IUserMessage umsg , [ Remainder ] string tag = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
tag = tag ? . Trim ( ) ? ? "" ;
var link = await GetSafebooruImageLink ( tag ) . ConfigureAwait ( false ) ;
if ( link = = null )
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "`No results.`" ) ;
2016-08-15 23:38:28 +00:00
else
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( link ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Wiki ( IUserMessage umsg , [ Remainder ] string query = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
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 )
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "`That page could not be found.`" ) ;
2016-08-15 23:38:28 +00:00
else
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( data . Query . Pages [ 0 ] . FullUrl ) ;
2016-08-15 23:38:28 +00:00
}
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-09-14 12:34:10 +00:00
[RequireContext(ContextType.Guild)]
2016-10-08 09:55:56 +00:00
public async Task Color ( IUserMessage umsg , [ Remainder ] string color = null )
2016-09-14 12:34:10 +00:00
{
var channel = ( ITextChannel ) umsg . Channel ;
color = color ? . Trim ( ) . Replace ( "#" , "" ) ;
if ( string . IsNullOrWhiteSpace ( ( string ) color ) )
return ;
var img = new Image ( 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 ) ;
img . BackgroundColor ( new ImageProcessorCore . Color ( color ) ) ;
await channel . SendFileAsync ( img . ToStream ( ) , $"{color}.png" ) ;
}
2016-08-15 23:38:28 +00:00
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Videocall ( IUserMessage umsg , [ Remainder ] string arg = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
try
{
2016-08-28 02:33:09 +00:00
var allUsrs = umsg . MentionedUsers . Append ( umsg . Author ) ;
2016-08-15 23:38:28 +00:00
var allUsrsArray = allUsrs . ToArray ( ) ;
2016-08-16 05:56:32 +00:00
var str = allUsrsArray . Aggregate ( "http://appear.in/" , ( current , usr ) = > current + Uri . EscapeUriString ( usr . Username [ 0 ] . ToString ( ) ) ) ;
2016-09-10 19:40:25 +00:00
str + = new NadekoRandom ( ) . Next ( ) ;
2016-08-15 23:38:28 +00:00
foreach ( var usr in allUsrsArray )
{
await ( await ( usr as IGuildUser ) . CreateDMChannelAsync ( ) ) . SendMessageAsync ( str ) . ConfigureAwait ( false ) ;
}
}
catch ( Exception ex )
{
Console . WriteLine ( ex ) ;
}
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 23:38:28 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task Avatar ( IUserMessage umsg , [ Remainder ] string mention = null )
2016-08-15 23:38:28 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-15 23:38:28 +00:00
2016-08-28 02:33:09 +00:00
var usr = umsg . MentionedUsers . FirstOrDefault ( ) ;
2016-08-15 23:38:28 +00:00
if ( usr = = null )
{
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( "Invalid user specified." ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
return ;
}
2016-08-21 14:16:11 +00:00
await channel . SendMessageAsync ( await _google . ShortenUrl ( usr . AvatarUrl ) . ConfigureAwait ( false ) ) . ConfigureAwait ( false ) ;
2016-08-15 23:38:28 +00:00
}
public static async Task < string > GetSafebooruImageLink ( string tag )
{
2016-09-10 19:40:25 +00:00
var rng = new NadekoRandom ( ) ;
2016-08-15 23:38:28 +00:00
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 ;
}
}
2016-11-11 13:05:52 +00:00
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task BFO ( IUserMessage umsg , [ Remainder ] string game = null )
{
var channel = ( ITextChannel ) umsg . Channel ;
if ( string . IsNullOrWhiteSpace ( game ) )
{
await channel . SendMessageAsync ( "💢 Please enter a game `(bf3, bf4)`" ) . ConfigureAwait ( false ) ;
return ;
}
await umsg . Channel . TriggerTypingAsync ( ) . ConfigureAwait ( false ) ;
using ( var http = new HttpClient ( ) )
{
http . DefaultRequestHeaders . Clear ( ) ;
try
{
if ( game . Equals ( "bf3" , StringComparison . OrdinalIgnoreCase ) )
{
var res = await http . GetStringAsync ( $"http://api.bf3stats.com/global/onlinestats/" ) . ConfigureAwait ( false ) ;
var items = JObject . Parse ( res ) ;
var sb = new StringBuilder ( ) ;
var status = items [ "status" ] ;
var x360 = items [ "360" ] ;
var ps3 = items [ "ps3" ] ;
var pc = items [ "pc" ] ;
2016-11-12 23:50:39 +00:00
var response = $ @ "```css
[☕ BF3 Status: {status.ToString().ToUpper()}]
XBOX360 : ✔ [ { x360 . ToString ( ) } ]
PS3 : ✔ [ { ps3 . ToString ( ) } ]
PC : ✔ [ { pc . ToString ( ) } ]
` ` ` ";
await channel . SendMessageAsync ( response ) ;
2016-11-11 13:05:52 +00:00
}
else if ( game . Equals ( "bf4" , StringComparison . OrdinalIgnoreCase ) )
{
var res = await http . GetStringAsync ( $"http://api.bf4stats.com/api/onlinePlayers?output=json" ) . ConfigureAwait ( false ) ;
var items = JObject . Parse ( res ) ;
var sb = new StringBuilder ( ) ;
var status = ! string . IsNullOrEmpty ( items . ToString ( ) ) ? "OK" : "BAD" ;
var pc = items [ "pc" ] ;
var ps3 = items [ "ps3" ] ;
var ps4 = items [ "ps4" ] ;
var xbox = items [ "xbox" ] ;
var xone = items [ "xone" ] ;
sb . AppendLine ( "```css" ) ;
sb . AppendLine ( $"[☕ BF4 Status: {status}]" ) ;
foreach ( var i in items ) {
var plat = items [ i . Key ] ;
sb . AppendLine ( $"{plat[" label "]}: ✔[{plat[" count "]}] / ↑[{plat[" peak24 "]}]" ) ;
}
sb . Append ( "```" ) ;
await channel . SendMessageAsync ( sb . ToString ( ) ) ;
}
} catch
{
await channel . SendMessageAsync ( $"💢 BF3/BF4 API is most likely not working at the moment or could not find {game}." ) . ConfigureAwait ( false ) ;
}
}
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task BFU ( IUserMessage umsg , string platform , string game , [ Remainder ] string query = null )
{
var channel = ( ITextChannel ) umsg . Channel ;
if ( string . IsNullOrWhiteSpace ( platform ) | | string . IsNullOrWhiteSpace ( game ) | | string . IsNullOrWhiteSpace ( query ) )
{
await channel . SendMessageAsync ( "💢 Please enter a platform `(pc, xbox, ps3, xone, ps4)`, game `(bf3, bf4)`, followed by a search query." ) . ConfigureAwait ( false ) ;
return ;
}
await umsg . Channel . TriggerTypingAsync ( ) . ConfigureAwait ( false ) ;
using ( var http = new HttpClient ( ) )
{
http . DefaultRequestHeaders . Clear ( ) ;
try
{
if ( game . Equals ( "bf3" , StringComparison . OrdinalIgnoreCase ) )
{
var res = await http . GetStringAsync ( $"http://api.bf3stats.com/{Uri.EscapeUriString(platform)}/playerlist/players={Uri.EscapeUriString(query)}?output=json" ) . ConfigureAwait ( false ) ;
var items = JObject . Parse ( res ) ;
var sb = new StringBuilder ( ) ;
var playerName = items [ "list" ] [ query ] ;
var playerTag = playerName [ "tag" ] ;
var playerCountryName = playerName [ "country_name" ] ;
var playerStats = playerName [ "stats" ] ;
var playerRank = playerStats [ "rank" ] ;
var playerRank_name = playerRank [ "name" ] ;
var playerGlobal_Kills = playerStats [ "global" ] [ "kills" ] ;
var playerGlobal_Deaths = playerStats [ "global" ] [ "deaths" ] ;
var playerGlobal_KD = Math . Round ( Double . Parse ( playerGlobal_Kills . ToString ( ) ) / Double . Parse ( playerGlobal_Deaths . ToString ( ) ) , 2 ) ;
var playerGlobal_Wins = playerStats [ "global" ] [ "wins" ] ;
var playerGlobal_Losses = playerStats [ "global" ] [ "losses" ] ;
var playerGlobal_WL = Math . Round ( Double . Parse ( playerGlobal_Wins . ToString ( ) ) / Double . Parse ( playerGlobal_Losses . ToString ( ) ) , 2 ) ;
var playerGlobal_Shots = playerStats [ "global" ] [ "shots" ] ;
var playerGlobal_Hits = playerStats [ "global" ] [ "hits" ] ;
var playerGlobal_Accuracy = Math . Round ( Double . Parse ( playerGlobal_Hits . ToString ( ) ) / Double . Parse ( playerGlobal_Shots . ToString ( ) ) , 2 ) ;
var playerGlobal_ELO = playerStats [ "global" ] [ "elo" ] ;
2016-11-12 23:50:39 +00:00
var response = $ @ "```css
[☕ BF3 Player: {query}]
Platform : [ { platform . ToUpper ( ) } ]
Tag : [ { playerTag . ToString ( ) } ]
K / D : [ { playerGlobal_KD . ToString ( ) } ]
W / L : [ { playerGlobal_WL . ToString ( ) } ]
Accuracy : % [ { playerGlobal_Accuracy . ToString ( ) } ]
ELO : [ { playerGlobal_ELO . ToString ( ) } ]
` ` ` ";
await channel . SendMessageAsync ( response ) ;
2016-11-11 13:05:52 +00:00
} else if ( game . Equals ( "bf4" , StringComparison . OrdinalIgnoreCase ) )
{
var res = await http . GetStringAsync ( $"http://api.bf4stats.com/api/playerInfo?plat={Uri.EscapeUriString(platform)}&name={Uri.EscapeUriString(query)}&output=json" ) . ConfigureAwait ( false ) ;
var items = JObject . Parse ( res ) ;
var sb = new StringBuilder ( ) ;
var player = items [ "player" ] ;
var playerStats = items [ "stats" ] ;
var playerName = player [ "name" ] ;
var playerTag = player [ "tag" ] ;
var playerPlatform = player [ "plat" ] ;
var playerKills = playerStats [ "kills" ] ;
var playerDeaths = playerStats [ "deaths" ] ;
var player_KD = Math . Round ( Double . Parse ( playerKills . ToString ( ) ) / Double . Parse ( playerDeaths . ToString ( ) ) , 2 ) ;
var playerWins = playerStats [ "numWins" ] ;
var playerRounds = playerStats [ "numRounds" ] ;
var player_WL = Math . Round ( Double . Parse ( playerWins . ToString ( ) ) / Double . Parse ( playerRounds . ToString ( ) ) , 2 ) ;
var shotsFired = playerStats [ "shotsFired" ] ;
var shotsHit = playerStats [ "shotsHit" ] ;
var accuracy = Math . Round ( Double . Parse ( shotsHit . ToString ( ) ) / Double . Parse ( shotsFired . ToString ( ) ) , 2 ) ;
var playerELO = playerStats [ "elo" ] ;
2016-11-12 23:50:39 +00:00
var response = $ @ "```css
[☕ BF4 Player: {playerName.ToString()}]
Platform : [ { playerPlatform . ToString ( ) . ToUpper ( ) } ]
Tag : [ { playerTag . ToString ( ) } ]
K / D : [ { player_KD . ToString ( ) } ]
W / L : [ { player_WL . ToString ( ) } ]
Accuracy : % [ { accuracy . ToString ( ) } ]
ELO : [ { playerELO . ToString ( ) } ]
` ` ` ";
await channel . SendMessageAsync ( response ) ;
2016-11-11 13:05:52 +00:00
}
}
catch
{
await channel . SendMessageAsync ( $"💢 BF3/BF4 API is most likely not working at the moment or could not find {query}." ) . ConfigureAwait ( false ) ;
}
}
}
2016-11-09 18:28:26 +00:00
2016-11-06 22:58:04 +00:00
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
2016-11-09 16:59:44 +00:00
public async Task Wikia ( IUserMessage umsg , string target , [ Remainder ] string query = null )
2016-11-06 22:58:04 +00:00
{
var channel = ( ITextChannel ) umsg . Channel ;
2016-11-09 16:59:44 +00:00
if ( string . IsNullOrWhiteSpace ( target ) | | string . IsNullOrWhiteSpace ( query ) )
2016-11-06 22:58:04 +00:00
{
2016-11-09 18:28:26 +00:00
await channel . SendMessageAsync ( "💢 Please enter a target wikia, followed by search query." ) . ConfigureAwait ( false ) ;
2016-11-06 22:58:04 +00:00
return ;
}
await umsg . Channel . TriggerTypingAsync ( ) . ConfigureAwait ( false ) ;
using ( var http = new HttpClient ( ) )
{
http . DefaultRequestHeaders . Clear ( ) ;
2016-11-09 18:28:26 +00:00
try
2016-11-06 22:58:04 +00:00
{
2016-11-09 18:28:26 +00:00
var res = await http . GetStringAsync ( $"http://www.{Uri.EscapeUriString(target)}.wikia.com/api/v1/Search/List?query={Uri.EscapeUriString(query)}&limit=25&minArticleQuality=10&batch=1&namespaces=0%2C14" ) . ConfigureAwait ( false ) ;
2016-11-06 22:58:04 +00:00
var items = JObject . Parse ( res ) ;
2016-11-09 18:28:26 +00:00
var found = items [ "items" ] [ 0 ] ;
var response = $@"`Title:` {found[" title "].ToString()}
` Quality : ` { found [ "quality" ] }
` URL : ` { await NadekoBot . Google . ShortenUrl ( found [ "url" ] . ToString ( ) ) . ConfigureAwait ( false ) } ";
2016-11-09 16:59:44 +00:00
await channel . SendMessageAsync ( response ) ;
2016-11-06 22:58:04 +00:00
}
catch
{
2016-11-09 16:59:44 +00:00
await channel . SendMessageAsync ( $"💢 Failed finding `{query}`." ) . ConfigureAwait ( false ) ;
2016-11-06 22:58:04 +00:00
}
}
}
2016-08-15 23:38:28 +00:00
2016-11-06 21:04:24 +00:00
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task MCPing ( IUserMessage umsg , [ Remainder ] string query = null )
{
var channel = ( ITextChannel ) umsg . Channel ;
var arg = query ;
if ( string . IsNullOrWhiteSpace ( arg ) )
{
await channel . SendMessageAsync ( "💢 Please enter a `ip:port`." ) . ConfigureAwait ( false ) ;
return ;
}
await umsg . Channel . TriggerTypingAsync ( ) . ConfigureAwait ( false ) ;
using ( var http = new HttpClient ( ) )
{
http . DefaultRequestHeaders . Clear ( ) ;
string ip = arg . Split ( ':' ) [ 0 ] ;
string port = arg . Split ( ':' ) [ 1 ] ;
var res = await http . GetStringAsync ( $"https://api.minetools.eu/ping/{Uri.EscapeUriString(ip)}/{Uri.EscapeUriString(port)}" ) . ConfigureAwait ( false ) ;
try
{
var items = JObject . Parse ( res ) ;
var sb = new StringBuilder ( ) ;
int ping = ( int ) Math . Ceiling ( Double . Parse ( items [ "latency" ] . ToString ( ) ) ) ;
sb . AppendLine ( $"`Server:` {arg}" ) ;
sb . AppendLine ( $"`Version:` {items[" version "][" name "].ToString()} / Protocol {items[" version "][" protocol "].ToString()}" ) ;
sb . AppendLine ( $"`Description:` {items[" description "].ToString()}" ) ;
sb . AppendLine ( $"`Online Players:` {items[" players "][" online "].ToString()}/{items[" players "][" max "].ToString()}" ) ;
sb . Append ( $"`Latency:` {ping}" ) ;
await channel . SendMessageAsync ( sb . ToString ( ) ) ;
}
catch
{
await channel . SendMessageAsync ( $"💢 Failed finding `{arg}`." ) . ConfigureAwait ( false ) ;
}
}
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task MCQ ( IUserMessage umsg , [ Remainder ] string query = null )
{
var channel = ( ITextChannel ) umsg . Channel ;
var arg = query ;
if ( string . IsNullOrWhiteSpace ( arg ) )
{
await channel . SendMessageAsync ( "💢 Please enter a `ip:port`." ) . ConfigureAwait ( false ) ;
return ;
}
await umsg . Channel . TriggerTypingAsync ( ) . ConfigureAwait ( false ) ;
using ( var http = new HttpClient ( ) )
{
http . DefaultRequestHeaders . Clear ( ) ;
try
{
string ip = arg . Split ( ':' ) [ 0 ] ;
string port = arg . Split ( ':' ) [ 1 ] ;
var res = await http . GetStringAsync ( $"https://api.minetools.eu/query/{Uri.EscapeUriString(ip)}/{Uri.EscapeUriString(port)}" ) . ConfigureAwait ( false ) ;
var items = JObject . Parse ( res ) ;
var sb = new StringBuilder ( ) ;
sb . AppendLine ( $"`Server:` {arg.ToString()} 〘Status: {items[" status "]}〙" ) ;
2016-11-06 22:29:32 +00:00
sb . AppendLine ( $"`Player List (First 5):`" ) ;
foreach ( var item in items [ "Playerlist" ] . Take ( 5 ) )
2016-11-06 21:04:24 +00:00
{
2016-11-06 22:29:32 +00:00
sb . AppendLine ( $"〔 :rosette: {item}〕 " ) ;
2016-11-06 21:04:24 +00:00
}
sb . AppendLine ( $"`Online Players:` {items[" Players "]} / {items[" MaxPlayers "]}" ) ;
sb . AppendLine ( $"`Plugins:` {items[" Plugins "]}" ) ;
sb . Append ( $"`Version:` {items[" Version "]}" ) ;
await channel . SendMessageAsync ( sb . ToString ( ) ) ;
}
catch
{
await channel . SendMessageAsync ( $"💢 Failed finding server `{arg}`." ) . ConfigureAwait ( false ) ;
}
}
}
2016-08-15 23:38:28 +00:00
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
}