2016-08-13 18:45:08 +00:00
using Discord ;
using Discord.Commands ;
using NadekoBot.Attributes ;
using System ;
using System.Linq ;
using System.Threading.Tasks ;
2016-08-15 14:57:40 +00:00
using NadekoBot.Services ;
using System.Text ;
using NadekoBot.Extensions ;
using System.Text.RegularExpressions ;
using System.Reflection ;
2016-08-20 20:35:27 +00:00
using Discord.WebSocket ;
2016-08-13 18:45:08 +00:00
namespace NadekoBot.Modules.Utility
{
2016-09-10 19:45:12 +00:00
[NadekoModule("Utility", ".")]
2016-08-18 21:00:54 +00:00
public partial class Utility : DiscordModule
2016-08-13 18:45:08 +00:00
{
2016-09-30 03:58:44 +00:00
public Utility ( ILocalization loc , CommandService cmds , ShardedDiscordClient client ) : base ( loc , cmds , client )
2016-08-15 14:57:40 +00:00
{
2016-08-15 23:38:28 +00:00
2016-08-15 14:57:40 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-13 18:45:08 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task WhosPlaying ( IUserMessage umsg , [ Remainder ] string game = null )
2016-08-13 18:45:08 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-13 18:45:08 +00:00
game = game . Trim ( ) . ToUpperInvariant ( ) ;
if ( string . IsNullOrWhiteSpace ( game ) )
return ;
2016-08-28 02:33:09 +00:00
var arr = ( await ( umsg . Channel as IGuildChannel ) . Guild . GetUsersAsync ( ) )
2016-08-15 14:57:40 +00:00
. Where ( u = > u . Game ? . Name ? . ToUpperInvariant ( ) = = game )
2016-08-13 18:45:08 +00:00
. Select ( u = > u . Username )
. ToList ( ) ;
int i = 0 ;
if ( ! arr . Any ( ) )
2016-11-21 00:24:15 +00:00
await channel . SendMessageAsync ( _l [ "🚧 `Nobody is playing that game.`" ] ) . ConfigureAwait ( false ) ;
2016-08-13 18:45:08 +00:00
else
2016-11-21 00:24:15 +00:00
await channel . SendMessageAsync ( "```css\n" + string . Join ( "\n" , arr . GroupBy ( item = > ( i + + ) / 3 ) . Select ( ig = > string . Concat ( ig . Select ( el = > $"• {el,-35}" ) ) ) ) + "\n```" ) . ConfigureAwait ( false ) ;
2016-08-13 18:45:08 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-13 18:45:08 +00:00
[RequireContext(ContextType.Guild)]
2016-10-09 20:40:14 +00:00
public async Task InRole ( IUserMessage umsg , [ Remainder ] string roles )
2016-08-15 14:57:40 +00:00
{
2016-08-13 18:45:08 +00:00
if ( string . IsNullOrWhiteSpace ( roles ) )
return ;
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-13 18:45:08 +00:00
var arg = roles . Split ( ',' ) . Select ( r = > r . Trim ( ) . ToUpperInvariant ( ) ) ;
2016-11-21 00:24:15 +00:00
string send = _l [ "ℹ ️ **Here is a list of users in a specfic role:**" ] ;
2016-08-13 18:45:08 +00:00
foreach ( var roleStr in arg . Where ( str = > ! string . IsNullOrWhiteSpace ( str ) & & str ! = "@EVERYONE" & & str ! = "EVERYONE" ) )
{
var role = channel . Guild . Roles . Where ( r = > r . Name . ToUpperInvariant ( ) = = roleStr ) . FirstOrDefault ( ) ;
if ( role = = null ) continue ;
2016-11-21 00:56:12 +00:00
send + = $"```css\n[{role.Name}]\n" ;
send + = string . Join ( ", " , channel . Guild . GetUsers ( ) . Where ( u = > u . Roles . Contains ( role ) ) . Select ( u = > u . ToString ( ) ) ) ;
send + = $"\n```" ;
2016-08-15 14:57:40 +00:00
}
2016-08-28 02:33:09 +00:00
var usr = umsg . Author as IGuildUser ;
2016-08-15 14:57:40 +00:00
while ( send . Length > 2000 )
{
if ( ! usr . GetPermissions ( channel ) . ManageMessages )
{
2016-11-21 00:24:15 +00:00
await channel . SendMessageAsync ( $"⚠️ {usr.Mention} **you are not allowed to use this command on roles with a lot of users in them to prevent abuse.**" ) . ConfigureAwait ( false ) ;
2016-08-15 14:57:40 +00:00
return ;
}
var curstr = send . Substring ( 0 , 2000 ) ;
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( curstr . Substring ( 0 ,
2016-08-15 14:57:40 +00:00
curstr . LastIndexOf ( ", " , StringComparison . Ordinal ) + 1 ) ) . ConfigureAwait ( false ) ;
send = curstr . Substring ( curstr . LastIndexOf ( ", " , StringComparison . Ordinal ) + 1 ) +
send . Substring ( 2000 ) ;
2016-08-13 18:45:08 +00:00
}
2016-08-20 14:33:18 +00:00
await channel . SendMessageAsync ( send ) . ConfigureAwait ( false ) ;
2016-08-15 14:57:40 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task CheckMyPerms ( IUserMessage msg )
2016-08-15 14:57:40 +00:00
{
2016-11-21 00:24:15 +00:00
StringBuilder builder = new StringBuilder ( "```http\n" ) ;
2016-08-15 14:57:40 +00:00
var user = msg . Author as IGuildUser ;
2016-09-13 16:12:27 +00:00
var perms = user . GetPermissions ( ( ITextChannel ) msg . Channel ) ;
2016-08-15 14:57:40 +00:00
foreach ( var p in perms . GetType ( ) . GetProperties ( ) . Where ( p = > ! p . GetGetMethod ( ) . GetParameters ( ) . Any ( ) ) )
{
builder . AppendLine ( $"{p.Name} : {p.GetValue(perms, null).ToString()}" ) ;
}
builder . Append ( "```" ) ;
await msg . Reply ( builder . ToString ( ) ) ;
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task UserId ( IUserMessage msg , IGuildUser target = null )
2016-08-15 14:57:40 +00:00
{
var usr = target ? ? msg . Author ;
2016-11-21 00:24:15 +00:00
await msg . Reply ( $"🆔 of the user **{ usr.Username }** is `{ usr.Id }`" ) . ConfigureAwait ( false ) ;
2016-08-15 14:57:40 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-28 02:33:09 +00:00
public async Task ChannelId ( IUserMessage msg )
2016-08-15 14:57:40 +00:00
{
2016-11-21 00:24:15 +00:00
await msg . Reply ( $"ℹ ️ This **Channel's ID** is `{msg.Channel.Id}`" ) . ConfigureAwait ( false ) ;
2016-08-15 14:57:40 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task ServerId ( IUserMessage msg )
2016-08-15 14:57:40 +00:00
{
2016-11-21 00:24:15 +00:00
await msg . Reply ( $"ℹ ️ This **Server's ID** is `{((ITextChannel)msg.Channel).Guild.Id}`" ) . ConfigureAwait ( false ) ;
2016-08-15 14:57:40 +00:00
}
2016-08-13 18:45:08 +00:00
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
2016-10-10 00:27:33 +00:00
public async Task Roles ( IUserMessage msg , IGuildUser target , int page = 1 )
2016-08-15 14:57:40 +00:00
{
2016-09-13 16:12:27 +00:00
var channel = ( ITextChannel ) msg . Channel ;
var guild = channel . Guild ;
2016-10-10 00:27:33 +00:00
const int RolesPerPage = 20 ;
if ( page < 1 | | page > 100 )
return ;
2016-08-15 14:57:40 +00:00
if ( target ! = null )
{
2016-11-21 01:12:13 +00:00
await msg . Reply ( $"⚔ **Page #{page} of roles for {target.Username}:** ```css\n• " + string . Join ( "\n• " , target . Roles . Except ( new [ ] { guild . EveryoneRole } ) . OrderBy ( r = > r . Position ) . Skip ( ( page - 1 ) * RolesPerPage ) . Take ( RolesPerPage ) ) . SanitizeMentions ( ) + "\n```" ) ;
2016-08-15 14:57:40 +00:00
}
else
{
2016-11-21 01:12:13 +00:00
await msg . Reply ( $"⚔ **Page #{page} of all roles on this server:** ```css\n• " + string . Join ( "\n• " , guild . Roles . Except ( new [ ] { guild . EveryoneRole } ) . OrderBy ( r = > r . Position ) . Skip ( ( page - 1 ) * RolesPerPage ) . Take ( RolesPerPage ) ) . SanitizeMentions ( ) + "\n```" ) ;
2016-08-15 14:57:40 +00:00
}
2016-08-13 18:45:08 +00:00
}
2016-08-18 21:00:54 +00:00
2016-10-10 00:27:33 +00:00
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public Task Roles ( IUserMessage msg , int page = 1 ) = >
Roles ( msg , null , page ) ;
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-28 00:46:36 +00:00
[RequireContext(ContextType.Guild)]
2016-08-28 02:33:09 +00:00
public async Task ChannelTopic ( IUserMessage umsg )
2016-08-28 00:46:36 +00:00
{
2016-08-28 02:33:09 +00:00
var channel = ( ITextChannel ) umsg . Channel ;
2016-08-28 00:46:36 +00:00
var topic = channel . Topic ;
if ( string . IsNullOrWhiteSpace ( topic ) )
2016-11-21 00:24:15 +00:00
await channel . SendMessageAsync ( "❎ **No topic set.**" ) ;
2016-08-28 00:46:36 +00:00
else
2016-11-21 00:24:15 +00:00
await channel . SendMessageAsync ( "ℹ ️ **Topic:** " + topic ) ;
2016-08-28 00:46:36 +00:00
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-08-28 02:33:09 +00:00
public async Task Stats ( IUserMessage umsg )
2016-08-18 21:00:54 +00:00
{
2016-10-06 17:19:42 +00:00
var channel = umsg . Channel ;
2016-08-18 21:00:54 +00:00
await channel . SendMessageAsync ( await NadekoBot . Stats . Print ( ) ) ;
}
2016-10-06 17:19:42 +00:00
private Regex emojiFinder { get ; } = new Regex ( @"<:(?<name>.+?):(?<id>\d*)>" , RegexOptions . Compiled ) ;
[NadekoCommand, Usage, Description, Aliases]
public async Task Showemojis ( IUserMessage msg , [ Remainder ] string emojis )
{
var matches = emojiFinder . Matches ( emojis ) ;
var result = string . Join ( "\n" , matches . Cast < Match > ( )
2016-11-21 00:24:15 +00:00
. Select ( m = > $"**Name:** {m.Groups[" name "]} **Link:** http://discordapp.com/api/emojis/{m.Groups[" id "]}.png" ) ) ;
2016-10-06 17:19:42 +00:00
await msg . Channel . SendMessageAsync ( result ) . ConfigureAwait ( false ) ;
}
2016-10-26 20:26:25 +00:00
2016-10-28 11:31:21 +00:00
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[OwnerOnly]
public async Task ListServers ( IUserMessage imsg , int page = 1 )
{
var channel = ( ITextChannel ) imsg . Channel ;
page - = 1 ;
if ( page < 0 )
return ;
var guilds = NadekoBot . Client . GetGuilds ( ) . OrderBy ( g = > g . Name ) . Skip ( ( page - 1 ) * 15 ) . Take ( 15 ) ;
if ( ! guilds . Any ( ) )
{
2016-11-21 00:24:15 +00:00
await channel . SendMessageAsync ( "❎ No servers found on that page." ) . ConfigureAwait ( false ) ;
2016-10-28 11:31:21 +00:00
return ;
}
2016-11-23 22:04:50 +00:00
await channel . SendMessageAsync ( String . Join ( "\n" , guilds . Select ( g = > $"```css\nName: {g.Name} ID:{g.Id} Members:#{g.GetUsers().Count} OwnerID: {g.OwnerId} ```" ) ) ) . ConfigureAwait ( false ) ;
2016-10-28 11:31:21 +00:00
}
2016-10-26 20:26:25 +00:00
//[NadekoCommand, Usage, Description, Aliases]
//[RequireContext(ContextType.Guild)]
//public async Task TextToImage(IUserMessage msg, [Remainder] string arg)
//{
// var channel = (ITextChannel)msg.Channel;
// const string bgName = "xbiy3";
// if (string.IsNullOrWhiteSpace(arg))
// return;
// using (var http = new HttpClient())
// {
// http.AddFakeHeaders();
// http.DefaultRequestHeaders.Add("Host", "www.tagsmaker.com");
// http.DefaultRequestHeaders.Add("Referer", "http://www.tagsmaker.com/");
// http.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
// http.DefaultRequestHeaders.Add("Alt-Used", "www.tagsmaker.com:443");
// var res = await http.GetAsync($"http://www.tagsmaker.com/tagsmaker.php?background_name=0011&tag_text={arg}&font_name=applejuiced&text_color=white&text_size=48&text_alignment=middle").ConfigureAwait(false);
// var img = res.RequestMessage.RequestUri.Segments[1].Replace("image-", "").Replace("tag-", "");
// var imgStream = await http.GetStreamAsync($"http://www.tagsmaker.com/upload/www.tagsmaker.com_{ img.ToString() }.png");
// var ms = new MemoryStream();
// await imgStream.CopyToAsync(ms).ConfigureAwait(false);
// ms.Position = 0;
// await channel.SendFileAsync(ms, arg+".png", "Provided by www.tagsmaker.com").ConfigureAwait(false);
// }
//}
2016-08-13 18:45:08 +00:00
}
}