A lot more work on converting
This commit is contained in:
		@@ -1,11 +1,6 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using Discord.Modules;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.DataModels;
 | 
			
		||||
using NadekoBot.Extensions;
 | 
			
		||||
using NadekoBot.Modules.Administration.Commands;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
@@ -14,6 +9,7 @@ using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using NadekoBot.Services;
 | 
			
		||||
using NadekoBot.Attributes;
 | 
			
		||||
using System.Text.RegularExpressions;
 | 
			
		||||
 | 
			
		||||
//todo fix delmsgoncmd
 | 
			
		||||
//todo DB
 | 
			
		||||
@@ -26,12 +22,12 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //todo owner only
 | 
			
		||||
        ////todo owner only
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Restart(IMessage imsg)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //    await imsg.Channel.SendMessageAsync("`Restarting in 2 seconds...`");
 | 
			
		||||
        //    await Task.Delay(2000);
 | 
			
		||||
@@ -39,12 +35,13 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        //    Environment.Exit(0);
 | 
			
		||||
        //}
 | 
			
		||||
 | 
			
		||||
        ////todo DB
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //[RequirePermission(GuildPermission.ManageGuild)]
 | 
			
		||||
        //public async Task Delmsgoncmd(IMessage imsg)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //    var conf = SpecificConfigurations.Default.Of(channel.Guild.Id);
 | 
			
		||||
        //    conf.AutoDeleteMessagesOnCommand = !conf.AutoDeleteMessagesOnCommand;
 | 
			
		||||
@@ -58,30 +55,13 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageRoles)]
 | 
			
		||||
        public async Task Setrole(IMessage imsg, IUser userName, [Remainder] string roleName)
 | 
			
		||||
        public async Task Setrole(IMessage imsg, IGuildUser usr, [Remainder] IRole role)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(roleName)) return;
 | 
			
		||||
 | 
			
		||||
            var usr = channel.Guild.FindUsers(userName).FirstOrDefault();
 | 
			
		||||
            if (usr == null)
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("You failed to supply a valid username").ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var role = channel.Guild.FindRoles(roleName).FirstOrDefault();
 | 
			
		||||
            if (role == null)
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("You failed to supply a valid role").ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                await usr.AddRoles(role).ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync($"Successfully added role **{role.Name}** to user **{usr.Name}**").ConfigureAwait(false);
 | 
			
		||||
                await usr.AddRolesAsync(role).ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync($"Successfully added role **{role.Name}** to user **{usr.Username}**").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
@@ -93,30 +73,12 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageRoles)]
 | 
			
		||||
        public async Task Removerole(IMessage imsg, IUser userName, [Remainder] string roleName)
 | 
			
		||||
        public async Task Removerole(IMessage imsg, IGuildUser usr, [Remainder] IRole role)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(roleName)) return;
 | 
			
		||||
 | 
			
		||||
            var usr = channel.Guild.FindUsers(userName).FirstOrDefault();
 | 
			
		||||
            if (usr == null)
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("You failed to supply a valid username").ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var role = channel.Guild.FindRoles(roleName).FirstOrDefault();
 | 
			
		||||
            if (role == null)
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("You failed to supply a valid role").ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                await usr.RemoveRoles(role).ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync($"Successfully removed role **{role.Name}** from user **{usr.Name}**").ConfigureAwait(false);
 | 
			
		||||
                await usr.RemoveRolesAsync(role).ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync($"Successfully removed role **{role.Name}** from user **{usr.Username}**").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch
 | 
			
		||||
            {
 | 
			
		||||
@@ -127,25 +89,17 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageRoles)]
 | 
			
		||||
        public async Task RenameRole(IMessage imsg, string r1, string r2)
 | 
			
		||||
        public async Task RenameRole(IMessage imsg, IRole roleToEdit, string newname)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
 | 
			
		||||
            var roleToEdit = channel.Guild.FindRoles(r1).FirstOrDefault();
 | 
			
		||||
            if (roleToEdit == null)
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Can't find that role.").ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (roleToEdit.Position > channel.Guild.CurrentUser.Roles.Max(r => r.Position))
 | 
			
		||||
                if (roleToEdit.Position > (await channel.Guild.GetCurrentUserAsync().ConfigureAwait(false)).Roles.Max(r => r.Position))
 | 
			
		||||
                {
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync("I can't edit roles higher than my highest role.").ConfigureAwait(false);
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync("You can't edit roles higher than your highest role.").ConfigureAwait(false);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                await roleToEdit.Edit(r2);
 | 
			
		||||
                await roleToEdit.ModifyAsync(g => g.Name = newname).ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Role renamed.").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception)
 | 
			
		||||
@@ -157,21 +111,14 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageRoles)]
 | 
			
		||||
        public async Task RemoveAllRoles(IMessage imsg, [Remainder] string userName)
 | 
			
		||||
        public async Task RemoveAllRoles(IMessage imsg, [Remainder] IGuildUser user)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
 | 
			
		||||
            var usr = channel.Guild.FindUsers(userName).FirstOrDefault();
 | 
			
		||||
            if (usr == null)
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("You failed to supply a valid username").ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                await usr.RemoveRoles(usr.Roles.ToArray()).ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync($"Successfully removed **all** roles from user **{usr.Name}**").ConfigureAwait(false);
 | 
			
		||||
                await user.RemoveRolesAsync(user.Roles).ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync($"Successfully removed **all** roles from user **{user.Username}**").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch
 | 
			
		||||
            {
 | 
			
		||||
@@ -182,16 +129,16 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageRoles)]
 | 
			
		||||
        public async Task CreateRole(IMessage imsg, [Remainder] string roleName)
 | 
			
		||||
        public async Task CreateRole(IMessage imsg, [Remainder] string roleName = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(e.GetArg("role_name")))
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(roleName))
 | 
			
		||||
                return;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var r = await channel.Guild.CreateRole(e.GetArg("role_name")).ConfigureAwait(false);
 | 
			
		||||
                var r = await channel.Guild.CreateRoleAsync(roleName).ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync($"Successfully created role **{r.Name}**.").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception)
 | 
			
		||||
@@ -203,19 +150,17 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageRoles)]
 | 
			
		||||
        public async Task RoleColor(IMessage imsg, string roleName, string r="", string g="", string b="")
 | 
			
		||||
        public async Task RoleColor(IMessage imsg, params string[] args)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
 | 
			
		||||
            var args = e.Args.Where(s => s != string.Empty);
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (args.Count() != 2 && args.Count() != 4)
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("The parameters are invalid.").ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var role = channel.Guild.FindRoles(e.Args[0]).FirstOrDefault();
 | 
			
		||||
            var roleName = args[0].ToUpperInvariant();
 | 
			
		||||
            var role = channel.Guild.Roles.Where(r=>r.Name.ToUpperInvariant() == roleName).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
            if (role == null)
 | 
			
		||||
            {
 | 
			
		||||
@@ -225,13 +170,13 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var rgb = args.Count() == 4;
 | 
			
		||||
                var arg1 = e.Args[1].Replace("#", "");
 | 
			
		||||
                var arg1 = args[1].Replace("#", "");
 | 
			
		||||
 | 
			
		||||
                var red = Convert.ToByte(rgb ? int.Parse(arg1) : Convert.ToInt32(arg1.Substring(0, 2), 16));
 | 
			
		||||
                var green = Convert.ToByte(rgb ? int.Parse(e.Args[2]) : Convert.ToInt32(arg1.Substring(2, 2), 16));
 | 
			
		||||
                var blue = Convert.ToByte(rgb ? int.Parse(e.Args[3]) : Convert.ToInt32(arg1.Substring(4, 2), 16));
 | 
			
		||||
 | 
			
		||||
                await role.Edit(color: new Color(red, green, blue)).ConfigureAwait(false);
 | 
			
		||||
                var green = Convert.ToByte(rgb ? int.Parse(args[2]) : Convert.ToInt32(arg1.Substring(2, 2), 16));
 | 
			
		||||
                var blue = Convert.ToByte(rgb ? int.Parse(args[3]) : Convert.ToInt32(arg1.Substring(4, 2), 16));
 | 
			
		||||
                
 | 
			
		||||
                await role.ModifyAsync(r => r.Color = new Color(red, green, blue).RawValue).ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync($"Role {role.Name}'s color has been changed.").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception)
 | 
			
		||||
@@ -243,25 +188,21 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.BanMembers)]
 | 
			
		||||
        public async Task Ban(IMessage imsg, IUser user, [Remainder] string msg)
 | 
			
		||||
        public async Task Ban(IMessage imsg, IGuildUser user, [Remainder] string msg = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            if (user == null)
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("User not found.").ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (!string.IsNullOrWhiteSpace(msg))
 | 
			
		||||
            {
 | 
			
		||||
                await user.SendMessage($"**You have been BANNED from `{channel.Guild.Name}` server.**\n" +
 | 
			
		||||
                await (await user.CreateDMChannelAsync()).SendMessageAsync($"**You have been BANNED from `{channel.Guild.Name}` server.**\n" +
 | 
			
		||||
                                        $"Reason: {msg}").ConfigureAwait(false);
 | 
			
		||||
                await Task.Delay(2000).ConfigureAwait(false); // temp solution; give time for a message to be send, fu volt
 | 
			
		||||
            }
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                await channel.Guild.Ban(user, 7).ConfigureAwait(false);
 | 
			
		||||
                await channel.Guild.AddBanAsync(user, 7).ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Banned user " + user.Name + " Id: " + user.Id).ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Banned user " + user.Username + " Id: " + user.Id).ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch
 | 
			
		||||
            {
 | 
			
		||||
@@ -272,10 +213,10 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.BanMembers)]
 | 
			
		||||
        public async Task Softban(IMessage imsg, IUser user, [Remainder] string msg)
 | 
			
		||||
        public async Task Softban(IMessage imsg, IGuildUser user, [Remainder] string msg = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (user == null)
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("User not found.").ConfigureAwait(false);
 | 
			
		||||
@@ -283,14 +224,14 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
            }
 | 
			
		||||
            if (!string.IsNullOrWhiteSpace(msg))
 | 
			
		||||
            {
 | 
			
		||||
                await user.SendMessage($"**You have been SOFT-BANNED from `{channel.Guild.Name}` server.**\n" +
 | 
			
		||||
                await user.SendMessageAsync($"**You have been SOFT-BANNED from `{channel.Guild.Name}` server.**\n" +
 | 
			
		||||
                                        $"Reason: {msg}").ConfigureAwait(false);
 | 
			
		||||
                await Task.Delay(2000).ConfigureAwait(false); // temp solution; give time for a message to be send, fu volt
 | 
			
		||||
            }
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                await channel.Guild.Ban(user, 7).ConfigureAwait(false);
 | 
			
		||||
                await channel.Guild.Unban(user).ConfigureAwait(false);
 | 
			
		||||
                await channel.Guild.AddBanAsync(user, 7).ConfigureAwait(false);
 | 
			
		||||
                await channel.Guild.RemoveBanAsync(user).ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Soft-Banned user " + user.Username + " Id: " + user.Id).ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
@@ -302,26 +243,25 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Kick(IMessage imsg, IUser user, [Remainder] string msg)
 | 
			
		||||
        public async Task Kick(IMessage imsg, IGuildUser user, [Remainder] string msg = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            var usr = channel.Guild.FindUsers(user).FirstOrDefault();
 | 
			
		||||
            if (usr == null)
 | 
			
		||||
            if (user == null)
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("User not found.").ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (!string.IsNullOrWhiteSpace(msg))
 | 
			
		||||
            {
 | 
			
		||||
                await usr.SendMessage($"**You have been KICKED from `{channel.Guild.Name}` server.**\n" +
 | 
			
		||||
                await user.SendMessageAsync($"**You have been KICKED from `{channel.Guild.Name}` server.**\n" +
 | 
			
		||||
                                      $"Reason: {msg}").ConfigureAwait(false);
 | 
			
		||||
                await Task.Delay(2000).ConfigureAwait(false); // temp solution; give time for a message to be send, fu volt
 | 
			
		||||
            }
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                await usr.Kick().ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Kicked user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false);
 | 
			
		||||
                await user.KickAsync().ConfigureAwait(false);
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Kicked user " + user.Username + " Id: " + user.Id).ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch
 | 
			
		||||
            {
 | 
			
		||||
@@ -332,17 +272,17 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.MuteMembers)]
 | 
			
		||||
        public async Task Mute(IMessage imsg, [Remainder] string throwaway)
 | 
			
		||||
        public async Task Mute(IMessage imsg, params IGuildUser[] users)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (!e.Message.MentionedUsers.Any())
 | 
			
		||||
            if (!users.Any())
 | 
			
		||||
                return;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                foreach (var u in e.Message.MentionedUsers)
 | 
			
		||||
                foreach (var u in users)
 | 
			
		||||
                {
 | 
			
		||||
                    await u.Edit(isMuted: true).ConfigureAwait(false);
 | 
			
		||||
                    await u.ModifyAsync(usr => usr.Mute = true).ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Mute successful").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
@@ -354,17 +294,18 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Unmute(IMessage imsg, [Remainder] string throwaway)
 | 
			
		||||
        [RequirePermission(GuildPermission.MuteMembers)]
 | 
			
		||||
        public async Task Unmute(IMessage imsg, params IGuildUser[] users)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (!e.Message.MentionedUsers.Any())
 | 
			
		||||
            if (!users.Any())
 | 
			
		||||
                return;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                foreach (var u in e.Message.MentionedUsers)
 | 
			
		||||
                foreach (var u in users)
 | 
			
		||||
                {
 | 
			
		||||
                    await u.Edit(isMuted: false).ConfigureAwait(false);
 | 
			
		||||
                    await u.ModifyAsync(usr => usr.Mute = false).ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Unmute successful").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
@@ -377,17 +318,17 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.DeafenMembers)]
 | 
			
		||||
        public async Task Deafen(IMessage imsg, [Remainder] string throwaway)
 | 
			
		||||
        public async Task Deafen(IMessage imsg, params IGuildUser[] users)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (!e.Message.MentionedUsers.Any())
 | 
			
		||||
            if (!users.Any())
 | 
			
		||||
                return;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                foreach (var u in e.Message.MentionedUsers)
 | 
			
		||||
                foreach (var u in users)
 | 
			
		||||
                {
 | 
			
		||||
                    await u.Edit(isDeafened: true).ConfigureAwait(false);
 | 
			
		||||
                    await u.ModifyAsync(usr=>usr.Deaf = true).ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Deafen successful").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
@@ -400,17 +341,17 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.DeafenMembers)]
 | 
			
		||||
        public async Task UnDeafen(IMessage imsg, [Remainder] string throwaway)
 | 
			
		||||
        public async Task UnDeafen(IMessage imsg, params IGuildUser[] users)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (!e.Message.MentionedUsers.Any())
 | 
			
		||||
            if (!users.Any())
 | 
			
		||||
                return;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                foreach (var u in e.Message.MentionedUsers)
 | 
			
		||||
                foreach (var u in users)
 | 
			
		||||
                {
 | 
			
		||||
                    await u.Edit(isDeafened: false).ConfigureAwait(false);
 | 
			
		||||
                    await u.ModifyAsync(usr=> usr.Deaf = false).ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("Undeafen successful").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
@@ -422,69 +363,64 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task DelVoiChanl(IMessage imsg, [Remainder] channelName)
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageChannels)]
 | 
			
		||||
        public async Task DelVoiChanl(IMessage imsg, [Remainder] IVoiceChannel channel)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var ch = channel.Guild.FindChannels(channelName, ChannelType.Voice).FirstOrDefault();
 | 
			
		||||
            if (ch == null)
 | 
			
		||||
                return;
 | 
			
		||||
            await ch.Delete().ConfigureAwait(false);
 | 
			
		||||
            await imsg.Channel.SendMessageAsync($"Removed channel **{channelName}**.").ConfigureAwait(false);
 | 
			
		||||
            await channel.DeleteAsync().ConfigureAwait(false);
 | 
			
		||||
            await imsg.Channel.SendMessageAsync($"Removed channel **{channel.Name}**.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageChannels)]
 | 
			
		||||
        public async Task CreatVoiChanl(IMessage imsg, [Remainder] string channelName)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
 | 
			
		||||
            await channel.Guild.CreateChannel(e.GetArg("channel_name"), ChannelType.Voice).ConfigureAwait(false);
 | 
			
		||||
            await imsg.Channel.SendMessageAsync($"Created voice channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task DelTxtChanl(IMessage imsg, [Remainder] string channelName)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
 | 
			
		||||
            var channel = channel.Guild.FindChannels(e.GetArg("channel_name"), ChannelType.Text).FirstOrDefault();
 | 
			
		||||
            if (channel == null) return;
 | 
			
		||||
            await channel.Delete().ConfigureAwait(false);
 | 
			
		||||
            await imsg.Channel.SendMessageAsync($"Removed text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            //todo actually print info about created channel
 | 
			
		||||
            await channel.Guild.CreateVoiceChannelAsync(channelName).ConfigureAwait(false);
 | 
			
		||||
            await imsg.Channel.SendMessageAsync($"Created voice channel **{channelName}**.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageChannels)]
 | 
			
		||||
        public async Task CreaTxtChanl(IMessage imsg, [Remainder] string arg)
 | 
			
		||||
        public async Task DelTxtChanl(IMessage imsg, [Remainder] ITextChannel channel)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            await channel.Guild.CreateChannel(e.GetArg("channel_name"), ChannelType.Text).ConfigureAwait(false);
 | 
			
		||||
            await imsg.Channel.SendMessageAsync($"Added text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
 | 
			
		||||
            await channel.DeleteAsync().ConfigureAwait(false);
 | 
			
		||||
            await imsg.Channel.SendMessageAsync($"Removed text channel **{channel.Name}**.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageChannels)]
 | 
			
		||||
        public async Task SetTopic(IMessage imsg, [Remainder] string arg)
 | 
			
		||||
        public async Task CreaTxtChanl(IMessage imsg, [Remainder] string channelName)
 | 
			
		||||
        {
 | 
			
		||||
            var topic = e.GetArg("topic")?.Trim() ?? "";
 | 
			
		||||
            await e.Channel.Edit(topic: topic).ConfigureAwait(false);
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            //todo actually print info about created channel
 | 
			
		||||
            var txtCh = await channel.Guild.CreateTextChannelAsync(channelName).ConfigureAwait(false);
 | 
			
		||||
            await imsg.Channel.SendMessageAsync($"Added text channel **{channelName}**.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageChannels)]
 | 
			
		||||
        public async Task SetTopic(IMessage imsg, [Remainder] string topic = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            topic = topic ?? "";
 | 
			
		||||
            await (channel as ITextChannel).ModifyAsync(c => c.Topic = topic);
 | 
			
		||||
            //await (channel).ModifyAsync(c => c).ConfigureAwait(false);
 | 
			
		||||
            await imsg.Channel.SendMessageAsync(":ok: **New channel topic set.**").ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.ManageChannels)]
 | 
			
		||||
        public async Task SetChanlName(IMessage imsg, [Remainder] string arg)
 | 
			
		||||
        public async Task SetChanlName(IMessage imsg, [Remainder] string name)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            var name = e.GetArg("name");
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(name))
 | 
			
		||||
                return;
 | 
			
		||||
            await e.Channel.Edit(name: name).ConfigureAwait(false);
 | 
			
		||||
            await channel.ModifyAsync(c => c.Name = name).ConfigureAwait(false);
 | 
			
		||||
            await imsg.Channel.SendMessageAsync(":ok: **New channel name set.**").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -494,7 +430,7 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Prune(IMessage msg, [Remainder] string target = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = msg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = msg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            var user = await channel.Guild.GetCurrentUserAsync();
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(target))
 | 
			
		||||
@@ -561,7 +497,7 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Die(IMessage imsg)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //    await imsg.Channel.SendMessageAsync("`Shutting down.`").ConfigureAwait(false);
 | 
			
		||||
        //    await Task.Delay(2000).ConfigureAwait(false);
 | 
			
		||||
@@ -571,18 +507,18 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        ////todo owner only
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Setname(IMessage imsg, [Remainder] string newName)
 | 
			
		||||
        //public async Task Setname(IMessage imsg, [Remainder] string newName = null)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //}
 | 
			
		||||
 | 
			
		||||
        ////todo owner only
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task NewAvatar(IMessage imsg, [Remainder] string img)
 | 
			
		||||
        //public async Task NewAvatar(IMessage imsg, [Remainder] string img = null)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //    if (string.IsNullOrWhiteSpace(e.GetArg("img")))
 | 
			
		||||
        //        return;
 | 
			
		||||
@@ -599,9 +535,9 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        ////todo owner only
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task SetGame(IMessage imsg, [Remainder] string game)
 | 
			
		||||
        //public async Task SetGame(IMessage imsg, [Remainder] string game = null)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //    game = game ?? "";
 | 
			
		||||
 | 
			
		||||
@@ -611,9 +547,9 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        ////todo owner only
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Send(IMessage imsg, string where, [Remainder] string msg)
 | 
			
		||||
        //public async Task Send(IMessage imsg, string where, [Remainder] string msg = null)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //    if (string.IsNullOrWhiteSpace(msg))
 | 
			
		||||
        //        return;
 | 
			
		||||
@@ -659,7 +595,7 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Donadd(IMessage imsg, IUser donator, int amount)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
        //    var donator = channel.Guild.FindUsers(e.GetArg("donator")).FirstOrDefault();
 | 
			
		||||
        //    var amount = int.Parse(e.GetArg("amount"));
 | 
			
		||||
        //    if (donator == null) return;
 | 
			
		||||
@@ -677,75 +613,77 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
 | 
			
		||||
        //}
 | 
			
		||||
 | 
			
		||||
        //todo owner only
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Announce(IMessage imsg, [Remainder] string message)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        ////todo owner only
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Announce(IMessage imsg, [Remainder] string message)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //    foreach (var ch in (await _client.GetGuildsAsync().ConfigureAwait(false)).Select(async g => await g.GetDefaultChannelAsync().ConfigureAwait(false)))
 | 
			
		||||
        //    {
 | 
			
		||||
        //        await imsg.Channel.SendMessageAsync(message).ConfigureAwait(false);
 | 
			
		||||
        //    }
 | 
			
		||||
 | 
			
		||||
            foreach (var ch in NadekoBot.Client.Servers.Select(s => s.DefaultChannel))
 | 
			
		||||
            {
 | 
			
		||||
                await ch.SendMessage(e.GetArg("msg")).ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
        //    await imsg.Channel.SendMessageAsync(":ok:").ConfigureAwait(false);
 | 
			
		||||
        //}
 | 
			
		||||
 | 
			
		||||
            await imsg.Channel.SendMessageAsync(":ok:").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
        ////todo owner only
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task SaveChat(IMessage imsg, int cnt)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //todo owner only
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task SaveChat(IMessage imsg, int cnt)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    ulong? lastmsgId = null;
 | 
			
		||||
        //    var sb = new StringBuilder();
 | 
			
		||||
        //    var msgs = new List<IMessage>(cnt);
 | 
			
		||||
        //    while (cnt > 0)
 | 
			
		||||
        //    {
 | 
			
		||||
        //        var dlcnt = cnt < 100 ? cnt : 100;
 | 
			
		||||
        //        IReadOnlyCollection<IMessage> dledMsgs;
 | 
			
		||||
        //        if (lastmsgId == null)
 | 
			
		||||
        //            dledMsgs = await imsg.Channel.GetMessagesAsync(cnt).ConfigureAwait(false);
 | 
			
		||||
        //        else
 | 
			
		||||
        //            dledMsgs = await imsg.Channel.GetMessagesAsync(lastmsgId.Value, Direction.Before, dlcnt);
 | 
			
		||||
 | 
			
		||||
            ulong? lastmsgId = null;
 | 
			
		||||
            var sb = new StringBuilder();
 | 
			
		||||
            var msgs = new List<IMessage>(cnt);
 | 
			
		||||
            while (cnt > 0)
 | 
			
		||||
            {
 | 
			
		||||
                var dlcnt = cnt < 100 ? cnt : 100;
 | 
			
		||||
        //        if (!dledMsgs.Any())
 | 
			
		||||
        //            break;
 | 
			
		||||
 | 
			
		||||
                var dledMsgs = await e.Channel.DownloadMessages(dlcnt, lastmsgId);
 | 
			
		||||
                if (!dledMsgs.Any())
 | 
			
		||||
                    break;
 | 
			
		||||
                msgs.AddRange(dledMsgs);
 | 
			
		||||
                lastmsgId = msgs[msgs.Count - 1].Id;
 | 
			
		||||
                cnt -= 100;
 | 
			
		||||
            }
 | 
			
		||||
            await e.User.SendFile($"Chatlog-{channel.Guild.Name}/#{e.Channel.Name}-{DateTime.Now}.txt", 
 | 
			
		||||
                JsonConvert.SerializeObject(new { Messages = msgs.Select(s => s.ToString()) }, Formatting.Indented).ToStream()).ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
        //        msgs.AddRange(dledMsgs);
 | 
			
		||||
        //        lastmsgId = msgs[msgs.Count - 1].Id;
 | 
			
		||||
        //        cnt -= 100;
 | 
			
		||||
        //    }
 | 
			
		||||
        //    var title = $"Chatlog-{channel.Guild.Name}/#{channel.Name}-{DateTime.Now}.txt";
 | 
			
		||||
        //    await (imsg.Author as IGuildUser).SendFileAsync(
 | 
			
		||||
        //        await JsonConvert.SerializeObject(new { Messages = msgs.Select(s => s.ToString()) }, Formatting.Indented).ToStream().ConfigureAwait(false),
 | 
			
		||||
        //        title, title).ConfigureAwait(false);
 | 
			
		||||
        //}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [RequirePermission(GuildPermission.MentionEveryone)]
 | 
			
		||||
        public async Task MentionRole(IMessage imsg, [Remainder] string roles)
 | 
			
		||||
        public async Task MentionRole(IMessage imsg, params IRole[] roles)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            
 | 
			
		||||
            var arg = e.GetArg("roles").Split(',').Select(r => r.Trim());
 | 
			
		||||
            string send = $"--{e.User.Mention} has invoked a mention on the following roles--";
 | 
			
		||||
            foreach (var roleStr in arg.Where(str => !string.IsNullOrWhiteSpace(str)))
 | 
			
		||||
            {
 | 
			
		||||
                var role = channel.Guild.FindRoles(roleStr).FirstOrDefault();
 | 
			
		||||
                if (role == null) continue;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            string send = $"--{imsg.Author.Mention} has invoked a mention on the following roles--";
 | 
			
		||||
            foreach (var role in roles)
 | 
			
		||||
            { 
 | 
			
		||||
                send += $"\n`{role.Name}`\n";
 | 
			
		||||
                send += string.Join(", ", role.Members.Select(r => r.Mention));
 | 
			
		||||
                send += string.Join(", ", (await channel.Guild.GetUsersAsync()).Where(u => u.Roles.Contains(role)).Distinct());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            while (send.Length > 2000)
 | 
			
		||||
            {
 | 
			
		||||
                var curstr = send.Substring(0, 2000);
 | 
			
		||||
                await
 | 
			
		||||
                    e.Channel.Send(curstr.Substring(0,
 | 
			
		||||
                await channel.SendMessageAsync(curstr.Substring(0,
 | 
			
		||||
                        curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1)).ConfigureAwait(false);
 | 
			
		||||
                send = curstr.Substring(curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1) +
 | 
			
		||||
                       send.Substring(2000);
 | 
			
		||||
            }
 | 
			
		||||
            await e.Channel.Send(send).ConfigureAwait(false);
 | 
			
		||||
            await channel.SendMessageAsync(send).ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //todo DB
 | 
			
		||||
@@ -753,7 +691,7 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Donators(IMessage imsg)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //    var rows = DbHandler.Instance.GetAllRows<Donator>();
 | 
			
		||||
        //    var donatorsOrdered = rows.OrderByDescending(d => d.Amount);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,72 +1,72 @@
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    class AutoAssignRole : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        public AutoAssignRole(DiscordModule module) : base(module)
 | 
			
		||||
        {
 | 
			
		||||
            NadekoBot.Client.UserJoined += (s, e) =>
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    class AutoAssignRole : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        public AutoAssignRole(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
//            NadekoBot.Client.UserJoined += (s, e) =>
 | 
			
		||||
//            {
 | 
			
		||||
//                try
 | 
			
		||||
//                {
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
 | 
			
		||||
                    var role = e.Server.Roles.Where(r => r.Id == config.AutoAssignedRole).FirstOrDefault();
 | 
			
		||||
//                    var role = e.Server.Roles.Where(r => r.Id == config.AutoAssignedRole).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
                    if (role == null)
 | 
			
		||||
                        return;
 | 
			
		||||
//                    if (role == null)
 | 
			
		||||
//                        return;
 | 
			
		||||
 | 
			
		||||
                    e.User.AddRoles(role);
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine($"aar exception. {ex}");
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
//                    e.User.AddRoles(role);
 | 
			
		||||
//                }
 | 
			
		||||
//                catch (Exception ex)
 | 
			
		||||
//                {
 | 
			
		||||
//                    Console.WriteLine($"aar exception. {ex}");
 | 
			
		||||
//                }
 | 
			
		||||
//            };
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "autoassignrole")
 | 
			
		||||
                .Alias(Module.Prefix + "aar")
 | 
			
		||||
                .Description($"Automaticaly assigns a specified role to every user who joins the server. **Needs Manage Roles Permissions.** |`{Prefix}aar` to disable, `{Prefix}aar Role Name` to enable")
 | 
			
		||||
                .Parameter("role", ParameterType.Unparsed)
 | 
			
		||||
                .AddCheck(new SimpleCheckers.ManageRoles())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (!e.Server.CurrentUser.ServerPermissions.ManageRoles)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("I do not have the permission to manage roles.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    var r = e.GetArg("role")?.Trim();
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "autoassignrole")
 | 
			
		||||
//                .Alias(Module.Prefix + "aar")
 | 
			
		||||
//                .Description($"Automaticaly assigns a specified role to every user who joins the server. **Needs Manage Roles Permissions.** |`{Prefix}aar` to disable, `{Prefix}aar Role Name` to enable")
 | 
			
		||||
//                .Parameter("role", ParameterType.Unparsed)
 | 
			
		||||
//                .AddCheck(new SimpleCheckers.ManageRoles())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (!e.Server.CurrentUser.ServerPermissions.ManageRoles)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("I do not have the permission to manage roles.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    var r = e.GetArg("role")?.Trim();
 | 
			
		||||
 | 
			
		||||
                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(r)) //if role is not specified, disable
 | 
			
		||||
                    {
 | 
			
		||||
                        config.AutoAssignedRole = 0;
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(r)) //if role is not specified, disable
 | 
			
		||||
//                    {
 | 
			
		||||
//                        config.AutoAssignedRole = 0;
 | 
			
		||||
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`Auto assign role on user join is now disabled.`").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    var role = e.Server.FindRoles(r).FirstOrDefault();
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`Auto assign role on user join is now disabled.`").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    var role = e.Server.FindRoles(r).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
                    if (role == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("💢 `Role not found.`").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
//                    if (role == null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("💢 `Role not found.`").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
                    config.AutoAssignedRole = role.Id;
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync("`Auto assigned role is set.`").ConfigureAwait(false);
 | 
			
		||||
//                    config.AutoAssignedRole = role.Id;
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync("`Auto assigned role is set.`").ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,110 +1,110 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
//using Discord;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Concurrent;
 | 
			
		||||
//using System.Collections.Generic;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    class CrossServerTextChannel : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        public CrossServerTextChannel(DiscordModule module) : base(module)
 | 
			
		||||
        {
 | 
			
		||||
            NadekoBot.Client.MessageReceived += async (s, e) =>
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    if (e.User.Id == NadekoBot.Client.CurrentUser.Id) return;
 | 
			
		||||
                    foreach (var subscriber in Subscribers)
 | 
			
		||||
                    {
 | 
			
		||||
                        var set = subscriber.Value;
 | 
			
		||||
                        if (!set.Contains(e.Channel))
 | 
			
		||||
                            continue;
 | 
			
		||||
                        foreach (var chan in set.Except(new[] { e.Channel }))
 | 
			
		||||
                        {
 | 
			
		||||
                            await chan.SendMessage(GetText(e.Server, e.Channel, e.User, e.Message)).ConfigureAwait(false);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                catch { }
 | 
			
		||||
            };
 | 
			
		||||
            NadekoBot.Client.MessageUpdated += async (s, e) =>
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    if (e.After?.User?.Id == null || e.After.User.Id == NadekoBot.Client.CurrentUser.Id) return;
 | 
			
		||||
                    foreach (var subscriber in Subscribers)
 | 
			
		||||
                    {
 | 
			
		||||
                        var set = subscriber.Value;
 | 
			
		||||
                        if (!set.Contains(e.Channel))
 | 
			
		||||
                            continue;
 | 
			
		||||
                        foreach (var chan in set.Except(new[] { e.Channel }))
 | 
			
		||||
                        {
 | 
			
		||||
                            var msg = chan.Messages
 | 
			
		||||
                                .FirstOrDefault(m =>
 | 
			
		||||
                                    m.RawText == GetText(e.Server, e.Channel, e.User, e.Before));
 | 
			
		||||
                            if (msg != default(Message))
 | 
			
		||||
                                await msg.Edit(GetText(e.Server, e.Channel, e.User, e.After)).ConfigureAwait(false);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    class CrossServerTextChannel : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        public CrossServerTextChannel(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
//            NadekoBot.Client.MessageReceived += async (s, e) =>
 | 
			
		||||
//            {
 | 
			
		||||
//                try
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (e.User.Id == NadekoBot.Client.CurrentUser.Id) return;
 | 
			
		||||
//                    foreach (var subscriber in Subscribers)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var set = subscriber.Value;
 | 
			
		||||
//                        if (!set.Contains(e.Channel))
 | 
			
		||||
//                            continue;
 | 
			
		||||
//                        foreach (var chan in set.Except(new[] { e.Channel }))
 | 
			
		||||
//                        {
 | 
			
		||||
//                            await chan.SendMessage(GetText(e.Server, e.Channel, e.User, e.Message)).ConfigureAwait(false);
 | 
			
		||||
//                        }
 | 
			
		||||
//                    }
 | 
			
		||||
//                }
 | 
			
		||||
//                catch { }
 | 
			
		||||
//            };
 | 
			
		||||
//            NadekoBot.Client.MessageUpdated += async (s, e) =>
 | 
			
		||||
//            {
 | 
			
		||||
//                try
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (e.After?.User?.Id == null || e.After.User.Id == NadekoBot.Client.CurrentUser.Id) return;
 | 
			
		||||
//                    foreach (var subscriber in Subscribers)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var set = subscriber.Value;
 | 
			
		||||
//                        if (!set.Contains(e.Channel))
 | 
			
		||||
//                            continue;
 | 
			
		||||
//                        foreach (var chan in set.Except(new[] { e.Channel }))
 | 
			
		||||
//                        {
 | 
			
		||||
//                            var msg = chan.Messages
 | 
			
		||||
//                                .FirstOrDefault(m =>
 | 
			
		||||
//                                    m.RawText == GetText(e.Server, e.Channel, e.User, e.Before));
 | 
			
		||||
//                            if (msg != default(Message))
 | 
			
		||||
//                                await msg.Edit(GetText(e.Server, e.Channel, e.User, e.After)).ConfigureAwait(false);
 | 
			
		||||
//                        }
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
                catch { }
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
//                }
 | 
			
		||||
//                catch { }
 | 
			
		||||
//            };
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private string GetText(Server server, Channel channel, User user, Message message) =>
 | 
			
		||||
            $"**{server.Name} | {channel.Name}** `{user.Name}`: " + message.RawText;
 | 
			
		||||
//        private string GetText(Server server, Channel channel, User user, Message message) =>
 | 
			
		||||
//            $"**{server.Name} | {channel.Name}** `{user.Name}`: " + message.RawText;
 | 
			
		||||
 | 
			
		||||
        public static readonly ConcurrentDictionary<int, HashSet<Channel>> Subscribers = new ConcurrentDictionary<int, HashSet<Channel>>();
 | 
			
		||||
//        public static readonly ConcurrentDictionary<int, HashSet<Channel>> Subscribers = new ConcurrentDictionary<int, HashSet<Channel>>();
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "scsc")
 | 
			
		||||
                .Description("Starts an instance of cross server channel. You will get a token as a DM " +
 | 
			
		||||
                             $"that other people will use to tune in to the same instance. **Bot Owner Only.** | `{Prefix}scsc`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var token = new Random().Next();
 | 
			
		||||
                    var set = new HashSet<Channel>();
 | 
			
		||||
                    if (Subscribers.TryAdd(token, set))
 | 
			
		||||
                    {
 | 
			
		||||
                        set.Add(e.Channel);
 | 
			
		||||
                        await e.User.SendMessage("This is your CSC token:" + token.ToString()).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "scsc")
 | 
			
		||||
//                .Description("Starts an instance of cross server channel. You will get a token as a DM " +
 | 
			
		||||
//                             $"that other people will use to tune in to the same instance. **Bot Owner Only.** | `{Prefix}scsc`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var token = new Random().Next();
 | 
			
		||||
//                    var set = new HashSet<Channel>();
 | 
			
		||||
//                    if (Subscribers.TryAdd(token, set))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        set.Add(e.Channel);
 | 
			
		||||
//                        await e.User.SendMessage("This is your CSC token:" + token.ToString()).ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "jcsc")
 | 
			
		||||
                .Description($"Joins current channel to an instance of cross server channel using the token. **Needs Manage Server Permissions.**| `{Prefix}jcsc`")
 | 
			
		||||
                .Parameter("token")
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    int token;
 | 
			
		||||
                    if (!int.TryParse(e.GetArg("token"), out token))
 | 
			
		||||
                        return;
 | 
			
		||||
                    HashSet<Channel> set;
 | 
			
		||||
                    if (!Subscribers.TryGetValue(token, out set))
 | 
			
		||||
                        return;
 | 
			
		||||
                    set.Add(e.Channel);
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync(":ok:").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "jcsc")
 | 
			
		||||
//                .Description($"Joins current channel to an instance of cross server channel using the token. **Needs Manage Server Permissions.**| `{Prefix}jcsc`")
 | 
			
		||||
//                .Parameter("token")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    int token;
 | 
			
		||||
//                    if (!int.TryParse(e.GetArg("token"), out token))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    HashSet<Channel> set;
 | 
			
		||||
//                    if (!Subscribers.TryGetValue(token, out set))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    set.Add(e.Channel);
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync(":ok:").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "lcsc")
 | 
			
		||||
                .Description($"Leaves Cross server channel instance from this channel. **Needs Manage Server Permissions.**| `{Prefix}lcsc`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    foreach (var subscriber in Subscribers)
 | 
			
		||||
                    {
 | 
			
		||||
                        subscriber.Value.Remove(e.Channel);
 | 
			
		||||
                    }
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync(":ok:").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "lcsc")
 | 
			
		||||
//                .Description($"Leaves Cross server channel instance from this channel. **Needs Manage Server Permissions.**| `{Prefix}lcsc`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    foreach (var subscriber in Subscribers)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        subscriber.Value.Remove(e.Channel);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync(":ok:").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,225 +1,225 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
//using Discord;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Generic;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
//using System.Text;
 | 
			
		||||
//using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    class CustomReactionsCommands : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        public CustomReactionsCommands(DiscordModule module) : base(module)
 | 
			
		||||
        {
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    class CustomReactionsCommands : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        public CustomReactionsCommands(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            var Prefix = Module.Prefix;
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            var Prefix = Module.Prefix;
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Prefix + "addcustreact")
 | 
			
		||||
                .Alias(Prefix + "acr")
 | 
			
		||||
                .Description($"Add a custom reaction. Guide here: <https://github.com/Kwoth/NadekoBot/wiki/Custom-Reactions> **Bot Owner Only!**   | `{Prefix}acr \"hello\" I love saying hello to %user%`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                .Parameter("name", ParameterType.Required)
 | 
			
		||||
                .Parameter("message", ParameterType.Unparsed)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var name = e.GetArg("name");
 | 
			
		||||
                    var message = e.GetArg("message")?.Trim();
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(message))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync($"Incorrect command usage. See -h {Prefix}acr for correct formatting").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (NadekoBot.Config.CustomReactions.ContainsKey(name))
 | 
			
		||||
                        NadekoBot.Config.CustomReactions[name].Add(message);
 | 
			
		||||
                    else
 | 
			
		||||
                        NadekoBot.Config.CustomReactions.Add(name, new System.Collections.Generic.List<string>() { message });
 | 
			
		||||
                    await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync($"Added {name} : {message}").ConfigureAwait(false);
 | 
			
		||||
//            cgb.CreateCommand(Prefix + "addcustreact")
 | 
			
		||||
//                .Alias(Prefix + "acr")
 | 
			
		||||
//                .Description($"Add a custom reaction. Guide here: <https://github.com/Kwoth/NadekoBot/wiki/Custom-Reactions> **Bot Owner Only!**   | `{Prefix}acr \"hello\" I love saying hello to %user%`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .Parameter("name", ParameterType.Required)
 | 
			
		||||
//                .Parameter("message", ParameterType.Unparsed)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var name = e.GetArg("name");
 | 
			
		||||
//                    var message = e.GetArg("message")?.Trim();
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(message))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync($"Incorrect command usage. See -h {Prefix}acr for correct formatting").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    if (NadekoBot.Config.CustomReactions.ContainsKey(name))
 | 
			
		||||
//                        NadekoBot.Config.CustomReactions[name].Add(message);
 | 
			
		||||
//                    else
 | 
			
		||||
//                        NadekoBot.Config.CustomReactions.Add(name, new System.Collections.Generic.List<string>() { message });
 | 
			
		||||
//                    await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync($"Added {name} : {message}").ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
                });
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Prefix + "listcustreact")
 | 
			
		||||
                .Alias(Prefix + "lcr")
 | 
			
		||||
                .Description($"Lists custom reactions (paginated with 30 commands per page). Use 'all' instead of page number to get all custom reactions DM-ed to you.  |`{Prefix}lcr 1`")
 | 
			
		||||
                .Parameter("num", ParameterType.Required)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var numStr = e.GetArg("num");
 | 
			
		||||
//            cgb.CreateCommand(Prefix + "listcustreact")
 | 
			
		||||
//                .Alias(Prefix + "lcr")
 | 
			
		||||
//                .Description($"Lists custom reactions (paginated with 30 commands per page). Use 'all' instead of page number to get all custom reactions DM-ed to you.  |`{Prefix}lcr 1`")
 | 
			
		||||
//                .Parameter("num", ParameterType.Required)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var numStr = e.GetArg("num");
 | 
			
		||||
 | 
			
		||||
                    if (numStr.ToUpperInvariant() == "ALL")
 | 
			
		||||
                    {
 | 
			
		||||
                        var fullstr = String.Join("\n", NadekoBot.Config.CustomReactions.Select(kvp => kvp.Key));
 | 
			
		||||
                        do
 | 
			
		||||
                        {
 | 
			
		||||
                            var str = string.Concat(fullstr.Take(1900));
 | 
			
		||||
                            fullstr = new string(fullstr.Skip(1900).ToArray());
 | 
			
		||||
                            await e.User.SendMessage("```xl\n" + str + "```");
 | 
			
		||||
                        } while (fullstr.Length != 0);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    int num;
 | 
			
		||||
                    if (!int.TryParse(numStr, out num) || num <= 0) num = 1;
 | 
			
		||||
                    var cmds = GetCustomsOnPage(num - 1);
 | 
			
		||||
                    if (!cmds.Any())
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`There are no custom reactions.`");
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        string result = SearchHelper.ShowInPrettyCode<string>(cmds, s => $"{s,-25}"); //People prefer starting with 1
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync($"`Showing page {num}:`\n" + result).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
//                    if (numStr.ToUpperInvariant() == "ALL")
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var fullstr = String.Join("\n", NadekoBot.Config.CustomReactions.Select(kvp => kvp.Key));
 | 
			
		||||
//                        do
 | 
			
		||||
//                        {
 | 
			
		||||
//                            var str = string.Concat(fullstr.Take(1900));
 | 
			
		||||
//                            fullstr = new string(fullstr.Skip(1900).ToArray());
 | 
			
		||||
//                            await e.User.SendMessage("```xl\n" + str + "```");
 | 
			
		||||
//                        } while (fullstr.Length != 0);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    int num;
 | 
			
		||||
//                    if (!int.TryParse(numStr, out num) || num <= 0) num = 1;
 | 
			
		||||
//                    var cmds = GetCustomsOnPage(num - 1);
 | 
			
		||||
//                    if (!cmds.Any())
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`There are no custom reactions.`");
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else
 | 
			
		||||
//                    {
 | 
			
		||||
//                        string result = SearchHelper.ShowInPrettyCode<string>(cmds, s => $"{s,-25}"); //People prefer starting with 1
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync($"`Showing page {num}:`\n" + result).ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Prefix + "showcustreact")
 | 
			
		||||
                .Alias(Prefix + "scr")
 | 
			
		||||
                .Description($"Shows all possible responses from a single custom reaction. |`{Prefix}scr %mention% bb`")
 | 
			
		||||
                .Parameter("name", ParameterType.Unparsed)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var name = e.GetArg("name")?.Trim();
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(name))
 | 
			
		||||
                        return;
 | 
			
		||||
                    if (!NadekoBot.Config.CustomReactions.ContainsKey(name))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`Can't find that custom reaction.`").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    var items = NadekoBot.Config.CustomReactions[name];
 | 
			
		||||
                    var message = new StringBuilder($"Responses for {Format.Bold(name)}:\n");
 | 
			
		||||
                    var last = items.Last();
 | 
			
		||||
//            cgb.CreateCommand(Prefix + "showcustreact")
 | 
			
		||||
//                .Alias(Prefix + "scr")
 | 
			
		||||
//                .Description($"Shows all possible responses from a single custom reaction. |`{Prefix}scr %mention% bb`")
 | 
			
		||||
//                .Parameter("name", ParameterType.Unparsed)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var name = e.GetArg("name")?.Trim();
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(name))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    if (!NadekoBot.Config.CustomReactions.ContainsKey(name))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`Can't find that custom reaction.`").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    var items = NadekoBot.Config.CustomReactions[name];
 | 
			
		||||
//                    var message = new StringBuilder($"Responses for {Format.Bold(name)}:\n");
 | 
			
		||||
//                    var last = items.Last();
 | 
			
		||||
 | 
			
		||||
                    int i = 1;
 | 
			
		||||
                    foreach (var reaction in items)
 | 
			
		||||
                    {
 | 
			
		||||
                        message.AppendLine($"[{i++}] " + Format.Code(Format.Escape(reaction)));
 | 
			
		||||
                    }
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync(message.ToString());
 | 
			
		||||
                });
 | 
			
		||||
//                    int i = 1;
 | 
			
		||||
//                    foreach (var reaction in items)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        message.AppendLine($"[{i++}] " + Format.Code(Format.Escape(reaction)));
 | 
			
		||||
//                    }
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync(message.ToString());
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Prefix + "editcustreact")
 | 
			
		||||
                .Alias(Prefix + "ecr")
 | 
			
		||||
                .Description($"Edits a custom reaction, arguments are custom reactions name, index to change, and a (multiword) message **Bot Owner Only** | `{Prefix}ecr \"%mention% disguise\" 2 Test 123`")
 | 
			
		||||
                .Parameter("name", ParameterType.Required)
 | 
			
		||||
                .Parameter("index", ParameterType.Required)
 | 
			
		||||
                .Parameter("message", ParameterType.Unparsed)
 | 
			
		||||
                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var name = e.GetArg("name")?.Trim();
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(name))
 | 
			
		||||
                        return;
 | 
			
		||||
                    var indexstr = e.GetArg("index")?.Trim();
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(indexstr))
 | 
			
		||||
                        return;
 | 
			
		||||
                    var msg = e.GetArg("message")?.Trim();
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(msg))
 | 
			
		||||
                        return;
 | 
			
		||||
//            cgb.CreateCommand(Prefix + "editcustreact")
 | 
			
		||||
//                .Alias(Prefix + "ecr")
 | 
			
		||||
//                .Description($"Edits a custom reaction, arguments are custom reactions name, index to change, and a (multiword) message **Bot Owner Only** | `{Prefix}ecr \"%mention% disguise\" 2 Test 123`")
 | 
			
		||||
//                .Parameter("name", ParameterType.Required)
 | 
			
		||||
//                .Parameter("index", ParameterType.Required)
 | 
			
		||||
//                .Parameter("message", ParameterType.Unparsed)
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var name = e.GetArg("name")?.Trim();
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(name))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    var indexstr = e.GetArg("index")?.Trim();
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(indexstr))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    var msg = e.GetArg("message")?.Trim();
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(msg))
 | 
			
		||||
//                        return;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    if (!NadekoBot.Config.CustomReactions.ContainsKey(name))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`Could not find given commandname`").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
//                    if (!NadekoBot.Config.CustomReactions.ContainsKey(name))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`Could not find given commandname`").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
                    int index;
 | 
			
		||||
                    if (!int.TryParse(indexstr, out index) || index < 1 || index > NadekoBot.Config.CustomReactions[name].Count)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`Invalid index.`").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    index = index - 1;
 | 
			
		||||
                    NadekoBot.Config.CustomReactions[name][index] = msg;
 | 
			
		||||
//                    int index;
 | 
			
		||||
//                    if (!int.TryParse(indexstr, out index) || index < 1 || index > NadekoBot.Config.CustomReactions[name].Count)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`Invalid index.`").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    index = index - 1;
 | 
			
		||||
//                    NadekoBot.Config.CustomReactions[name][index] = msg;
 | 
			
		||||
 | 
			
		||||
                    await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync($"Edited response #{index + 1} from `{name}`").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//                    await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync($"Edited response #{index + 1} from `{name}`").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Prefix + "delcustreact")
 | 
			
		||||
                .Alias(Prefix + "dcr")
 | 
			
		||||
                .Description($"Deletes a custom reaction with given name (and index). **Bot Owner Only.**| `{Prefix}dcr index`")
 | 
			
		||||
                .Parameter("name", ParameterType.Required)
 | 
			
		||||
                .Parameter("index", ParameterType.Optional)
 | 
			
		||||
                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var name = e.GetArg("name")?.Trim();
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(name))
 | 
			
		||||
                        return;
 | 
			
		||||
                    if (!NadekoBot.Config.CustomReactions.ContainsKey(name))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Could not find given commandname").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    string message = "";
 | 
			
		||||
                    int index;
 | 
			
		||||
                    if (int.TryParse(e.GetArg("index")?.Trim() ?? "", out index))
 | 
			
		||||
                    {
 | 
			
		||||
                        index = index - 1;
 | 
			
		||||
                        if (index < 0 || index > NadekoBot.Config.CustomReactions[name].Count)
 | 
			
		||||
                        {
 | 
			
		||||
                            await imsg.Channel.SendMessageAsync("Given index was out of range").ConfigureAwait(false);
 | 
			
		||||
                            return;
 | 
			
		||||
//            cgb.CreateCommand(Prefix + "delcustreact")
 | 
			
		||||
//                .Alias(Prefix + "dcr")
 | 
			
		||||
//                .Description($"Deletes a custom reaction with given name (and index). **Bot Owner Only.**| `{Prefix}dcr index`")
 | 
			
		||||
//                .Parameter("name", ParameterType.Required)
 | 
			
		||||
//                .Parameter("index", ParameterType.Optional)
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var name = e.GetArg("name")?.Trim();
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(name))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    if (!NadekoBot.Config.CustomReactions.ContainsKey(name))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Could not find given commandname").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    string message = "";
 | 
			
		||||
//                    int index;
 | 
			
		||||
//                    if (int.TryParse(e.GetArg("index")?.Trim() ?? "", out index))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        index = index - 1;
 | 
			
		||||
//                        if (index < 0 || index > NadekoBot.Config.CustomReactions[name].Count)
 | 
			
		||||
//                        {
 | 
			
		||||
//                            await imsg.Channel.SendMessageAsync("Given index was out of range").ConfigureAwait(false);
 | 
			
		||||
//                            return;
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
                        NadekoBot.Config.CustomReactions[name].RemoveAt(index);
 | 
			
		||||
                        if (!NadekoBot.Config.CustomReactions[name].Any())
 | 
			
		||||
                        {
 | 
			
		||||
                            NadekoBot.Config.CustomReactions.Remove(name);
 | 
			
		||||
                        }
 | 
			
		||||
                        message = $"Deleted response #{index + 1} from `{name}`";
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        NadekoBot.Config.CustomReactions.Remove(name);
 | 
			
		||||
                        message = $"Deleted custom reaction: `{name}`";
 | 
			
		||||
                    }
 | 
			
		||||
                    await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync(message).ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
//                        }
 | 
			
		||||
//                        NadekoBot.Config.CustomReactions[name].RemoveAt(index);
 | 
			
		||||
//                        if (!NadekoBot.Config.CustomReactions[name].Any())
 | 
			
		||||
//                        {
 | 
			
		||||
//                            NadekoBot.Config.CustomReactions.Remove(name);
 | 
			
		||||
//                        }
 | 
			
		||||
//                        message = $"Deleted response #{index + 1} from `{name}`";
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else
 | 
			
		||||
//                    {
 | 
			
		||||
//                        NadekoBot.Config.CustomReactions.Remove(name);
 | 
			
		||||
//                        message = $"Deleted custom reaction: `{name}`";
 | 
			
		||||
//                    }
 | 
			
		||||
//                    await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync(message).ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private readonly int ItemsPerPage = 30;
 | 
			
		||||
//        private readonly int ItemsPerPage = 30;
 | 
			
		||||
 | 
			
		||||
        private IEnumerable<string> GetCustomsOnPage(int page)
 | 
			
		||||
        {
 | 
			
		||||
            var items = NadekoBot.Config.CustomReactions.Skip(page * ItemsPerPage).Take(ItemsPerPage);
 | 
			
		||||
            if (!items.Any())
 | 
			
		||||
            {
 | 
			
		||||
                return Enumerable.Empty<string>();
 | 
			
		||||
            }
 | 
			
		||||
            return items.Select(kvp => kvp.Key);
 | 
			
		||||
            /*
 | 
			
		||||
            var message = new StringBuilder($"--- Custom reactions - page {page + 1} ---\n");
 | 
			
		||||
            foreach (var cr in items)
 | 
			
		||||
            {
 | 
			
		||||
                message.Append($"{Format.Code(cr.Key)}\n");
 | 
			
		||||
                int i = 1;
 | 
			
		||||
                var last = cr.Value.Last();
 | 
			
		||||
                foreach (var reaction in cr.Value)
 | 
			
		||||
                {
 | 
			
		||||
                    if (last != reaction)
 | 
			
		||||
                        message.AppendLine("  `├" + i++ + "─`" + Format.Bold(reaction));
 | 
			
		||||
                    else
 | 
			
		||||
                        message.AppendLine("  `└" + i++ + "─`" + Format.Bold(reaction));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return message.ToString() + "\n";
 | 
			
		||||
            */
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
// zeta is a god
 | 
			
		||||
//├
 | 
			
		||||
//─
 | 
			
		||||
//│
 | 
			
		||||
//└
 | 
			
		||||
//        private IEnumerable<string> GetCustomsOnPage(int page)
 | 
			
		||||
//        {
 | 
			
		||||
//            var items = NadekoBot.Config.CustomReactions.Skip(page * ItemsPerPage).Take(ItemsPerPage);
 | 
			
		||||
//            if (!items.Any())
 | 
			
		||||
//            {
 | 
			
		||||
//                return Enumerable.Empty<string>();
 | 
			
		||||
//            }
 | 
			
		||||
//            return items.Select(kvp => kvp.Key);
 | 
			
		||||
//            /*
 | 
			
		||||
//            var message = new StringBuilder($"--- Custom reactions - page {page + 1} ---\n");
 | 
			
		||||
//            foreach (var cr in items)
 | 
			
		||||
//            {
 | 
			
		||||
//                message.Append($"{Format.Code(cr.Key)}\n");
 | 
			
		||||
//                int i = 1;
 | 
			
		||||
//                var last = cr.Value.Last();
 | 
			
		||||
//                foreach (var reaction in cr.Value)
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (last != reaction)
 | 
			
		||||
//                        message.AppendLine("  `├" + i++ + "─`" + Format.Bold(reaction));
 | 
			
		||||
//                    else
 | 
			
		||||
//                        message.AppendLine("  `└" + i++ + "─`" + Format.Bold(reaction));
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//            return message.ToString() + "\n";
 | 
			
		||||
//            */
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
//// zeta is a god
 | 
			
		||||
////├
 | 
			
		||||
////─
 | 
			
		||||
////│
 | 
			
		||||
////└
 | 
			
		||||
 
 | 
			
		||||
@@ -1,47 +1,47 @@
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.DataModels;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.DataModels;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System.IO;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    internal class IncidentsCommands : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        public IncidentsCommands(DiscordModule module) : base(module) { }
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "listincidents")
 | 
			
		||||
                .Alias(Prefix + "lin")
 | 
			
		||||
                .Description($"List all UNREAD incidents and flags them as read. **Needs Manage Server Permissions.**| `{Prefix}lin`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var sid = (long)e.Server.Id;
 | 
			
		||||
                    var incs = DbHandler.Instance.FindAll<Incident>(i => i.ServerId == sid && i.Read == false);
 | 
			
		||||
                    DbHandler.Instance.Connection.UpdateAll(incs.Select(i => { i.Read = true; return i; }));
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    internal class IncidentsCommands : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        public IncidentsCommands(DiscordModule module) : base(module) { }
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "listincidents")
 | 
			
		||||
//                .Alias(Prefix + "lin")
 | 
			
		||||
//                .Description($"List all UNREAD incidents and flags them as read. **Needs Manage Server Permissions.**| `{Prefix}lin`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var sid = (long)e.Server.Id;
 | 
			
		||||
//                    var incs = DbHandler.Instance.FindAll<Incident>(i => i.ServerId == sid && i.Read == false);
 | 
			
		||||
//                    DbHandler.Instance.Connection.UpdateAll(incs.Select(i => { i.Read = true; return i; }));
 | 
			
		||||
 | 
			
		||||
                    await e.User.SendMessage(string.Join("\n----------------------", incs.Select(i => i.Text)));
 | 
			
		||||
                });
 | 
			
		||||
//                    await e.User.SendMessage(string.Join("\n----------------------", incs.Select(i => i.Text)));
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "listallincidents")
 | 
			
		||||
                .Alias(Prefix + "lain")
 | 
			
		||||
                .Description($"Sends you a file containing all incidents and flags them as read. **Needs Manage Server Permissions.**| `{Prefix}lain`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var sid = (long)e.Server.Id;
 | 
			
		||||
                    var incs = DbHandler.Instance.FindAll<Incident>(i => i.ServerId == sid);
 | 
			
		||||
                    DbHandler.Instance.Connection.UpdateAll(incs.Select(i => { i.Read = true; return i; }));
 | 
			
		||||
                    var data = string.Join("\n----------------------\n", incs.Select(i => i.Text));
 | 
			
		||||
                    MemoryStream ms = new MemoryStream();
 | 
			
		||||
                    var sw = new StreamWriter(ms);
 | 
			
		||||
                    sw.WriteLine(data);
 | 
			
		||||
                    sw.Flush();
 | 
			
		||||
                    sw.BaseStream.Position = 0;
 | 
			
		||||
                    await e.User.SendFile("incidents.txt", sw.BaseStream);
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "listallincidents")
 | 
			
		||||
//                .Alias(Prefix + "lain")
 | 
			
		||||
//                .Description($"Sends you a file containing all incidents and flags them as read. **Needs Manage Server Permissions.**| `{Prefix}lain`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var sid = (long)e.Server.Id;
 | 
			
		||||
//                    var incs = DbHandler.Instance.FindAll<Incident>(i => i.ServerId == sid);
 | 
			
		||||
//                    DbHandler.Instance.Connection.UpdateAll(incs.Select(i => { i.Read = true; return i; }));
 | 
			
		||||
//                    var data = string.Join("\n----------------------\n", incs.Select(i => i.Text));
 | 
			
		||||
//                    MemoryStream ms = new MemoryStream();
 | 
			
		||||
//                    var sw = new StreamWriter(ms);
 | 
			
		||||
//                    sw.WriteLine(data);
 | 
			
		||||
//                    sw.Flush();
 | 
			
		||||
//                    sw.BaseStream.Position = 0;
 | 
			
		||||
//                    await e.User.SendFile("incidents.txt", sw.BaseStream);
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,483 +1,483 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.Extensions;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
//using Discord;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Extensions;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Concurrent;
 | 
			
		||||
//using System.Collections.Generic;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
//using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    internal class LogCommand : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    internal class LogCommand : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
 | 
			
		||||
 | 
			
		||||
        private ConcurrentBag<KeyValuePair<Channel, string>> voicePresenceUpdates = new ConcurrentBag<KeyValuePair<Channel, string>>();
 | 
			
		||||
//        private ConcurrentBag<KeyValuePair<Channel, string>> voicePresenceUpdates = new ConcurrentBag<KeyValuePair<Channel, string>>();
 | 
			
		||||
 | 
			
		||||
        public LogCommand(DiscordModule module) : base(module)
 | 
			
		||||
        {
 | 
			
		||||
            NadekoBot.Client.MessageReceived += MsgRecivd;
 | 
			
		||||
            NadekoBot.Client.MessageDeleted += MsgDltd;
 | 
			
		||||
            NadekoBot.Client.MessageUpdated += MsgUpdtd;
 | 
			
		||||
            NadekoBot.Client.UserUpdated += UsrUpdtd;
 | 
			
		||||
            NadekoBot.Client.UserBanned += UsrBanned;
 | 
			
		||||
            NadekoBot.Client.UserLeft += UsrLeft;
 | 
			
		||||
            NadekoBot.Client.UserJoined += UsrJoined;
 | 
			
		||||
            NadekoBot.Client.UserUnbanned += UsrUnbanned;
 | 
			
		||||
            NadekoBot.Client.ChannelCreated += ChannelCreated;
 | 
			
		||||
            NadekoBot.Client.ChannelDestroyed += ChannelDestroyed;
 | 
			
		||||
            NadekoBot.Client.ChannelUpdated += ChannelUpdated;
 | 
			
		||||
//        public LogCommand(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
//            NadekoBot.Client.MessageReceived += MsgRecivd;
 | 
			
		||||
//            NadekoBot.Client.MessageDeleted += MsgDltd;
 | 
			
		||||
//            NadekoBot.Client.MessageUpdated += MsgUpdtd;
 | 
			
		||||
//            NadekoBot.Client.UserUpdated += UsrUpdtd;
 | 
			
		||||
//            NadekoBot.Client.UserBanned += UsrBanned;
 | 
			
		||||
//            NadekoBot.Client.UserLeft += UsrLeft;
 | 
			
		||||
//            NadekoBot.Client.UserJoined += UsrJoined;
 | 
			
		||||
//            NadekoBot.Client.UserUnbanned += UsrUnbanned;
 | 
			
		||||
//            NadekoBot.Client.ChannelCreated += ChannelCreated;
 | 
			
		||||
//            NadekoBot.Client.ChannelDestroyed += ChannelDestroyed;
 | 
			
		||||
//            NadekoBot.Client.ChannelUpdated += ChannelUpdated;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            NadekoBot.Client.MessageReceived += async (s, e) =>
 | 
			
		||||
            {
 | 
			
		||||
                if (e.Channel.IsPrivate || e.User.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
                    return;
 | 
			
		||||
                if (!SpecificConfigurations.Default.Of(e.Server.Id).SendPrivateMessageOnMention) return;
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    var usr = e.Message.MentionedUsers.FirstOrDefault(u => u != e.User);
 | 
			
		||||
                    if (usr?.Status != UserStatus.Offline)
 | 
			
		||||
                        return;
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync($"User `{usr.Name}` is offline. PM sent.").ConfigureAwait(false);
 | 
			
		||||
                    await usr.SendMessage(
 | 
			
		||||
                        $"User `{e.User.Name}` mentioned you on " +
 | 
			
		||||
                        $"`{e.Server.Name}` server while you were offline.\n" +
 | 
			
		||||
                        $"`Message:` {e.Message.Text}").ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                catch { }
 | 
			
		||||
            };
 | 
			
		||||
//            NadekoBot.Client.MessageReceived += async (s, e) =>
 | 
			
		||||
//            {
 | 
			
		||||
//                if (e.Channel.IsPrivate || e.User.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                if (!SpecificConfigurations.Default.Of(e.Server.Id).SendPrivateMessageOnMention) return;
 | 
			
		||||
//                try
 | 
			
		||||
//                {
 | 
			
		||||
//                    var usr = e.Message.MentionedUsers.FirstOrDefault(u => u != e.User);
 | 
			
		||||
//                    if (usr?.Status != UserStatus.Offline)
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync($"User `{usr.Name}` is offline. PM sent.").ConfigureAwait(false);
 | 
			
		||||
//                    await usr.SendMessage(
 | 
			
		||||
//                        $"User `{e.User.Name}` mentioned you on " +
 | 
			
		||||
//                        $"`{e.Server.Name}` server while you were offline.\n" +
 | 
			
		||||
//                        $"`Message:` {e.Message.Text}").ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//                catch { }
 | 
			
		||||
//            };
 | 
			
		||||
 | 
			
		||||
            // start the userpresence queue
 | 
			
		||||
//            // start the userpresence queue
 | 
			
		||||
 | 
			
		||||
            NadekoBot.OnReady += () => Task.Run(async () =>
 | 
			
		||||
             {
 | 
			
		||||
                 while (true)
 | 
			
		||||
                 {
 | 
			
		||||
                     var toSend = new Dictionary<Channel, string>();
 | 
			
		||||
                     //take everything from the queue and merge the messages which are going to the same channel
 | 
			
		||||
                     KeyValuePair<Channel, string> item;
 | 
			
		||||
                     while (voicePresenceUpdates.TryTake(out item))
 | 
			
		||||
                     {
 | 
			
		||||
                         if (toSend.ContainsKey(item.Key))
 | 
			
		||||
                         {
 | 
			
		||||
                             toSend[item.Key] = toSend[item.Key] + Environment.NewLine + item.Value;
 | 
			
		||||
                         }
 | 
			
		||||
                         else
 | 
			
		||||
                         {
 | 
			
		||||
                             toSend.Add(item.Key, item.Value);
 | 
			
		||||
                         }
 | 
			
		||||
                     }
 | 
			
		||||
                     //send merged messages to each channel
 | 
			
		||||
                     foreach (var k in toSend)
 | 
			
		||||
                     {
 | 
			
		||||
                         try { await k.Key.SendMessage(Environment.NewLine + k.Value).ConfigureAwait(false); } catch { }
 | 
			
		||||
                     }
 | 
			
		||||
//            NadekoBot.OnReady += () => Task.Run(async () =>
 | 
			
		||||
//             {
 | 
			
		||||
//                 while (true)
 | 
			
		||||
//                 {
 | 
			
		||||
//                     var toSend = new Dictionary<Channel, string>();
 | 
			
		||||
//                     //take everything from the queue and merge the messages which are going to the same channel
 | 
			
		||||
//                     KeyValuePair<Channel, string> item;
 | 
			
		||||
//                     while (voicePresenceUpdates.TryTake(out item))
 | 
			
		||||
//                     {
 | 
			
		||||
//                         if (toSend.ContainsKey(item.Key))
 | 
			
		||||
//                         {
 | 
			
		||||
//                             toSend[item.Key] = toSend[item.Key] + Environment.NewLine + item.Value;
 | 
			
		||||
//                         }
 | 
			
		||||
//                         else
 | 
			
		||||
//                         {
 | 
			
		||||
//                             toSend.Add(item.Key, item.Value);
 | 
			
		||||
//                         }
 | 
			
		||||
//                     }
 | 
			
		||||
//                     //send merged messages to each channel
 | 
			
		||||
//                     foreach (var k in toSend)
 | 
			
		||||
//                     {
 | 
			
		||||
//                         try { await k.Key.SendMessage(Environment.NewLine + k.Value).ConfigureAwait(false); } catch { }
 | 
			
		||||
//                     }
 | 
			
		||||
 | 
			
		||||
                     await Task.Delay(5000);
 | 
			
		||||
                 }
 | 
			
		||||
             });
 | 
			
		||||
        }
 | 
			
		||||
//                     await Task.Delay(5000);
 | 
			
		||||
//                 }
 | 
			
		||||
//             });
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private async void ChannelUpdated(object sender, ChannelUpdatedEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                var chId = config.LogServerChannel;
 | 
			
		||||
                if (chId == null || config.LogserverIgnoreChannels.Contains(e.After.Id))
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                if (e.Before.Name != e.After.Name)
 | 
			
		||||
                    await ch.SendMessage($@"`{prettyCurrentTime}` **Channel Name Changed** `#{e.Before.Name}` (*{e.After.Id}*)
 | 
			
		||||
        `New:` {e.After.Name}").ConfigureAwait(false);
 | 
			
		||||
                else if (e.Before.Topic != e.After.Topic)
 | 
			
		||||
                    await ch.SendMessage($@"`{prettyCurrentTime}` **Channel Topic Changed** `#{e.After.Name}` (*{e.After.Id}*)
 | 
			
		||||
        `Old:` {e.Before.Topic}
 | 
			
		||||
        `New:` {e.After.Topic}").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
//        private async void ChannelUpdated(object sender, ChannelUpdatedEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || config.LogserverIgnoreChannels.Contains(e.After.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                if (e.Before.Name != e.After.Name)
 | 
			
		||||
//                    await ch.SendMessage($@"`{prettyCurrentTime}` **Channel Name Changed** `#{e.Before.Name}` (*{e.After.Id}*)
 | 
			
		||||
//        `New:` {e.After.Name}").ConfigureAwait(false);
 | 
			
		||||
//                else if (e.Before.Topic != e.After.Topic)
 | 
			
		||||
//                    await ch.SendMessage($@"`{prettyCurrentTime}` **Channel Topic Changed** `#{e.After.Name}` (*{e.After.Id}*)
 | 
			
		||||
//        `Old:` {e.Before.Topic}
 | 
			
		||||
//        `New:` {e.After.Topic}").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private async void ChannelDestroyed(object sender, ChannelEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                var chId = config.LogServerChannel;
 | 
			
		||||
                if (chId == null || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                await ch.SendMessage($"❗`{prettyCurrentTime}`❗`Channel Deleted:` #{e.Channel.Name} (*{e.Channel.Id}*)").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
//        private async void ChannelDestroyed(object sender, ChannelEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessage($"❗`{prettyCurrentTime}`❗`Channel Deleted:` #{e.Channel.Name} (*{e.Channel.Id}*)").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private async void ChannelCreated(object sender, ChannelEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                var chId = config.LogServerChannel;
 | 
			
		||||
                if (chId == null || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                await ch.SendMessage($"`{prettyCurrentTime}`🆕`Channel Created:` #{e.Channel.Mention} (*{e.Channel.Id}*)").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
//        private async void ChannelCreated(object sender, ChannelEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessage($"`{prettyCurrentTime}`🆕`Channel Created:` #{e.Channel.Mention} (*{e.Channel.Id}*)").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private async void UsrUnbanned(object sender, UserEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
                if (chId == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                await ch.SendMessage($"`{prettyCurrentTime}`♻`User was unbanned:` **{e.User.Name}** ({e.User.Id})").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
//        private async void UsrUnbanned(object sender, UserEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                if (chId == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessage($"`{prettyCurrentTime}`♻`User was unbanned:` **{e.User.Name}** ({e.User.Id})").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private async void UsrJoined(object sender, UserEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
                if (chId == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                await ch.SendMessage($"`{prettyCurrentTime}`✅`User joined:` **{e.User.Name}** ({e.User.Id})").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
//        private async void UsrJoined(object sender, UserEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                if (chId == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessage($"`{prettyCurrentTime}`✅`User joined:` **{e.User.Name}** ({e.User.Id})").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private async void UsrLeft(object sender, UserEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
                if (chId == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                await ch.SendMessage($"`{prettyCurrentTime}`❗`User left:` **{e.User.Name}** ({e.User.Id})").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
//        private async void UsrLeft(object sender, UserEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                if (chId == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessage($"`{prettyCurrentTime}`❗`User left:` **{e.User.Name}** ({e.User.Id})").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private async void UsrBanned(object sender, UserEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
                if (chId == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                await ch.SendMessage($"❗`{prettyCurrentTime}`❌`User banned:` **{e.User.Name}** ({e.User.Id})").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
//        private async void UsrBanned(object sender, UserEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                if (chId == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessage($"❗`{prettyCurrentTime}`❌`User banned:` **{e.User.Name}** ({e.User.Id})").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private async void MsgRecivd(object sender, MessageEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (e.Server == null || e.Channel.IsPrivate || e.User.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
                    return;
 | 
			
		||||
                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                var chId = config.LogServerChannel;
 | 
			
		||||
                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                if (!string.IsNullOrWhiteSpace(e.Message.Text))
 | 
			
		||||
                {
 | 
			
		||||
                    await ch.SendMessage(
 | 
			
		||||
        $@"🕔`{prettyCurrentTime}` **New Message** `#{e.Channel.Name}`
 | 
			
		||||
👤`{e.User?.ToString() ?? ("NULL")}` {e.Message.Text.Unmention()}").ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    await ch.SendMessage(
 | 
			
		||||
        $@"🕔`{prettyCurrentTime}` **File Uploaded** `#{e.Channel.Name}`
 | 
			
		||||
👤`{e.User?.ToString() ?? ("NULL")}` {e.Message.Attachments.FirstOrDefault()?.ProxyUrl}").ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
//        private async void MsgRecivd(object sender, MessageEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                if (e.Server == null || e.Channel.IsPrivate || e.User.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                if (!string.IsNullOrWhiteSpace(e.Message.Text))
 | 
			
		||||
//                {
 | 
			
		||||
//                    await ch.SendMessage(
 | 
			
		||||
//        $@"🕔`{prettyCurrentTime}` **New Message** `#{e.Channel.Name}`
 | 
			
		||||
//👤`{e.User?.ToString() ?? ("NULL")}` {e.Message.Text.Unmention()}").ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                {
 | 
			
		||||
//                    await ch.SendMessage(
 | 
			
		||||
//        $@"🕔`{prettyCurrentTime}` **File Uploaded** `#{e.Channel.Name}`
 | 
			
		||||
//👤`{e.User?.ToString() ?? ("NULL")}` {e.Message.Attachments.FirstOrDefault()?.ProxyUrl}").ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
        private async void MsgDltd(object sender, MessageEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (e.Server == null || e.Channel.IsPrivate || e.User?.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
                    return;
 | 
			
		||||
                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                var chId = config.LogServerChannel;
 | 
			
		||||
                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                if (!string.IsNullOrWhiteSpace(e.Message.Text))
 | 
			
		||||
                {
 | 
			
		||||
                    await ch.SendMessage(
 | 
			
		||||
        $@"🕔`{prettyCurrentTime}` **Message** 🚮 `#{e.Channel.Name}`
 | 
			
		||||
👤`{e.User?.ToString() ?? ("NULL")}` {e.Message.Text.Unmention()}").ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    await ch.SendMessage(
 | 
			
		||||
        $@"🕔`{prettyCurrentTime}` **File Deleted** `#{e.Channel.Name}`
 | 
			
		||||
👤`{e.User?.ToString() ?? ("NULL")}` {e.Message.Attachments.FirstOrDefault()?.ProxyUrl}").ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
        private async void MsgUpdtd(object sender, MessageUpdatedEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (e.Server == null || e.Channel.IsPrivate || e.User?.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
                    return;
 | 
			
		||||
                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                var chId = config.LogServerChannel;
 | 
			
		||||
                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                await ch.SendMessage(
 | 
			
		||||
        $@"🕔`{prettyCurrentTime}` **Message** 📝 `#{e.Channel.Name}`
 | 
			
		||||
👤`{e.User?.ToString() ?? ("NULL")}`
 | 
			
		||||
        `Old:` {e.Before.Text.Unmention()}
 | 
			
		||||
        `New:` {e.After.Text.Unmention()}").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
        private async void UsrUpdtd(object sender, UserUpdatedEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var chId = config.LogPresenceChannel;
 | 
			
		||||
                if (chId != null)
 | 
			
		||||
                {
 | 
			
		||||
                    Channel ch;
 | 
			
		||||
                    if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (e.Before.Status != e.After.Status)
 | 
			
		||||
                        {
 | 
			
		||||
                            voicePresenceUpdates.Add(new KeyValuePair<Channel, string>(ch, $"`{prettyCurrentTime}`**{e.Before.Name}** is now **{e.After.Status}**."));
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
//        private async void MsgDltd(object sender, MessageEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                if (e.Server == null || e.Channel.IsPrivate || e.User?.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                if (!string.IsNullOrWhiteSpace(e.Message.Text))
 | 
			
		||||
//                {
 | 
			
		||||
//                    await ch.SendMessage(
 | 
			
		||||
//        $@"🕔`{prettyCurrentTime}` **Message** 🚮 `#{e.Channel.Name}`
 | 
			
		||||
//👤`{e.User?.ToString() ?? ("NULL")}` {e.Message.Text.Unmention()}").ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                {
 | 
			
		||||
//                    await ch.SendMessage(
 | 
			
		||||
//        $@"🕔`{prettyCurrentTime}` **File Deleted** `#{e.Channel.Name}`
 | 
			
		||||
//👤`{e.User?.ToString() ?? ("NULL")}` {e.Message.Attachments.FirstOrDefault()?.ProxyUrl}").ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
//        private async void MsgUpdtd(object sender, MessageUpdatedEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                if (e.Server == null || e.Channel.IsPrivate || e.User?.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessage(
 | 
			
		||||
//        $@"🕔`{prettyCurrentTime}` **Message** 📝 `#{e.Channel.Name}`
 | 
			
		||||
//👤`{e.User?.ToString() ?? ("NULL")}`
 | 
			
		||||
//        `Old:` {e.Before.Text.Unmention()}
 | 
			
		||||
//        `New:` {e.After.Text.Unmention()}").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
//        private async void UsrUpdtd(object sender, UserUpdatedEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = config.LogPresenceChannel;
 | 
			
		||||
//                if (chId != null)
 | 
			
		||||
//                {
 | 
			
		||||
//                    Channel ch;
 | 
			
		||||
//                    if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) != null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        if (e.Before.Status != e.After.Status)
 | 
			
		||||
//                        {
 | 
			
		||||
//                            voicePresenceUpdates.Add(new KeyValuePair<Channel, string>(ch, $"`{prettyCurrentTime}`**{e.Before.Name}** is now **{e.After.Status}**."));
 | 
			
		||||
//                        }
 | 
			
		||||
//                    }
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                ulong notifyChBeforeId;
 | 
			
		||||
                ulong notifyChAfterId;
 | 
			
		||||
                Channel notifyChBefore = null;
 | 
			
		||||
                Channel notifyChAfter = null;
 | 
			
		||||
                var beforeVch = e.Before.VoiceChannel;
 | 
			
		||||
                var afterVch = e.After.VoiceChannel;
 | 
			
		||||
                var notifyLeave = false;
 | 
			
		||||
                var notifyJoin = false;
 | 
			
		||||
                if ((beforeVch != null || afterVch != null) && (beforeVch != afterVch)) // this means we need to notify for sure.
 | 
			
		||||
                {
 | 
			
		||||
                    if (beforeVch != null && config.VoiceChannelLog.TryGetValue(beforeVch.Id, out notifyChBeforeId) && (notifyChBefore = e.Before.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChBeforeId)) != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        notifyLeave = true;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (afterVch != null && config.VoiceChannelLog.TryGetValue(afterVch.Id, out notifyChAfterId) && (notifyChAfter = e.After.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChAfterId)) != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        notifyJoin = true;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((notifyLeave && notifyJoin) && (notifyChAfter == notifyChBefore))
 | 
			
		||||
                    {
 | 
			
		||||
                        await notifyChAfter.SendMessage($"🎼`{prettyCurrentTime}` {e.Before.Name} moved from **{beforeVch.Mention}** to **{afterVch.Mention}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (notifyJoin)
 | 
			
		||||
                    {
 | 
			
		||||
                        await notifyChAfter.SendMessage($"🎼`{prettyCurrentTime}` {e.Before.Name} has joined **{afterVch.Mention}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (notifyLeave)
 | 
			
		||||
                    {
 | 
			
		||||
                        await notifyChBefore.SendMessage($"🎼`{prettyCurrentTime}` {e.Before.Name} has left **{beforeVch.Mention}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                ulong notifyChBeforeId;
 | 
			
		||||
//                ulong notifyChAfterId;
 | 
			
		||||
//                Channel notifyChBefore = null;
 | 
			
		||||
//                Channel notifyChAfter = null;
 | 
			
		||||
//                var beforeVch = e.Before.VoiceChannel;
 | 
			
		||||
//                var afterVch = e.After.VoiceChannel;
 | 
			
		||||
//                var notifyLeave = false;
 | 
			
		||||
//                var notifyJoin = false;
 | 
			
		||||
//                if ((beforeVch != null || afterVch != null) && (beforeVch != afterVch)) // this means we need to notify for sure.
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (beforeVch != null && config.VoiceChannelLog.TryGetValue(beforeVch.Id, out notifyChBeforeId) && (notifyChBefore = e.Before.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChBeforeId)) != null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        notifyLeave = true;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    if (afterVch != null && config.VoiceChannelLog.TryGetValue(afterVch.Id, out notifyChAfterId) && (notifyChAfter = e.After.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChAfterId)) != null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        notifyJoin = true;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    if ((notifyLeave && notifyJoin) && (notifyChAfter == notifyChBefore))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await notifyChAfter.SendMessage($"🎼`{prettyCurrentTime}` {e.Before.Name} moved from **{beforeVch.Mention}** to **{afterVch.Mention}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else if (notifyJoin)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await notifyChAfter.SendMessage($"🎼`{prettyCurrentTime}` {e.Before.Name} has joined **{afterVch.Mention}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else if (notifyLeave)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await notifyChBefore.SendMessage($"🎼`{prettyCurrentTime}` {e.Before.Name} has left **{beforeVch.Mention}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
                if (chId == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                Channel ch;
 | 
			
		||||
                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                    return;
 | 
			
		||||
                string str = $"🕔`{prettyCurrentTime}`";
 | 
			
		||||
                if (e.Before.Name != e.After.Name)
 | 
			
		||||
                    str += $"**Name Changed**👤`{e.Before?.ToString()}`\n\t\t`New:`{e.After.ToString()}`";
 | 
			
		||||
                else if (e.Before.Nickname != e.After.Nickname)
 | 
			
		||||
                    str += $"**Nickname Changed**👤`{e.Before?.ToString()}`\n\t\t`Old:` {e.Before.Nickname}#{e.Before.Discriminator}\n\t\t`New:` {e.After.Nickname}#{e.After.Discriminator}";
 | 
			
		||||
                else if (e.Before.AvatarUrl != e.After.AvatarUrl)
 | 
			
		||||
                    str += $"**Avatar Changed**👤`{e.Before?.ToString()}`\n\t {await e.Before.AvatarUrl.ShortenUrl()} `=>` {await e.After.AvatarUrl.ShortenUrl()}";
 | 
			
		||||
                else if (!e.Before.Roles.SequenceEqual(e.After.Roles))
 | 
			
		||||
                {
 | 
			
		||||
                    if (e.Before.Roles.Count() < e.After.Roles.Count())
 | 
			
		||||
                    {
 | 
			
		||||
                        var diffRoles = e.After.Roles.Where(r => !e.Before.Roles.Contains(r)).Select(r => "`" + r.Name + "`");
 | 
			
		||||
                        str += $"**User's Roles changed ⚔➕**👤`{e.Before?.ToString()}`\n\tNow has {string.Join(", ", diffRoles)} role.";
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (e.Before.Roles.Count() > e.After.Roles.Count())
 | 
			
		||||
                    {
 | 
			
		||||
                        var diffRoles = e.Before.Roles.Where(r => !e.After.Roles.Contains(r)).Select(r => "`" + r.Name + "`");
 | 
			
		||||
                        str += $"**User's Roles changed ⚔➖**👤`{e.Before?.ToString()}`\n\tNo longer has {string.Join(", ", diffRoles)} role.";
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        Console.WriteLine("SEQUENCE NOT EQUAL BUT NO DIFF ROLES - REPORT TO KWOTH on #NADEKOLOG server");
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                if (chId == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                string str = $"🕔`{prettyCurrentTime}`";
 | 
			
		||||
//                if (e.Before.Name != e.After.Name)
 | 
			
		||||
//                    str += $"**Name Changed**👤`{e.Before?.ToString()}`\n\t\t`New:`{e.After.ToString()}`";
 | 
			
		||||
//                else if (e.Before.Nickname != e.After.Nickname)
 | 
			
		||||
//                    str += $"**Nickname Changed**👤`{e.Before?.ToString()}`\n\t\t`Old:` {e.Before.Nickname}#{e.Before.Discriminator}\n\t\t`New:` {e.After.Nickname}#{e.After.Discriminator}";
 | 
			
		||||
//                else if (e.Before.AvatarUrl != e.After.AvatarUrl)
 | 
			
		||||
//                    str += $"**Avatar Changed**👤`{e.Before?.ToString()}`\n\t {await e.Before.AvatarUrl.ShortenUrl()} `=>` {await e.After.AvatarUrl.ShortenUrl()}";
 | 
			
		||||
//                else if (!e.Before.Roles.SequenceEqual(e.After.Roles))
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (e.Before.Roles.Count() < e.After.Roles.Count())
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var diffRoles = e.After.Roles.Where(r => !e.Before.Roles.Contains(r)).Select(r => "`" + r.Name + "`");
 | 
			
		||||
//                        str += $"**User's Roles changed ⚔➕**👤`{e.Before?.ToString()}`\n\tNow has {string.Join(", ", diffRoles)} role.";
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else if (e.Before.Roles.Count() > e.After.Roles.Count())
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var diffRoles = e.Before.Roles.Where(r => !e.After.Roles.Contains(r)).Select(r => "`" + r.Name + "`");
 | 
			
		||||
//                        str += $"**User's Roles changed ⚔➖**👤`{e.Before?.ToString()}`\n\tNo longer has {string.Join(", ", diffRoles)} role.";
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else
 | 
			
		||||
//                    {
 | 
			
		||||
//                        Console.WriteLine("SEQUENCE NOT EQUAL BUT NO DIFF ROLES - REPORT TO KWOTH on #NADEKOLOG server");
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                    return;
 | 
			
		||||
                await ch.SendMessage(str).ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessage(str).ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "spmom")
 | 
			
		||||
                .Description($"Toggles whether mentions of other offline users on your server will send a pm to them. **Needs Manage Server Permissions.**| `{Prefix}spmom`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var specificConfig = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                    specificConfig.SendPrivateMessageOnMention =
 | 
			
		||||
                        !specificConfig.SendPrivateMessageOnMention;
 | 
			
		||||
                    if (specificConfig.SendPrivateMessageOnMention)
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync(":ok: I will send private messages " +
 | 
			
		||||
                                                    "to mentioned offline users.").ConfigureAwait(false);
 | 
			
		||||
                    else
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync(":ok: I won't send private messages " +
 | 
			
		||||
                                                    "to mentioned offline users anymore.").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "spmom")
 | 
			
		||||
//                .Description($"Toggles whether mentions of other offline users on your server will send a pm to them. **Needs Manage Server Permissions.**| `{Prefix}spmom`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var specificConfig = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    specificConfig.SendPrivateMessageOnMention =
 | 
			
		||||
//                        !specificConfig.SendPrivateMessageOnMention;
 | 
			
		||||
//                    if (specificConfig.SendPrivateMessageOnMention)
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync(":ok: I will send private messages " +
 | 
			
		||||
//                                                    "to mentioned offline users.").ConfigureAwait(false);
 | 
			
		||||
//                    else
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync(":ok: I won't send private messages " +
 | 
			
		||||
//                                                    "to mentioned offline users anymore.").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "logserver")
 | 
			
		||||
                  .Description($"Toggles logging in this channel. Logs every message sent/deleted/edited on the server. **Bot Owner Only!** | `{Prefix}logserver`")
 | 
			
		||||
                  .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                  .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
                  .Do(async e =>
 | 
			
		||||
                  {
 | 
			
		||||
                      var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
                      if (chId == null)
 | 
			
		||||
                      {
 | 
			
		||||
                          SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = e.Channel.Id;
 | 
			
		||||
                          await imsg.Channel.SendMessageAsync($"❗**I WILL BEGIN LOGGING SERVER ACTIVITY IN THIS CHANNEL**❗").ConfigureAwait(false);
 | 
			
		||||
                          return;
 | 
			
		||||
                      }
 | 
			
		||||
                      Channel ch;
 | 
			
		||||
                      if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
                          return;
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "logserver")
 | 
			
		||||
//                  .Description($"Toggles logging in this channel. Logs every message sent/deleted/edited on the server. **Bot Owner Only!** | `{Prefix}logserver`")
 | 
			
		||||
//                  .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                  .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                  .Do(async e =>
 | 
			
		||||
//                  {
 | 
			
		||||
//                      var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                      if (chId == null)
 | 
			
		||||
//                      {
 | 
			
		||||
//                          SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = e.Channel.Id;
 | 
			
		||||
//                          await imsg.Channel.SendMessageAsync($"❗**I WILL BEGIN LOGGING SERVER ACTIVITY IN THIS CHANNEL**❗").ConfigureAwait(false);
 | 
			
		||||
//                          return;
 | 
			
		||||
//                      }
 | 
			
		||||
//                      Channel ch;
 | 
			
		||||
//                      if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                          return;
 | 
			
		||||
 | 
			
		||||
                      SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = null;
 | 
			
		||||
                      await imsg.Channel.SendMessageAsync($"❗**NO LONGER LOGGING IN {ch.Mention} CHANNEL**❗").ConfigureAwait(false);
 | 
			
		||||
                  });
 | 
			
		||||
//                      SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = null;
 | 
			
		||||
//                      await imsg.Channel.SendMessageAsync($"❗**NO LONGER LOGGING IN {ch.Mention} CHANNEL**❗").ConfigureAwait(false);
 | 
			
		||||
//                  });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Prefix + "logignore")
 | 
			
		||||
                .Description($"Toggles whether the {Prefix}logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. **Bot Owner Only!**| `{Prefix}logignore`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                    if (config.LogserverIgnoreChannels.Remove(e.Channel.Id))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync($"`{Prefix}logserver will stop ignoring this channel.`");
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        config.LogserverIgnoreChannels.Add(e.Channel.Id);
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync($"`{Prefix}logserver will ignore this channel.`");
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
//            cgb.CreateCommand(Prefix + "logignore")
 | 
			
		||||
//                .Description($"Toggles whether the {Prefix}logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. **Bot Owner Only!**| `{Prefix}logignore`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    if (config.LogserverIgnoreChannels.Remove(e.Channel.Id))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync($"`{Prefix}logserver will stop ignoring this channel.`");
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else
 | 
			
		||||
//                    {
 | 
			
		||||
//                        config.LogserverIgnoreChannels.Add(e.Channel.Id);
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync($"`{Prefix}logserver will ignore this channel.`");
 | 
			
		||||
//                    }
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "userpresence")
 | 
			
		||||
                  .Description($"Starts logging to this channel when someone from the server goes online/offline/idle. **Needs Manage Server Permissions.**| `{Prefix}userpresence`")
 | 
			
		||||
                  .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
                  .Do(async e =>
 | 
			
		||||
                  {
 | 
			
		||||
                      var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel;
 | 
			
		||||
                      if (chId == null)
 | 
			
		||||
                      {
 | 
			
		||||
                          SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel = e.Channel.Id;
 | 
			
		||||
                          await imsg.Channel.SendMessageAsync($"**User presence notifications enabled.**").ConfigureAwait(false);
 | 
			
		||||
                          return;
 | 
			
		||||
                      }
 | 
			
		||||
                      SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel = null;
 | 
			
		||||
                      await imsg.Channel.SendMessageAsync($"**User presence notifications disabled.**").ConfigureAwait(false);
 | 
			
		||||
                  });
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "userpresence")
 | 
			
		||||
//                  .Description($"Starts logging to this channel when someone from the server goes online/offline/idle. **Needs Manage Server Permissions.**| `{Prefix}userpresence`")
 | 
			
		||||
//                  .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                  .Do(async e =>
 | 
			
		||||
//                  {
 | 
			
		||||
//                      var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel;
 | 
			
		||||
//                      if (chId == null)
 | 
			
		||||
//                      {
 | 
			
		||||
//                          SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel = e.Channel.Id;
 | 
			
		||||
//                          await imsg.Channel.SendMessageAsync($"**User presence notifications enabled.**").ConfigureAwait(false);
 | 
			
		||||
//                          return;
 | 
			
		||||
//                      }
 | 
			
		||||
//                      SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel = null;
 | 
			
		||||
//                      await imsg.Channel.SendMessageAsync($"**User presence notifications disabled.**").ConfigureAwait(false);
 | 
			
		||||
//                  });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "voicepresence")
 | 
			
		||||
                  .Description($"Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. **Needs Manage Server Permissions.**| `{Prefix}voicerpresence`")
 | 
			
		||||
                  .Parameter("all", ParameterType.Optional)
 | 
			
		||||
                  .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
                  .Do(async e =>
 | 
			
		||||
                  {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "voicepresence")
 | 
			
		||||
//                  .Description($"Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. **Needs Manage Server Permissions.**| `{Prefix}voicerpresence`")
 | 
			
		||||
//                  .Parameter("all", ParameterType.Optional)
 | 
			
		||||
//                  .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                  .Do(async e =>
 | 
			
		||||
//                  {
 | 
			
		||||
 | 
			
		||||
                      var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                      if (e.GetArg("all")?.ToLower() == "all")
 | 
			
		||||
                      {
 | 
			
		||||
                          foreach (var voiceChannel in e.Server.VoiceChannels)
 | 
			
		||||
                          {
 | 
			
		||||
                              config.VoiceChannelLog.TryAdd(voiceChannel.Id, e.Channel.Id);
 | 
			
		||||
                          }
 | 
			
		||||
                          await imsg.Channel.SendMessageAsync("Started logging user presence for **ALL** voice channels!").ConfigureAwait(false);
 | 
			
		||||
                          return;
 | 
			
		||||
                      }
 | 
			
		||||
//                      var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                      if (e.GetArg("all")?.ToLower() == "all")
 | 
			
		||||
//                      {
 | 
			
		||||
//                          foreach (var voiceChannel in e.Server.VoiceChannels)
 | 
			
		||||
//                          {
 | 
			
		||||
//                              config.VoiceChannelLog.TryAdd(voiceChannel.Id, e.Channel.Id);
 | 
			
		||||
//                          }
 | 
			
		||||
//                          await imsg.Channel.SendMessageAsync("Started logging user presence for **ALL** voice channels!").ConfigureAwait(false);
 | 
			
		||||
//                          return;
 | 
			
		||||
//                      }
 | 
			
		||||
 | 
			
		||||
                      if (e.User.VoiceChannel == null)
 | 
			
		||||
                      {
 | 
			
		||||
                          await imsg.Channel.SendMessageAsync("💢 You are not in a voice channel right now. If you are, please rejoin it.").ConfigureAwait(false);
 | 
			
		||||
                          return;
 | 
			
		||||
                      }
 | 
			
		||||
                      ulong throwaway;
 | 
			
		||||
                      if (!config.VoiceChannelLog.TryRemove(e.User.VoiceChannel.Id, out throwaway))
 | 
			
		||||
                      {
 | 
			
		||||
                          config.VoiceChannelLog.TryAdd(e.User.VoiceChannel.Id, e.Channel.Id);
 | 
			
		||||
                          await imsg.Channel.SendMessageAsync($"`Logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false);
 | 
			
		||||
                      }
 | 
			
		||||
                      else
 | 
			
		||||
                          await imsg.Channel.SendMessageAsync($"`Stopped logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false);
 | 
			
		||||
                  });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//                      if (e.User.VoiceChannel == null)
 | 
			
		||||
//                      {
 | 
			
		||||
//                          await imsg.Channel.SendMessageAsync("💢 You are not in a voice channel right now. If you are, please rejoin it.").ConfigureAwait(false);
 | 
			
		||||
//                          return;
 | 
			
		||||
//                      }
 | 
			
		||||
//                      ulong throwaway;
 | 
			
		||||
//                      if (!config.VoiceChannelLog.TryRemove(e.User.VoiceChannel.Id, out throwaway))
 | 
			
		||||
//                      {
 | 
			
		||||
//                          config.VoiceChannelLog.TryAdd(e.User.VoiceChannel.Id, e.Channel.Id);
 | 
			
		||||
//                          await imsg.Channel.SendMessageAsync($"`Logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false);
 | 
			
		||||
//                      }
 | 
			
		||||
//                      else
 | 
			
		||||
//                          await imsg.Channel.SendMessageAsync($"`Stopped logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false);
 | 
			
		||||
//                  });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,129 +1,129 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using System.Timers;
 | 
			
		||||
//using Discord;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Concurrent;
 | 
			
		||||
//using System.Threading.Tasks;
 | 
			
		||||
//using System.Timers;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    class MessageRepeater : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        private readonly ConcurrentDictionary<Server, Repeater> repeaters = new ConcurrentDictionary<Server, Repeater>();
 | 
			
		||||
        private class Repeater
 | 
			
		||||
        {
 | 
			
		||||
            [Newtonsoft.Json.JsonIgnore]
 | 
			
		||||
            public Timer MessageTimer { get; set; }
 | 
			
		||||
            [Newtonsoft.Json.JsonIgnore]
 | 
			
		||||
            public Channel RepeatingChannel { get; set; }
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    class MessageRepeater : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        private readonly ConcurrentDictionary<Server, Repeater> repeaters = new ConcurrentDictionary<Server, Repeater>();
 | 
			
		||||
//        private class Repeater
 | 
			
		||||
//        {
 | 
			
		||||
//            [Newtonsoft.Json.JsonIgnore]
 | 
			
		||||
//            public Timer MessageTimer { get; set; }
 | 
			
		||||
//            [Newtonsoft.Json.JsonIgnore]
 | 
			
		||||
//            public Channel RepeatingChannel { get; set; }
 | 
			
		||||
 | 
			
		||||
            public ulong RepeatingServerId { get; set; }
 | 
			
		||||
            public ulong RepeatingChannelId { get; set; }
 | 
			
		||||
            public Message lastMessage { get; set; } = null;
 | 
			
		||||
            public string RepeatingMessage { get; set; }
 | 
			
		||||
            public int Interval { get; set; }
 | 
			
		||||
//            public ulong RepeatingServerId { get; set; }
 | 
			
		||||
//            public ulong RepeatingChannelId { get; set; }
 | 
			
		||||
//            public Message lastMessage { get; set; } = null;
 | 
			
		||||
//            public string RepeatingMessage { get; set; }
 | 
			
		||||
//            public int Interval { get; set; }
 | 
			
		||||
 | 
			
		||||
            public Repeater Start()
 | 
			
		||||
            {
 | 
			
		||||
                MessageTimer = new Timer { Interval = Interval };
 | 
			
		||||
                MessageTimer.Elapsed += async (s, e) => await Invoke();
 | 
			
		||||
                return this;
 | 
			
		||||
            }
 | 
			
		||||
//            public Repeater Start()
 | 
			
		||||
//            {
 | 
			
		||||
//                MessageTimer = new Timer { Interval = Interval };
 | 
			
		||||
//                MessageTimer.Elapsed += async (s, e) => await Invoke();
 | 
			
		||||
//                return this;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public async Task Invoke()
 | 
			
		||||
            {
 | 
			
		||||
                var ch = RepeatingChannel;
 | 
			
		||||
                var msg = RepeatingMessage;
 | 
			
		||||
                if (ch != null && !string.IsNullOrWhiteSpace(msg))
 | 
			
		||||
                {
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        if (lastMessage != null)
 | 
			
		||||
                            await lastMessage.Delete().ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    catch { }
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        lastMessage = await ch.SendMessage(msg).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    catch { }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
//            public async Task Invoke()
 | 
			
		||||
//            {
 | 
			
		||||
//                var ch = RepeatingChannel;
 | 
			
		||||
//                var msg = RepeatingMessage;
 | 
			
		||||
//                if (ch != null && !string.IsNullOrWhiteSpace(msg))
 | 
			
		||||
//                {
 | 
			
		||||
//                    try
 | 
			
		||||
//                    {
 | 
			
		||||
//                        if (lastMessage != null)
 | 
			
		||||
//                            await lastMessage.Delete().ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    catch { }
 | 
			
		||||
//                    try
 | 
			
		||||
//                    {
 | 
			
		||||
//                        lastMessage = await ch.SendMessage(msg).ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    catch { }
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//        }
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "repeatinvoke")
 | 
			
		||||
                .Alias(Module.Prefix + "repinv")
 | 
			
		||||
                .Description($"Immediately shows the repeat message and restarts the timer. **Needs Manage Messages Permissions.**| `{Prefix}repinv`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageMessages())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    Repeater rep;
 | 
			
		||||
                    if (!repeaters.TryGetValue(e.Server, out rep))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`No repeating message found on this server.`");
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "repeatinvoke")
 | 
			
		||||
//                .Alias(Module.Prefix + "repinv")
 | 
			
		||||
//                .Description($"Immediately shows the repeat message and restarts the timer. **Needs Manage Messages Permissions.**| `{Prefix}repinv`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageMessages())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    Repeater rep;
 | 
			
		||||
//                    if (!repeaters.TryGetValue(e.Server, out rep))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`No repeating message found on this server.`");
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
                    await rep.Invoke();
 | 
			
		||||
                });
 | 
			
		||||
//                    await rep.Invoke();
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "repeat")
 | 
			
		||||
                .Description("Repeat a message every X minutes. If no parameters are specified, " +
 | 
			
		||||
                             $"repeat is disabled. **Needs Manage Messages Permissions.** |`{Prefix}repeat 5 Hello there`")
 | 
			
		||||
                .Parameter("minutes", ParameterType.Optional)
 | 
			
		||||
                .Parameter("msg", ParameterType.Unparsed)
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageMessages())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var minutesStr = e.GetArg("minutes");
 | 
			
		||||
                    var msg = e.GetArg("msg");
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "repeat")
 | 
			
		||||
//                .Description("Repeat a message every X minutes. If no parameters are specified, " +
 | 
			
		||||
//                             $"repeat is disabled. **Needs Manage Messages Permissions.** |`{Prefix}repeat 5 Hello there`")
 | 
			
		||||
//                .Parameter("minutes", ParameterType.Optional)
 | 
			
		||||
//                .Parameter("msg", ParameterType.Unparsed)
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageMessages())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var minutesStr = e.GetArg("minutes");
 | 
			
		||||
//                    var msg = e.GetArg("msg");
 | 
			
		||||
 | 
			
		||||
                    // if both null, disable
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(msg) && string.IsNullOrWhiteSpace(minutesStr))
 | 
			
		||||
                    {
 | 
			
		||||
//                    // if both null, disable
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(msg) && string.IsNullOrWhiteSpace(minutesStr))
 | 
			
		||||
//                    {
 | 
			
		||||
 | 
			
		||||
                        Repeater rep;
 | 
			
		||||
                        if (!repeaters.TryRemove(e.Server, out rep))
 | 
			
		||||
                            return;
 | 
			
		||||
                        rep.MessageTimer.Stop();
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Repeating disabled").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    int minutes;
 | 
			
		||||
                    if (!int.TryParse(minutesStr, out minutes) || minutes < 1 || minutes > 1440)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Invalid value").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
//                        Repeater rep;
 | 
			
		||||
//                        if (!repeaters.TryRemove(e.Server, out rep))
 | 
			
		||||
//                            return;
 | 
			
		||||
//                        rep.MessageTimer.Stop();
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Repeating disabled").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    int minutes;
 | 
			
		||||
//                    if (!int.TryParse(minutesStr, out minutes) || minutes < 1 || minutes > 1440)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Invalid value").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
                    var repeater = repeaters.GetOrAdd(
 | 
			
		||||
                        e.Server,
 | 
			
		||||
                        s => new Repeater
 | 
			
		||||
                        {
 | 
			
		||||
                            Interval = minutes * 60 * 1000,
 | 
			
		||||
                            RepeatingChannel = e.Channel,
 | 
			
		||||
                            RepeatingChannelId = e.Channel.Id,
 | 
			
		||||
                            RepeatingServerId = e.Server.Id,
 | 
			
		||||
                        }.Start()
 | 
			
		||||
                    );
 | 
			
		||||
//                    var repeater = repeaters.GetOrAdd(
 | 
			
		||||
//                        e.Server,
 | 
			
		||||
//                        s => new Repeater
 | 
			
		||||
//                        {
 | 
			
		||||
//                            Interval = minutes * 60 * 1000,
 | 
			
		||||
//                            RepeatingChannel = e.Channel,
 | 
			
		||||
//                            RepeatingChannelId = e.Channel.Id,
 | 
			
		||||
//                            RepeatingServerId = e.Server.Id,
 | 
			
		||||
//                        }.Start()
 | 
			
		||||
//                    );
 | 
			
		||||
 | 
			
		||||
                    if (!string.IsNullOrWhiteSpace(msg))
 | 
			
		||||
                        repeater.RepeatingMessage = msg;
 | 
			
		||||
//                    if (!string.IsNullOrWhiteSpace(msg))
 | 
			
		||||
//                        repeater.RepeatingMessage = msg;
 | 
			
		||||
 | 
			
		||||
                    repeater.MessageTimer.Stop();
 | 
			
		||||
                    repeater.MessageTimer.Start();
 | 
			
		||||
//                    repeater.MessageTimer.Stop();
 | 
			
		||||
//                    repeater.MessageTimer.Start();
 | 
			
		||||
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync(String.Format("👌 Repeating `{0}` every " +
 | 
			
		||||
                                                              "**{1}** minutes on {2} channel.",
 | 
			
		||||
                                                              repeater.RepeatingMessage, minutes, repeater.RepeatingChannel))
 | 
			
		||||
                                                              .ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync(String.Format("👌 Repeating `{0}` every " +
 | 
			
		||||
//                                                              "**{1}** minutes on {2} channel.",
 | 
			
		||||
//                                                              repeater.RepeatingMessage, minutes, repeater.RepeatingChannel))
 | 
			
		||||
//                                                              .ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        public MessageRepeater(DiscordModule module) : base(module) { }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//        public MessageRepeater(DiscordModule module) : base(module) { }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,167 +1,167 @@
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.Classes.JSONModels;
 | 
			
		||||
using NadekoBot.Modules.Music;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using System.Timers;
 | 
			
		||||
using Timer = System.Timers.Timer;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Classes.JSONModels;
 | 
			
		||||
//using NadekoBot.Modules.Music;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Generic;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
//using System.Text;
 | 
			
		||||
//using System.Threading;
 | 
			
		||||
//using System.Threading.Tasks;
 | 
			
		||||
//using System.Timers;
 | 
			
		||||
//using Timer = System.Timers.Timer;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    internal class PlayingRotate : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        private static readonly Timer timer = new Timer(20000);
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    internal class PlayingRotate : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        private static readonly Timer timer = new Timer(20000);
 | 
			
		||||
 | 
			
		||||
        public static Dictionary<string, Func<string>> PlayingPlaceholders { get; } =
 | 
			
		||||
            new Dictionary<string, Func<string>> {
 | 
			
		||||
                {"%servers%", () => NadekoBot.Client.Servers.Count().ToString()},
 | 
			
		||||
                {"%users%", () => NadekoBot.Client.Servers.SelectMany(s => s.Users).Count().ToString()},
 | 
			
		||||
                {"%playing%", () => {
 | 
			
		||||
                        var cnt = MusicModule.MusicPlayers.Count(kvp => kvp.Value.CurrentSong != null);
 | 
			
		||||
                        if (cnt != 1) return cnt.ToString();
 | 
			
		||||
                        try {
 | 
			
		||||
                            var mp = MusicModule.MusicPlayers.FirstOrDefault();
 | 
			
		||||
                            return mp.Value.CurrentSong.SongInfo.Title;
 | 
			
		||||
                        }
 | 
			
		||||
                        catch {
 | 
			
		||||
                            return "No songs";
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                {"%queued%", () => MusicModule.MusicPlayers.Sum(kvp => kvp.Value.Playlist.Count).ToString()},
 | 
			
		||||
                {"%trivia%", () => Games.Commands.TriviaCommands.RunningTrivias.Count.ToString()}
 | 
			
		||||
            };
 | 
			
		||||
//        public static Dictionary<string, Func<string>> PlayingPlaceholders { get; } =
 | 
			
		||||
//            new Dictionary<string, Func<string>> {
 | 
			
		||||
//                {"%servers%", () => NadekoBot.Client.Servers.Count().ToString()},
 | 
			
		||||
//                {"%users%", () => NadekoBot.Client.Servers.SelectMany(s => s.Users).Count().ToString()},
 | 
			
		||||
//                {"%playing%", () => {
 | 
			
		||||
//                        var cnt = MusicModule.MusicPlayers.Count(kvp => kvp.Value.CurrentSong != null);
 | 
			
		||||
//                        if (cnt != 1) return cnt.ToString();
 | 
			
		||||
//                        try {
 | 
			
		||||
//                            var mp = MusicModule.MusicPlayers.FirstOrDefault();
 | 
			
		||||
//                            return mp.Value.CurrentSong.SongInfo.Title;
 | 
			
		||||
//                        }
 | 
			
		||||
//                        catch {
 | 
			
		||||
//                            return "No songs";
 | 
			
		||||
//                        }
 | 
			
		||||
//                    }
 | 
			
		||||
//                },
 | 
			
		||||
//                {"%queued%", () => MusicModule.MusicPlayers.Sum(kvp => kvp.Value.Playlist.Count).ToString()},
 | 
			
		||||
//                {"%trivia%", () => Games.Commands.TriviaCommands.RunningTrivias.Count.ToString()}
 | 
			
		||||
//            };
 | 
			
		||||
 | 
			
		||||
        private readonly SemaphoreSlim playingPlaceholderLock = new SemaphoreSlim(1,1);
 | 
			
		||||
//        private readonly SemaphoreSlim playingPlaceholderLock = new SemaphoreSlim(1,1);
 | 
			
		||||
 | 
			
		||||
        public PlayingRotate(DiscordModule module) : base(module)
 | 
			
		||||
        {
 | 
			
		||||
            var i = -1;
 | 
			
		||||
            timer.Elapsed += async (s, e) =>
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    i++;
 | 
			
		||||
                    var status = "";
 | 
			
		||||
                    //wtf am i doing, just use a queue ffs
 | 
			
		||||
                    await playingPlaceholderLock.WaitAsync().ConfigureAwait(false);
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        if (PlayingPlaceholders.Count == 0
 | 
			
		||||
                            || NadekoBot.Config.RotatingStatuses.Count == 0
 | 
			
		||||
                            || i >= NadekoBot.Config.RotatingStatuses.Count)
 | 
			
		||||
                        {
 | 
			
		||||
                            i = 0;
 | 
			
		||||
                        }
 | 
			
		||||
                        status = NadekoBot.Config.RotatingStatuses[i];
 | 
			
		||||
                        status = PlayingPlaceholders.Aggregate(status,
 | 
			
		||||
                            (current, kvp) => current.Replace(kvp.Key, kvp.Value()));
 | 
			
		||||
                    }
 | 
			
		||||
                    finally { playingPlaceholderLock.Release(); }
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(status))
 | 
			
		||||
                        return;
 | 
			
		||||
                    await Task.Run(() => { NadekoBot.Client.SetGame(status); });
 | 
			
		||||
                }
 | 
			
		||||
                catch { }
 | 
			
		||||
            };
 | 
			
		||||
//        public PlayingRotate(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
//            var i = -1;
 | 
			
		||||
//            timer.Elapsed += async (s, e) =>
 | 
			
		||||
//            {
 | 
			
		||||
//                try
 | 
			
		||||
//                {
 | 
			
		||||
//                    i++;
 | 
			
		||||
//                    var status = "";
 | 
			
		||||
//                    //wtf am i doing, just use a queue ffs
 | 
			
		||||
//                    await playingPlaceholderLock.WaitAsync().ConfigureAwait(false);
 | 
			
		||||
//                    try
 | 
			
		||||
//                    {
 | 
			
		||||
//                        if (PlayingPlaceholders.Count == 0
 | 
			
		||||
//                            || NadekoBot.Config.RotatingStatuses.Count == 0
 | 
			
		||||
//                            || i >= NadekoBot.Config.RotatingStatuses.Count)
 | 
			
		||||
//                        {
 | 
			
		||||
//                            i = 0;
 | 
			
		||||
//                        }
 | 
			
		||||
//                        status = NadekoBot.Config.RotatingStatuses[i];
 | 
			
		||||
//                        status = PlayingPlaceholders.Aggregate(status,
 | 
			
		||||
//                            (current, kvp) => current.Replace(kvp.Key, kvp.Value()));
 | 
			
		||||
//                    }
 | 
			
		||||
//                    finally { playingPlaceholderLock.Release(); }
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(status))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    await Task.Run(() => { NadekoBot.Client.SetGame(status); });
 | 
			
		||||
//                }
 | 
			
		||||
//                catch { }
 | 
			
		||||
//            };
 | 
			
		||||
 | 
			
		||||
            timer.Enabled = NadekoBot.Config.IsRotatingStatus;
 | 
			
		||||
        }
 | 
			
		||||
//            timer.Enabled = NadekoBot.Config.IsRotatingStatus;
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        public Func<CommandEventArgs, Task> DoFunc() => async e =>
 | 
			
		||||
        {
 | 
			
		||||
            await playingPlaceholderLock.WaitAsync().ConfigureAwait(false);
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (timer.Enabled)
 | 
			
		||||
                    timer.Stop();
 | 
			
		||||
                else
 | 
			
		||||
                    timer.Start();
 | 
			
		||||
                NadekoBot.Config.IsRotatingStatus = timer.Enabled;
 | 
			
		||||
                await ConfigHandler.SaveConfig().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            finally {
 | 
			
		||||
                playingPlaceholderLock.Release();
 | 
			
		||||
            }
 | 
			
		||||
            await imsg.Channel.SendMessageAsync($"❗`Rotating playing status has been {(timer.Enabled ? "enabled" : "disabled")}.`").ConfigureAwait(false);
 | 
			
		||||
        };
 | 
			
		||||
//        public Func<CommandEventArgs, Task> DoFunc() => async e =>
 | 
			
		||||
//        {
 | 
			
		||||
//            await playingPlaceholderLock.WaitAsync().ConfigureAwait(false);
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                if (timer.Enabled)
 | 
			
		||||
//                    timer.Stop();
 | 
			
		||||
//                else
 | 
			
		||||
//                    timer.Start();
 | 
			
		||||
//                NadekoBot.Config.IsRotatingStatus = timer.Enabled;
 | 
			
		||||
//                await ConfigHandler.SaveConfig().ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            finally {
 | 
			
		||||
//                playingPlaceholderLock.Release();
 | 
			
		||||
//            }
 | 
			
		||||
//            await imsg.Channel.SendMessageAsync($"❗`Rotating playing status has been {(timer.Enabled ? "enabled" : "disabled")}.`").ConfigureAwait(false);
 | 
			
		||||
//        };
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "rotateplaying")
 | 
			
		||||
                .Alias(Module.Prefix + "ropl")
 | 
			
		||||
                .Description($"Toggles rotation of playing status of the dynamic strings you specified earlier. **Bot Owner Only!** | `{Prefix}ropl`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                .Do(DoFunc());
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "rotateplaying")
 | 
			
		||||
//                .Alias(Module.Prefix + "ropl")
 | 
			
		||||
//                .Description($"Toggles rotation of playing status of the dynamic strings you specified earlier. **Bot Owner Only!** | `{Prefix}ropl`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .Do(DoFunc());
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "addplaying")
 | 
			
		||||
                .Alias(Module.Prefix + "adpl")
 | 
			
		||||
                .Description("Adds a specified string to the list of playing strings to rotate. " +
 | 
			
		||||
                             "Supported placeholders: " + string.Join(", ", PlayingPlaceholders.Keys)+ $" **Bot Owner Only!**| `{Prefix}adpl`")
 | 
			
		||||
                .Parameter("text", ParameterType.Unparsed)
 | 
			
		||||
                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var arg = e.GetArg("text");
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(arg))
 | 
			
		||||
                        return;
 | 
			
		||||
                    await playingPlaceholderLock.WaitAsync().ConfigureAwait(false);
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        NadekoBot.Config.RotatingStatuses.Add(arg);
 | 
			
		||||
                        await ConfigHandler.SaveConfig();
 | 
			
		||||
                    }
 | 
			
		||||
                    finally
 | 
			
		||||
                    {
 | 
			
		||||
                        playingPlaceholderLock.Release();
 | 
			
		||||
                    }
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync("🆗 `Added a new playing string.`").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "addplaying")
 | 
			
		||||
//                .Alias(Module.Prefix + "adpl")
 | 
			
		||||
//                .Description("Adds a specified string to the list of playing strings to rotate. " +
 | 
			
		||||
//                             "Supported placeholders: " + string.Join(", ", PlayingPlaceholders.Keys)+ $" **Bot Owner Only!**| `{Prefix}adpl`")
 | 
			
		||||
//                .Parameter("text", ParameterType.Unparsed)
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var arg = e.GetArg("text");
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(arg))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    await playingPlaceholderLock.WaitAsync().ConfigureAwait(false);
 | 
			
		||||
//                    try
 | 
			
		||||
//                    {
 | 
			
		||||
//                        NadekoBot.Config.RotatingStatuses.Add(arg);
 | 
			
		||||
//                        await ConfigHandler.SaveConfig();
 | 
			
		||||
//                    }
 | 
			
		||||
//                    finally
 | 
			
		||||
//                    {
 | 
			
		||||
//                        playingPlaceholderLock.Release();
 | 
			
		||||
//                    }
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync("🆗 `Added a new playing string.`").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "listplaying")
 | 
			
		||||
                .Alias(Module.Prefix + "lipl")
 | 
			
		||||
                .Description($"Lists all playing statuses with their corresponding number. **Bot Owner Only!**| `{Prefix}lipl`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (NadekoBot.Config.RotatingStatuses.Count == 0)
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`There are no playing strings. " +
 | 
			
		||||
                                                    "Add some with .addplaying [text] command.`").ConfigureAwait(false);
 | 
			
		||||
                    var sb = new StringBuilder();
 | 
			
		||||
                    for (var i = 0; i < NadekoBot.Config.RotatingStatuses.Count; i++)
 | 
			
		||||
                    {
 | 
			
		||||
                        sb.AppendLine($"`{i + 1}.` {NadekoBot.Config.RotatingStatuses[i]}");
 | 
			
		||||
                    }
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync(sb.ToString()).ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "listplaying")
 | 
			
		||||
//                .Alias(Module.Prefix + "lipl")
 | 
			
		||||
//                .Description($"Lists all playing statuses with their corresponding number. **Bot Owner Only!**| `{Prefix}lipl`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (NadekoBot.Config.RotatingStatuses.Count == 0)
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`There are no playing strings. " +
 | 
			
		||||
//                                                    "Add some with .addplaying [text] command.`").ConfigureAwait(false);
 | 
			
		||||
//                    var sb = new StringBuilder();
 | 
			
		||||
//                    for (var i = 0; i < NadekoBot.Config.RotatingStatuses.Count; i++)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        sb.AppendLine($"`{i + 1}.` {NadekoBot.Config.RotatingStatuses[i]}");
 | 
			
		||||
//                    }
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync(sb.ToString()).ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "removeplaying")
 | 
			
		||||
                .Alias(Module.Prefix + "repl", Module.Prefix + "rmpl")
 | 
			
		||||
                .Description($"Removes a playing string on a given number. **Bot Owner Only!**| `{Prefix}rmpl`")
 | 
			
		||||
                .Parameter("number", ParameterType.Required)
 | 
			
		||||
                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var arg = e.GetArg("number");
 | 
			
		||||
                    int num;
 | 
			
		||||
                    string str;
 | 
			
		||||
                    await playingPlaceholderLock.WaitAsync().ConfigureAwait(false);
 | 
			
		||||
                    try {
 | 
			
		||||
                        if (!int.TryParse(arg.Trim(), out num) || num <= 0 || num > NadekoBot.Config.RotatingStatuses.Count)
 | 
			
		||||
                            return;
 | 
			
		||||
                        str = NadekoBot.Config.RotatingStatuses[num - 1];
 | 
			
		||||
                        NadekoBot.Config.RotatingStatuses.RemoveAt(num - 1);
 | 
			
		||||
                        await ConfigHandler.SaveConfig().ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    finally { playingPlaceholderLock.Release(); }
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync($"🆗 `Removed playing string #{num}`({str})").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "removeplaying")
 | 
			
		||||
//                .Alias(Module.Prefix + "repl", Module.Prefix + "rmpl")
 | 
			
		||||
//                .Description($"Removes a playing string on a given number. **Bot Owner Only!**| `{Prefix}rmpl`")
 | 
			
		||||
//                .Parameter("number", ParameterType.Required)
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var arg = e.GetArg("number");
 | 
			
		||||
//                    int num;
 | 
			
		||||
//                    string str;
 | 
			
		||||
//                    await playingPlaceholderLock.WaitAsync().ConfigureAwait(false);
 | 
			
		||||
//                    try {
 | 
			
		||||
//                        if (!int.TryParse(arg.Trim(), out num) || num <= 0 || num > NadekoBot.Config.RotatingStatuses.Count)
 | 
			
		||||
//                            return;
 | 
			
		||||
//                        str = NadekoBot.Config.RotatingStatuses[num - 1];
 | 
			
		||||
//                        NadekoBot.Config.RotatingStatuses.RemoveAt(num - 1);
 | 
			
		||||
//                        await ConfigHandler.SaveConfig().ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    finally { playingPlaceholderLock.Release(); }
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync($"🆗 `Removed playing string #{num}`({str})").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,63 +1,63 @@
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Concurrent;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    internal class RatelimitCommand : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    internal class RatelimitCommand : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
 | 
			
		||||
        public static ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, DateTime>> RatelimitingChannels = new ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, DateTime>>();
 | 
			
		||||
//        public static ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, DateTime>> RatelimitingChannels = new ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, DateTime>>();
 | 
			
		||||
 | 
			
		||||
        private static readonly TimeSpan ratelimitTime = new TimeSpan(0, 0, 0, 5);
 | 
			
		||||
//        private static readonly TimeSpan ratelimitTime = new TimeSpan(0, 0, 0, 5);
 | 
			
		||||
 | 
			
		||||
        public RatelimitCommand(DiscordModule module) : base(module)
 | 
			
		||||
        {
 | 
			
		||||
            NadekoBot.Client.MessageReceived += async (s, e) =>
 | 
			
		||||
            {
 | 
			
		||||
                if (e.Channel.IsPrivate || e.User.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
                    return;
 | 
			
		||||
                ConcurrentDictionary<ulong, DateTime> userTimePair;
 | 
			
		||||
                if (!RatelimitingChannels.TryGetValue(e.Channel.Id, out userTimePair)) return;
 | 
			
		||||
                DateTime lastMessageTime;
 | 
			
		||||
                if (userTimePair.TryGetValue(e.User.Id, out lastMessageTime))
 | 
			
		||||
                {
 | 
			
		||||
                    if (DateTime.Now - lastMessageTime < ratelimitTime)
 | 
			
		||||
                    {
 | 
			
		||||
                        try
 | 
			
		||||
                        {
 | 
			
		||||
                            await e.Message.Delete().ConfigureAwait(false);
 | 
			
		||||
                        }
 | 
			
		||||
                        catch { }
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                userTimePair.AddOrUpdate(e.User.Id, id => DateTime.Now, (id, dt) => DateTime.Now);
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
//        public RatelimitCommand(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
//            NadekoBot.Client.MessageReceived += async (s, e) =>
 | 
			
		||||
//            {
 | 
			
		||||
//                if (e.Channel.IsPrivate || e.User.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                ConcurrentDictionary<ulong, DateTime> userTimePair;
 | 
			
		||||
//                if (!RatelimitingChannels.TryGetValue(e.Channel.Id, out userTimePair)) return;
 | 
			
		||||
//                DateTime lastMessageTime;
 | 
			
		||||
//                if (userTimePair.TryGetValue(e.User.Id, out lastMessageTime))
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (DateTime.Now - lastMessageTime < ratelimitTime)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        try
 | 
			
		||||
//                        {
 | 
			
		||||
//                            await e.Message.Delete().ConfigureAwait(false);
 | 
			
		||||
//                        }
 | 
			
		||||
//                        catch { }
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                }
 | 
			
		||||
//                userTimePair.AddOrUpdate(e.User.Id, id => DateTime.Now, (id, dt) => DateTime.Now);
 | 
			
		||||
//            };
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "slowmode")
 | 
			
		||||
                .Description($"Toggles slow mode. When ON, users will be able to send only 1 message every 5 seconds. **Needs Manage Messages Permissions.**| `{Prefix}slowmode`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageMessages())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    ConcurrentDictionary<ulong, DateTime> throwaway;
 | 
			
		||||
                    if (RatelimitingChannels.TryRemove(e.Channel.Id, out throwaway))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Slow mode disabled.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (RatelimitingChannels.TryAdd(e.Channel.Id, new ConcurrentDictionary<ulong, DateTime>()))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Slow mode initiated. " +
 | 
			
		||||
                                                    "Users can't send more than 1 message every 5 seconds.")
 | 
			
		||||
                                                    .ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "slowmode")
 | 
			
		||||
//                .Description($"Toggles slow mode. When ON, users will be able to send only 1 message every 5 seconds. **Needs Manage Messages Permissions.**| `{Prefix}slowmode`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageMessages())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    ConcurrentDictionary<ulong, DateTime> throwaway;
 | 
			
		||||
//                    if (RatelimitingChannels.TryRemove(e.Channel.Id, out throwaway))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Slow mode disabled.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    if (RatelimitingChannels.TryAdd(e.Channel.Id, new ConcurrentDictionary<ulong, DateTime>()))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Slow mode initiated. " +
 | 
			
		||||
//                                                    "Users can't send more than 1 message every 5 seconds.")
 | 
			
		||||
//                                                    .ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
@@ -1,207 +1,207 @@
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using Discord.Net;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using Discord.Net;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Generic;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
//using System.Text;
 | 
			
		||||
//using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    internal class SelfAssignedRolesCommand : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        public SelfAssignedRolesCommand(DiscordModule module) : base(module) { }
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "asar")
 | 
			
		||||
                .Description("Adds a role, or list of roles separated by whitespace" +
 | 
			
		||||
                             $"(use quotations for multiword roles) to the list of self-assignable roles. **Needs Manage Roles Permissions.**| `{Prefix}asar Gamer`")
 | 
			
		||||
                .Parameter("roles", ParameterType.Multiple)
 | 
			
		||||
                .AddCheck(SimpleCheckers.CanManageRoles)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                    var msg = new StringBuilder();
 | 
			
		||||
                    foreach (var arg in e.Args)
 | 
			
		||||
                    {
 | 
			
		||||
                        var role = e.Server.FindRoles(arg.Trim()).FirstOrDefault();
 | 
			
		||||
                        if (role == null)
 | 
			
		||||
                            msg.AppendLine($":anger:Role **{arg}** not found.");
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            if (config.ListOfSelfAssignableRoles.Contains(role.Id))
 | 
			
		||||
                            {
 | 
			
		||||
                                msg.AppendLine($":anger:Role **{role.Name}** is already in the list.");
 | 
			
		||||
                                continue;
 | 
			
		||||
                            }
 | 
			
		||||
                            config.ListOfSelfAssignableRoles.Add(role.Id);
 | 
			
		||||
                            msg.AppendLine($":ok:Role **{role.Name}** added to the list.");
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync(msg.ToString()).ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    internal class SelfAssignedRolesCommand : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        public SelfAssignedRolesCommand(DiscordModule module) : base(module) { }
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "asar")
 | 
			
		||||
//                .Description("Adds a role, or list of roles separated by whitespace" +
 | 
			
		||||
//                             $"(use quotations for multiword roles) to the list of self-assignable roles. **Needs Manage Roles Permissions.**| `{Prefix}asar Gamer`")
 | 
			
		||||
//                .Parameter("roles", ParameterType.Multiple)
 | 
			
		||||
//                .AddCheck(SimpleCheckers.CanManageRoles)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    var msg = new StringBuilder();
 | 
			
		||||
//                    foreach (var arg in e.Args)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var role = e.Server.FindRoles(arg.Trim()).FirstOrDefault();
 | 
			
		||||
//                        if (role == null)
 | 
			
		||||
//                            msg.AppendLine($":anger:Role **{arg}** not found.");
 | 
			
		||||
//                        else
 | 
			
		||||
//                        {
 | 
			
		||||
//                            if (config.ListOfSelfAssignableRoles.Contains(role.Id))
 | 
			
		||||
//                            {
 | 
			
		||||
//                                msg.AppendLine($":anger:Role **{role.Name}** is already in the list.");
 | 
			
		||||
//                                continue;
 | 
			
		||||
//                            }
 | 
			
		||||
//                            config.ListOfSelfAssignableRoles.Add(role.Id);
 | 
			
		||||
//                            msg.AppendLine($":ok:Role **{role.Name}** added to the list.");
 | 
			
		||||
//                        }
 | 
			
		||||
//                    }
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync(msg.ToString()).ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "rsar")
 | 
			
		||||
                .Description($"Removes a specified role from the list of self-assignable roles. | `{Prefix}rsar`")
 | 
			
		||||
                .Parameter("role", ParameterType.Unparsed)
 | 
			
		||||
                .AddCheck(SimpleCheckers.CanManageRoles)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var roleName = e.GetArg("role")?.Trim();
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(roleName))
 | 
			
		||||
                        return;
 | 
			
		||||
                    var role = e.Server.FindRoles(roleName).FirstOrDefault();
 | 
			
		||||
                    if (role == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync(":anger:That role does not exist.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                    if (!config.ListOfSelfAssignableRoles.Contains(role.Id))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync(":anger:That role is not self-assignable.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    config.ListOfSelfAssignableRoles.Remove(role.Id);
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync($":ok:**{role.Name}** has been removed from the list of self-assignable roles").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "rsar")
 | 
			
		||||
//                .Description($"Removes a specified role from the list of self-assignable roles. | `{Prefix}rsar`")
 | 
			
		||||
//                .Parameter("role", ParameterType.Unparsed)
 | 
			
		||||
//                .AddCheck(SimpleCheckers.CanManageRoles)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var roleName = e.GetArg("role")?.Trim();
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(roleName))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    var role = e.Server.FindRoles(roleName).FirstOrDefault();
 | 
			
		||||
//                    if (role == null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync(":anger:That role does not exist.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    if (!config.ListOfSelfAssignableRoles.Contains(role.Id))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync(":anger:That role is not self-assignable.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    config.ListOfSelfAssignableRoles.Remove(role.Id);
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync($":ok:**{role.Name}** has been removed from the list of self-assignable roles").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "lsar")
 | 
			
		||||
                .Description($"Lists all self-assignable roles. | `{Prefix}lsar`")
 | 
			
		||||
                .Parameter("roles", ParameterType.Multiple)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                    var msg = new StringBuilder($"There are `{config.ListOfSelfAssignableRoles.Count}` self assignable roles:\n");
 | 
			
		||||
                    var toRemove = new HashSet<ulong>();
 | 
			
		||||
                    foreach (var roleId in config.ListOfSelfAssignableRoles.OrderBy(r => r.ToString()))
 | 
			
		||||
                    {
 | 
			
		||||
                        var role = e.Server.GetRole(roleId);
 | 
			
		||||
                        if (role == null)
 | 
			
		||||
                        {
 | 
			
		||||
                            msg.Append($"`{roleId} not found. Cleaned up.`, ");
 | 
			
		||||
                            toRemove.Add(roleId);
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            msg.Append($"**{role.Name}**, ");
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    foreach (var id in toRemove)
 | 
			
		||||
                    {
 | 
			
		||||
                        config.ListOfSelfAssignableRoles.Remove(id);
 | 
			
		||||
                    }
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync(msg.ToString()).ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "lsar")
 | 
			
		||||
//                .Description($"Lists all self-assignable roles. | `{Prefix}lsar`")
 | 
			
		||||
//                .Parameter("roles", ParameterType.Multiple)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    var msg = new StringBuilder($"There are `{config.ListOfSelfAssignableRoles.Count}` self assignable roles:\n");
 | 
			
		||||
//                    var toRemove = new HashSet<ulong>();
 | 
			
		||||
//                    foreach (var roleId in config.ListOfSelfAssignableRoles.OrderBy(r => r.ToString()))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var role = e.Server.GetRole(roleId);
 | 
			
		||||
//                        if (role == null)
 | 
			
		||||
//                        {
 | 
			
		||||
//                            msg.Append($"`{roleId} not found. Cleaned up.`, ");
 | 
			
		||||
//                            toRemove.Add(roleId);
 | 
			
		||||
//                        }
 | 
			
		||||
//                        else
 | 
			
		||||
//                        {
 | 
			
		||||
//                            msg.Append($"**{role.Name}**, ");
 | 
			
		||||
//                        }
 | 
			
		||||
//                    }
 | 
			
		||||
//                    foreach (var id in toRemove)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        config.ListOfSelfAssignableRoles.Remove(id);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync(msg.ToString()).ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "togglexclsar").Alias(Module.Prefix + "tesar")
 | 
			
		||||
                .Description($"toggle whether the self-assigned roles should be exclusive | `{Prefix}tesar`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.CanManageRoles)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                    config.ExclusiveSelfAssignedRoles = !config.ExclusiveSelfAssignedRoles;
 | 
			
		||||
                    string exl = config.ExclusiveSelfAssignedRoles ? "exclusive" : "not exclusive";
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync("Self assigned roles are now " + exl);
 | 
			
		||||
                });
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "togglexclsar").Alias(Module.Prefix + "tesar")
 | 
			
		||||
//                .Description($"toggle whether the self-assigned roles should be exclusive | `{Prefix}tesar`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.CanManageRoles)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    config.ExclusiveSelfAssignedRoles = !config.ExclusiveSelfAssignedRoles;
 | 
			
		||||
//                    string exl = config.ExclusiveSelfAssignedRoles ? "exclusive" : "not exclusive";
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync("Self assigned roles are now " + exl);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "iam")
 | 
			
		||||
                .Description("Adds a role to you that you choose. " +
 | 
			
		||||
                             "Role must be on a list of self-assignable roles." +
 | 
			
		||||
                             $" | `{Prefix}iam Gamer`")
 | 
			
		||||
                .Parameter("role", ParameterType.Unparsed)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var roleName = e.GetArg("role")?.Trim();
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(roleName))
 | 
			
		||||
                        return;
 | 
			
		||||
                    var role = e.Server.FindRoles(roleName).FirstOrDefault();
 | 
			
		||||
                    if (role == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync(":anger:That role does not exist.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                    if (!config.ListOfSelfAssignableRoles.Contains(role.Id))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync(":anger:That role is not self-assignable.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (e.User.HasRole(role))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync($":anger:You already have {role.Name} role.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    var sameRoles = e.User.Roles.Where(r => config.ListOfSelfAssignableRoles.Contains(r.Id));
 | 
			
		||||
                    if (config.ExclusiveSelfAssignedRoles && sameRoles.Any())
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync($":anger:You already have {sameRoles.FirstOrDefault().Name} role.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        await e.User.AddRoles(role).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    catch (HttpException ex) when (ex.StatusCode == System.Net.HttpStatusCode.InternalServerError)
 | 
			
		||||
                    {
 | 
			
		||||
                    }
 | 
			
		||||
                    catch (Exception ex)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync($":anger:`I am unable to add that role to you. I can't add roles to owners or other roles higher than my role in the role hierarchy.`").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    var msg = await imsg.Channel.SendMessageAsync($":ok:You now have {role.Name} role.").ConfigureAwait(false);
 | 
			
		||||
                    await Task.Delay(3000).ConfigureAwait(false);
 | 
			
		||||
                    await msg.Delete().ConfigureAwait(false);
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        await e.Message.Delete().ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    catch { }
 | 
			
		||||
                });
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "iam")
 | 
			
		||||
//                .Description("Adds a role to you that you choose. " +
 | 
			
		||||
//                             "Role must be on a list of self-assignable roles." +
 | 
			
		||||
//                             $" | `{Prefix}iam Gamer`")
 | 
			
		||||
//                .Parameter("role", ParameterType.Unparsed)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var roleName = e.GetArg("role")?.Trim();
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(roleName))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    var role = e.Server.FindRoles(roleName).FirstOrDefault();
 | 
			
		||||
//                    if (role == null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync(":anger:That role does not exist.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    if (!config.ListOfSelfAssignableRoles.Contains(role.Id))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync(":anger:That role is not self-assignable.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    if (e.User.HasRole(role))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync($":anger:You already have {role.Name} role.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    var sameRoles = e.User.Roles.Where(r => config.ListOfSelfAssignableRoles.Contains(r.Id));
 | 
			
		||||
//                    if (config.ExclusiveSelfAssignedRoles && sameRoles.Any())
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync($":anger:You already have {sameRoles.FirstOrDefault().Name} role.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    try
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await e.User.AddRoles(role).ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    catch (HttpException ex) when (ex.StatusCode == System.Net.HttpStatusCode.InternalServerError)
 | 
			
		||||
//                    {
 | 
			
		||||
//                    }
 | 
			
		||||
//                    catch (Exception ex)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync($":anger:`I am unable to add that role to you. I can't add roles to owners or other roles higher than my role in the role hierarchy.`").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    var msg = await imsg.Channel.SendMessageAsync($":ok:You now have {role.Name} role.").ConfigureAwait(false);
 | 
			
		||||
//                    await Task.Delay(3000).ConfigureAwait(false);
 | 
			
		||||
//                    await msg.Delete().ConfigureAwait(false);
 | 
			
		||||
//                    try
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await e.Message.Delete().ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    catch { }
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "iamnot")
 | 
			
		||||
                .Alias(Module.Prefix + "iamn")
 | 
			
		||||
                .Description("Removes a role to you that you choose. " +
 | 
			
		||||
                             "Role must be on a list of self-assignable roles." +
 | 
			
		||||
                             $" | `{Prefix}iamn Gamer`")
 | 
			
		||||
                .Parameter("role", ParameterType.Unparsed)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var roleName = e.GetArg("role")?.Trim();
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(roleName))
 | 
			
		||||
                        return;
 | 
			
		||||
                    var role = e.Server.FindRoles(roleName).FirstOrDefault();
 | 
			
		||||
                    if (role == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync(":anger:That role does not exist.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                    if (!config.ListOfSelfAssignableRoles.Contains(role.Id))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync(":anger:That role is not self-assignable.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!e.User.HasRole(role))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync($":anger:You don't have {role.Name} role.").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    await e.User.RemoveRoles(role).ConfigureAwait(false);
 | 
			
		||||
                    var msg = await imsg.Channel.SendMessageAsync($":ok:Successfuly removed {role.Name} role from you.").ConfigureAwait(false);
 | 
			
		||||
                    await Task.Delay(3000).ConfigureAwait(false);
 | 
			
		||||
                    await msg.Delete().ConfigureAwait(false);
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        await e.Message.Delete().ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    catch { }
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "iamnot")
 | 
			
		||||
//                .Alias(Module.Prefix + "iamn")
 | 
			
		||||
//                .Description("Removes a role to you that you choose. " +
 | 
			
		||||
//                             "Role must be on a list of self-assignable roles." +
 | 
			
		||||
//                             $" | `{Prefix}iamn Gamer`")
 | 
			
		||||
//                .Parameter("role", ParameterType.Unparsed)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var roleName = e.GetArg("role")?.Trim();
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(roleName))
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    var role = e.Server.FindRoles(roleName).FirstOrDefault();
 | 
			
		||||
//                    if (role == null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync(":anger:That role does not exist.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    if (!config.ListOfSelfAssignableRoles.Contains(role.Id))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync(":anger:That role is not self-assignable.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    if (!e.User.HasRole(role))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync($":anger:You don't have {role.Name} role.").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    await e.User.RemoveRoles(role).ConfigureAwait(false);
 | 
			
		||||
//                    var msg = await imsg.Channel.SendMessageAsync($":ok:Successfuly removed {role.Name} role from you.").ConfigureAwait(false);
 | 
			
		||||
//                    await Task.Delay(3000).ConfigureAwait(false);
 | 
			
		||||
//                    await msg.Delete().ConfigureAwait(false);
 | 
			
		||||
//                    try
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await e.Message.Delete().ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    catch { }
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,42 +1,42 @@
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    class SelfCommands : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        public SelfCommands(DiscordModule module) : base(module)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    class SelfCommands : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        public SelfCommands(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "leave")
 | 
			
		||||
                .Description($"Makes Nadeko leave the server. Either name or id required. **Bot Owner Only!**| `{Prefix}leave 123123123331`")
 | 
			
		||||
                .Parameter("arg", ParameterType.Required)
 | 
			
		||||
                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    var arg = e.GetArg("arg").Trim();
 | 
			
		||||
                    var server = NadekoBot.Client.Servers.FirstOrDefault(s => s.Id.ToString() == arg) ??
 | 
			
		||||
                                 NadekoBot.Client.FindServers(arg).FirstOrDefault();
 | 
			
		||||
                    if (server == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Cannot find that server").ConfigureAwait(false);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!server.IsOwner)
 | 
			
		||||
                    {
 | 
			
		||||
                        await server.Leave().ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        await server.Delete().ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    await NadekoBot.SendMessageToOwner("Left server " + server.Name).ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "leave")
 | 
			
		||||
//                .Description($"Makes Nadeko leave the server. Either name or id required. **Bot Owner Only!**| `{Prefix}leave 123123123331`")
 | 
			
		||||
//                .Parameter("arg", ParameterType.Required)
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var arg = e.GetArg("arg").Trim();
 | 
			
		||||
//                    var server = NadekoBot.Client.Servers.FirstOrDefault(s => s.Id.ToString() == arg) ??
 | 
			
		||||
//                                 NadekoBot.Client.FindServers(arg).FirstOrDefault();
 | 
			
		||||
//                    if (server == null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Cannot find that server").ConfigureAwait(false);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    if (!server.IsOwner)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await server.Leave().ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await server.Delete().ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    await NadekoBot.SendMessageToOwner("Left server " + server.Name).ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,332 +1,332 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
//using Discord;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using System.Collections.Concurrent;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
//using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
/* Voltana's legacy
 | 
			
		||||
public class AsyncLazy<T> : Lazy<Task<T>> 
 | 
			
		||||
{ 
 | 
			
		||||
    public AsyncLazy(Func<T> valueFactory) : 
 | 
			
		||||
        base(() => Task.Factory.StartNew(valueFactory)) { }
 | 
			
		||||
///* Voltana's legacy
 | 
			
		||||
//public class AsyncLazy<T> : Lazy<Task<T>> 
 | 
			
		||||
//{ 
 | 
			
		||||
//    public AsyncLazy(Func<T> valueFactory) : 
 | 
			
		||||
//        base(() => Task.Factory.StartNew(valueFactory)) { }
 | 
			
		||||
 | 
			
		||||
    public AsyncLazy(Func<Task<T>> taskFactory) : 
 | 
			
		||||
        base(() => Task.Factory.StartNew(() => taskFactory()).Unwrap()) { } 
 | 
			
		||||
//    public AsyncLazy(Func<Task<T>> taskFactory) : 
 | 
			
		||||
//        base(() => Task.Factory.StartNew(() => taskFactory()).Unwrap()) { } 
 | 
			
		||||
 | 
			
		||||
    public TaskAwaiter<T> GetAwaiter() { return Value.GetAwaiter(); } 
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
//    public TaskAwaiter<T> GetAwaiter() { return Value.GetAwaiter(); } 
 | 
			
		||||
//}
 | 
			
		||||
//*/
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    internal class ServerGreetCommand : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    internal class ServerGreetCommand : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
 | 
			
		||||
        public static ConcurrentDictionary<ulong, AnnounceControls> AnnouncementsDictionary;
 | 
			
		||||
//        public static ConcurrentDictionary<ulong, AnnounceControls> AnnouncementsDictionary;
 | 
			
		||||
 | 
			
		||||
        public static long Greeted = 0;
 | 
			
		||||
//        public static long Greeted = 0;
 | 
			
		||||
 | 
			
		||||
        public ServerGreetCommand(DiscordModule module) : base(module)
 | 
			
		||||
        {
 | 
			
		||||
            AnnouncementsDictionary = new ConcurrentDictionary<ulong, AnnounceControls>();
 | 
			
		||||
//        public ServerGreetCommand(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
//            AnnouncementsDictionary = new ConcurrentDictionary<ulong, AnnounceControls>();
 | 
			
		||||
 | 
			
		||||
            NadekoBot.Client.UserJoined += UserJoined;
 | 
			
		||||
            NadekoBot.Client.UserLeft += UserLeft;
 | 
			
		||||
//            NadekoBot.Client.UserJoined += UserJoined;
 | 
			
		||||
//            NadekoBot.Client.UserLeft += UserLeft;
 | 
			
		||||
 | 
			
		||||
            var data = Classes.DbHandler.Instance.GetAllRows<DataModels.Announcement>();
 | 
			
		||||
//            var data = Classes.DbHandler.Instance.GetAllRows<DataModels.Announcement>();
 | 
			
		||||
 | 
			
		||||
            if (!data.Any()) return;
 | 
			
		||||
            foreach (var obj in data)
 | 
			
		||||
                AnnouncementsDictionary.TryAdd((ulong)obj.ServerId, new AnnounceControls(obj));
 | 
			
		||||
        }
 | 
			
		||||
//            if (!data.Any()) return;
 | 
			
		||||
//            foreach (var obj in data)
 | 
			
		||||
//                AnnouncementsDictionary.TryAdd((ulong)obj.ServerId, new AnnounceControls(obj));
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private async void UserLeft(object sender, UserEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (!AnnouncementsDictionary.ContainsKey(e.Server.Id) ||
 | 
			
		||||
                    !AnnouncementsDictionary[e.Server.Id].Bye) return;
 | 
			
		||||
//        private async void UserLeft(object sender, UserEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                if (!AnnouncementsDictionary.ContainsKey(e.Server.Id) ||
 | 
			
		||||
//                    !AnnouncementsDictionary[e.Server.Id].Bye) return;
 | 
			
		||||
 | 
			
		||||
                var controls = AnnouncementsDictionary[e.Server.Id];
 | 
			
		||||
                var channel = NadekoBot.Client.GetChannel(controls.ByeChannel);
 | 
			
		||||
                var msg = controls.ByeText.Replace("%user%", "**" + e.User.Name + "**").Trim();
 | 
			
		||||
                if (string.IsNullOrEmpty(msg))
 | 
			
		||||
                    return;
 | 
			
		||||
//                var controls = AnnouncementsDictionary[e.Server.Id];
 | 
			
		||||
//                var channel = NadekoBot.Client.GetChannel(controls.ByeChannel);
 | 
			
		||||
//                var msg = controls.ByeText.Replace("%user%", "**" + e.User.Name + "**").Trim();
 | 
			
		||||
//                if (string.IsNullOrEmpty(msg))
 | 
			
		||||
//                    return;
 | 
			
		||||
 | 
			
		||||
                if (controls.ByePM)
 | 
			
		||||
                {
 | 
			
		||||
                    Greeted++;
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        await e.User.SendMessage($"`Farewell Message From {e.Server?.Name}`\n" + msg).ConfigureAwait(false);
 | 
			
		||||
//                if (controls.ByePM)
 | 
			
		||||
//                {
 | 
			
		||||
//                    Greeted++;
 | 
			
		||||
//                    try
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await e.User.SendMessage($"`Farewell Message From {e.Server?.Name}`\n" + msg).ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                    catch { }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if (channel == null) return;
 | 
			
		||||
                    Greeted++;
 | 
			
		||||
                    var toDelete = await channel.SendMessage(msg).ConfigureAwait(false);
 | 
			
		||||
                    if (e.Server.CurrentUser.GetPermissions(channel).ManageMessages && controls.DeleteGreetMessages)
 | 
			
		||||
                    {
 | 
			
		||||
                        await Task.Delay(30000).ConfigureAwait(false); // 5 minutes
 | 
			
		||||
                        await toDelete.Delete().ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
//                    }
 | 
			
		||||
//                    catch { }
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (channel == null) return;
 | 
			
		||||
//                    Greeted++;
 | 
			
		||||
//                    var toDelete = await channel.SendMessage(msg).ConfigureAwait(false);
 | 
			
		||||
//                    if (e.Server.CurrentUser.GetPermissions(channel).ManageMessages && controls.DeleteGreetMessages)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await Task.Delay(30000).ConfigureAwait(false); // 5 minutes
 | 
			
		||||
//                        await toDelete.Delete().ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private async void UserJoined(object sender, Discord.UserEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (!AnnouncementsDictionary.ContainsKey(e.Server.Id) ||
 | 
			
		||||
                    !AnnouncementsDictionary[e.Server.Id].Greet) return;
 | 
			
		||||
//        private async void UserJoined(object sender, Discord.UserEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                if (!AnnouncementsDictionary.ContainsKey(e.Server.Id) ||
 | 
			
		||||
//                    !AnnouncementsDictionary[e.Server.Id].Greet) return;
 | 
			
		||||
 | 
			
		||||
                var controls = AnnouncementsDictionary[e.Server.Id];
 | 
			
		||||
                var channel = NadekoBot.Client.GetChannel(controls.GreetChannel);
 | 
			
		||||
//                var controls = AnnouncementsDictionary[e.Server.Id];
 | 
			
		||||
//                var channel = NadekoBot.Client.GetChannel(controls.GreetChannel);
 | 
			
		||||
 | 
			
		||||
                var msg = controls.GreetText.Replace("%user%", e.User.Mention).Trim();
 | 
			
		||||
                if (string.IsNullOrEmpty(msg))
 | 
			
		||||
                    return;
 | 
			
		||||
                if (controls.GreetPM)
 | 
			
		||||
                {
 | 
			
		||||
                    Greeted++;
 | 
			
		||||
                    await e.User.SendMessage($"`Welcome Message From {e.Server.Name}`\n" + msg).ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if (channel == null) return;
 | 
			
		||||
                    Greeted++;
 | 
			
		||||
                    var toDelete = await channel.SendMessage(msg).ConfigureAwait(false);
 | 
			
		||||
                    if (e.Server.CurrentUser.GetPermissions(channel).ManageMessages && controls.DeleteGreetMessages)
 | 
			
		||||
                    {
 | 
			
		||||
                        await Task.Delay(30000).ConfigureAwait(false); // 5 minutes
 | 
			
		||||
                        await toDelete.Delete().ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
//                var msg = controls.GreetText.Replace("%user%", e.User.Mention).Trim();
 | 
			
		||||
//                if (string.IsNullOrEmpty(msg))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                if (controls.GreetPM)
 | 
			
		||||
//                {
 | 
			
		||||
//                    Greeted++;
 | 
			
		||||
//                    await e.User.SendMessage($"`Welcome Message From {e.Server.Name}`\n" + msg).ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (channel == null) return;
 | 
			
		||||
//                    Greeted++;
 | 
			
		||||
//                    var toDelete = await channel.SendMessage(msg).ConfigureAwait(false);
 | 
			
		||||
//                    if (e.Server.CurrentUser.GetPermissions(channel).ManageMessages && controls.DeleteGreetMessages)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await Task.Delay(30000).ConfigureAwait(false); // 5 minutes
 | 
			
		||||
//                        await toDelete.Delete().ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        public class AnnounceControls
 | 
			
		||||
        {
 | 
			
		||||
            private DataModels.Announcement _model { get; }
 | 
			
		||||
//        public class AnnounceControls
 | 
			
		||||
//        {
 | 
			
		||||
//            private DataModels.Announcement _model { get; }
 | 
			
		||||
 | 
			
		||||
            public bool Greet {
 | 
			
		||||
                get { return _model.Greet; }
 | 
			
		||||
                set { _model.Greet = value; Save(); }
 | 
			
		||||
            }
 | 
			
		||||
//            public bool Greet {
 | 
			
		||||
//                get { return _model.Greet; }
 | 
			
		||||
//                set { _model.Greet = value; Save(); }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public ulong GreetChannel {
 | 
			
		||||
                get { return (ulong)_model.GreetChannelId; }
 | 
			
		||||
                set { _model.GreetChannelId = (long)value; Save(); }
 | 
			
		||||
            }
 | 
			
		||||
//            public ulong GreetChannel {
 | 
			
		||||
//                get { return (ulong)_model.GreetChannelId; }
 | 
			
		||||
//                set { _model.GreetChannelId = (long)value; Save(); }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public bool GreetPM {
 | 
			
		||||
                get { return _model.GreetPM; }
 | 
			
		||||
                set { _model.GreetPM = value; Save(); }
 | 
			
		||||
            }
 | 
			
		||||
//            public bool GreetPM {
 | 
			
		||||
//                get { return _model.GreetPM; }
 | 
			
		||||
//                set { _model.GreetPM = value; Save(); }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public bool ByePM {
 | 
			
		||||
                get { return _model.ByePM; }
 | 
			
		||||
                set { _model.ByePM = value; Save(); }
 | 
			
		||||
            }
 | 
			
		||||
//            public bool ByePM {
 | 
			
		||||
//                get { return _model.ByePM; }
 | 
			
		||||
//                set { _model.ByePM = value; Save(); }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public string GreetText {
 | 
			
		||||
                get { return _model.GreetText; }
 | 
			
		||||
                set { _model.GreetText = value; Save(); }
 | 
			
		||||
            }
 | 
			
		||||
//            public string GreetText {
 | 
			
		||||
//                get { return _model.GreetText; }
 | 
			
		||||
//                set { _model.GreetText = value; Save(); }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public bool Bye {
 | 
			
		||||
                get { return _model.Bye; }
 | 
			
		||||
                set { _model.Bye = value; Save(); }
 | 
			
		||||
            }
 | 
			
		||||
            public ulong ByeChannel {
 | 
			
		||||
                get { return (ulong)_model.ByeChannelId; }
 | 
			
		||||
                set { _model.ByeChannelId = (long)value; Save(); }
 | 
			
		||||
            }
 | 
			
		||||
//            public bool Bye {
 | 
			
		||||
//                get { return _model.Bye; }
 | 
			
		||||
//                set { _model.Bye = value; Save(); }
 | 
			
		||||
//            }
 | 
			
		||||
//            public ulong ByeChannel {
 | 
			
		||||
//                get { return (ulong)_model.ByeChannelId; }
 | 
			
		||||
//                set { _model.ByeChannelId = (long)value; Save(); }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public string ByeText {
 | 
			
		||||
                get { return _model.ByeText; }
 | 
			
		||||
                set { _model.ByeText = value; Save(); }
 | 
			
		||||
            }
 | 
			
		||||
//            public string ByeText {
 | 
			
		||||
//                get { return _model.ByeText; }
 | 
			
		||||
//                set { _model.ByeText = value; Save(); }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public ulong ServerId {
 | 
			
		||||
                get { return (ulong)_model.ServerId; }
 | 
			
		||||
                set { _model.ServerId = (long)value; }
 | 
			
		||||
            }
 | 
			
		||||
//            public ulong ServerId {
 | 
			
		||||
//                get { return (ulong)_model.ServerId; }
 | 
			
		||||
//                set { _model.ServerId = (long)value; }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public bool DeleteGreetMessages {
 | 
			
		||||
                get {
 | 
			
		||||
                    return _model.DeleteGreetMessages;
 | 
			
		||||
                }
 | 
			
		||||
                set {
 | 
			
		||||
                    _model.DeleteGreetMessages = value; Save();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
//            public bool DeleteGreetMessages {
 | 
			
		||||
//                get {
 | 
			
		||||
//                    return _model.DeleteGreetMessages;
 | 
			
		||||
//                }
 | 
			
		||||
//                set {
 | 
			
		||||
//                    _model.DeleteGreetMessages = value; Save();
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public AnnounceControls(DataModels.Announcement model)
 | 
			
		||||
            {
 | 
			
		||||
                this._model = model;
 | 
			
		||||
            }
 | 
			
		||||
//            public AnnounceControls(DataModels.Announcement model)
 | 
			
		||||
//            {
 | 
			
		||||
//                this._model = model;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            public AnnounceControls(ulong serverId)
 | 
			
		||||
            {
 | 
			
		||||
                this._model = new DataModels.Announcement();
 | 
			
		||||
                ServerId = serverId;
 | 
			
		||||
            }
 | 
			
		||||
//            public AnnounceControls(ulong serverId)
 | 
			
		||||
//            {
 | 
			
		||||
//                this._model = new DataModels.Announcement();
 | 
			
		||||
//                ServerId = serverId;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            internal bool ToggleBye(ulong id)
 | 
			
		||||
            {
 | 
			
		||||
                if (Bye)
 | 
			
		||||
                {
 | 
			
		||||
                    return Bye = false;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    ByeChannel = id;
 | 
			
		||||
                    return Bye = true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
//            internal bool ToggleBye(ulong id)
 | 
			
		||||
//            {
 | 
			
		||||
//                if (Bye)
 | 
			
		||||
//                {
 | 
			
		||||
//                    return Bye = false;
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                {
 | 
			
		||||
//                    ByeChannel = id;
 | 
			
		||||
//                    return Bye = true;
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            internal bool ToggleGreet(ulong id)
 | 
			
		||||
            {
 | 
			
		||||
                if (Greet)
 | 
			
		||||
                {
 | 
			
		||||
                    return Greet = false;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    GreetChannel = id;
 | 
			
		||||
                    return Greet = true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
//            internal bool ToggleGreet(ulong id)
 | 
			
		||||
//            {
 | 
			
		||||
//                if (Greet)
 | 
			
		||||
//                {
 | 
			
		||||
//                    return Greet = false;
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                {
 | 
			
		||||
//                    GreetChannel = id;
 | 
			
		||||
//                    return Greet = true;
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            internal bool ToggleDelete() => DeleteGreetMessages = !DeleteGreetMessages;
 | 
			
		||||
            internal bool ToggleGreetPM() => GreetPM = !GreetPM;
 | 
			
		||||
            internal bool ToggleByePM() => ByePM = !ByePM;
 | 
			
		||||
//            internal bool ToggleDelete() => DeleteGreetMessages = !DeleteGreetMessages;
 | 
			
		||||
//            internal bool ToggleGreetPM() => GreetPM = !GreetPM;
 | 
			
		||||
//            internal bool ToggleByePM() => ByePM = !ByePM;
 | 
			
		||||
 | 
			
		||||
            private void Save()
 | 
			
		||||
            {
 | 
			
		||||
                Classes.DbHandler.Instance.Save(_model);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
//            private void Save()
 | 
			
		||||
//            {
 | 
			
		||||
//                Classes.DbHandler.Instance.Save(_model);
 | 
			
		||||
//            }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "grdel")
 | 
			
		||||
                .Description($"Toggles automatic deletion of greet and bye messages. **Needs Manage Server Permissions.**| `{Prefix}grdel`")
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "grdel")
 | 
			
		||||
//                .Description($"Toggles automatic deletion of greet and bye messages. **Needs Manage Server Permissions.**| `{Prefix}grdel`")
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
//                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
 | 
			
		||||
                    if (ann.ToggleDelete())
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`Automatic deletion of greet and bye messages has been enabled.`").ConfigureAwait(false);
 | 
			
		||||
                    else
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`Automatic deletion of greet and bye messages has been disabled.`").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//                    if (ann.ToggleDelete())
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`Automatic deletion of greet and bye messages has been enabled.`").ConfigureAwait(false);
 | 
			
		||||
//                    else
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`Automatic deletion of greet and bye messages has been disabled.`").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "greet")
 | 
			
		||||
                .Description($"Toggles anouncements on the current channel when someone joins the server. **Needs Manage Server Permissions.**| `{Prefix}greet`")
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "greet")
 | 
			
		||||
//                .Description($"Toggles anouncements on the current channel when someone joins the server. **Needs Manage Server Permissions.**| `{Prefix}greet`")
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
//                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
 | 
			
		||||
                    if (ann.ToggleGreet(e.Channel.Id))
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Greet announcements enabled on this channel.").ConfigureAwait(false);
 | 
			
		||||
                    else
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Greet announcements disabled.").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//                    if (ann.ToggleGreet(e.Channel.Id))
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Greet announcements enabled on this channel.").ConfigureAwait(false);
 | 
			
		||||
//                    else
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Greet announcements disabled.").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "greetmsg")
 | 
			
		||||
                .Description($"Sets a new join announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current greet message. **Needs Manage Server Permissions.**| `{Prefix}greetmsg Welcome to the server, %user%.`")
 | 
			
		||||
                .Parameter("msg", ParameterType.Unparsed)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(e.GetArg("msg")))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`Current greet message:` " + ann.GreetText);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "greetmsg")
 | 
			
		||||
//                .Description($"Sets a new join announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current greet message. **Needs Manage Server Permissions.**| `{Prefix}greetmsg Welcome to the server, %user%.`")
 | 
			
		||||
//                .Parameter("msg", ParameterType.Unparsed)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
//                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(e.GetArg("msg")))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`Current greet message:` " + ann.GreetText);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    ann.GreetText = e.GetArg("msg");
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync("New greet message set.").ConfigureAwait(false);
 | 
			
		||||
                    if (!ann.Greet)
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Enable greet messsages by typing `.greet`").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//                    ann.GreetText = e.GetArg("msg");
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync("New greet message set.").ConfigureAwait(false);
 | 
			
		||||
//                    if (!ann.Greet)
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Enable greet messsages by typing `.greet`").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "bye")
 | 
			
		||||
                .Description($"Toggles anouncements on the current channel when someone leaves the server. | `{Prefix}bye`")
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "bye")
 | 
			
		||||
//                .Description($"Toggles anouncements on the current channel when someone leaves the server. | `{Prefix}bye`")
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
//                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
 | 
			
		||||
                    if (ann.ToggleBye(e.Channel.Id))
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Bye announcements enabled on this channel.").ConfigureAwait(false);
 | 
			
		||||
                    else
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Bye announcements disabled.").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//                    if (ann.ToggleBye(e.Channel.Id))
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Bye announcements enabled on this channel.").ConfigureAwait(false);
 | 
			
		||||
//                    else
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Bye announcements disabled.").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "byemsg")
 | 
			
		||||
                .Description($"Sets a new leave announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current bye message. **Needs Manage Server Permissions.**| `{Prefix}byemsg %user% has left the server.`")
 | 
			
		||||
                .Parameter("msg", ParameterType.Unparsed)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
                    if (string.IsNullOrWhiteSpace(e.GetArg("msg")))
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`Current bye message:` " + ann.ByeText);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "byemsg")
 | 
			
		||||
//                .Description($"Sets a new leave announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current bye message. **Needs Manage Server Permissions.**| `{Prefix}byemsg %user% has left the server.`")
 | 
			
		||||
//                .Parameter("msg", ParameterType.Unparsed)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
//                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
//                    if (string.IsNullOrWhiteSpace(e.GetArg("msg")))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`Current bye message:` " + ann.ByeText);
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
                    ann.ByeText = e.GetArg("msg");
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync("New bye message set.").ConfigureAwait(false);
 | 
			
		||||
                    if (!ann.Bye)
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Enable bye messsages by typing `.bye`.").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//                    ann.ByeText = e.GetArg("msg");
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync("New bye message set.").ConfigureAwait(false);
 | 
			
		||||
//                    if (!ann.Bye)
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Enable bye messsages by typing `.bye`.").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "byepm")
 | 
			
		||||
                .Description($"Toggles whether the good bye messages will be sent in a PM or in the text channel. **Needs Manage Server Permissions.**| `{Prefix}byepm`")
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "byepm")
 | 
			
		||||
//                .Description($"Toggles whether the good bye messages will be sent in a PM or in the text channel. **Needs Manage Server Permissions.**| `{Prefix}byepm`")
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
//                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    if (ann.ToggleByePM())
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Bye messages will be sent in a PM from now on.\n ⚠ Keep in mind this might fail if the user and the bot have no common servers after the user leaves.").ConfigureAwait(false);
 | 
			
		||||
                    else
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Bye messages will be sent in a bound channel from now on.").ConfigureAwait(false);
 | 
			
		||||
                    if (!ann.Bye)
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Enable bye messsages by typing `.bye`, and set the bye message using `.byemsg`").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
//                    if (ann.ToggleByePM())
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Bye messages will be sent in a PM from now on.\n ⚠ Keep in mind this might fail if the user and the bot have no common servers after the user leaves.").ConfigureAwait(false);
 | 
			
		||||
//                    else
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Bye messages will be sent in a bound channel from now on.").ConfigureAwait(false);
 | 
			
		||||
//                    if (!ann.Bye)
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Enable bye messsages by typing `.bye`, and set the bye message using `.byemsg`").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "greetpm")
 | 
			
		||||
                .Description($"Toggles whether the greet messages will be sent in a PM or in the text channel. **Needs Manage Server Permissions.**| `{Prefix}greetpm`")
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "greetpm")
 | 
			
		||||
//                .Description($"Toggles whether the greet messages will be sent in a PM or in the text channel. **Needs Manage Server Permissions.**| `{Prefix}greetpm`")
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (!e.User.ServerPermissions.ManageServer) return;
 | 
			
		||||
 | 
			
		||||
                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
//                    var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id));
 | 
			
		||||
 | 
			
		||||
                    if (ann.ToggleGreetPM())
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Greet messages will be sent in a PM from now on.").ConfigureAwait(false);
 | 
			
		||||
                    else
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Greet messages will be sent in a bound channel from now on.").ConfigureAwait(false);
 | 
			
		||||
                    if (!ann.Greet)
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Enable greet messsages by typing `.greet`, and set the greet message using `.greetmsg`").ConfigureAwait(false);
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//                    if (ann.ToggleGreetPM())
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Greet messages will be sent in a PM from now on.").ConfigureAwait(false);
 | 
			
		||||
//                    else
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Greet messages will be sent in a bound channel from now on.").ConfigureAwait(false);
 | 
			
		||||
//                    if (!ann.Greet)
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Enable greet messsages by typing `.greet`, and set the greet message using `.greetmsg`").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,164 +1,164 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Classes;
 | 
			
		||||
using NadekoBot.Extensions;
 | 
			
		||||
using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text.RegularExpressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using ChPermOverride = Discord.ChannelPermissionOverrides;
 | 
			
		||||
//using Discord;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Extensions;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
//using System.Text.RegularExpressions;
 | 
			
		||||
//using System.Threading.Tasks;
 | 
			
		||||
//using ChPermOverride = Discord.ChannelPermissionOverrides;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
{
 | 
			
		||||
    internal class VoicePlusTextCommand : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        Regex channelNameRegex = new Regex(@"[^a-zA-Z0-9 -]", RegexOptions.Compiled);
 | 
			
		||||
        public VoicePlusTextCommand(DiscordModule module) : base(module)
 | 
			
		||||
        {
 | 
			
		||||
            // changing servers may cause bugs
 | 
			
		||||
            NadekoBot.Client.UserUpdated += async (sender, e) =>
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    if (e.Server == null)
 | 
			
		||||
                        return;
 | 
			
		||||
                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                    if (e.Before.VoiceChannel == e.After.VoiceChannel) return;
 | 
			
		||||
                    if (!config.VoicePlusTextEnabled)
 | 
			
		||||
                        return;
 | 
			
		||||
                    var serverPerms = e.Server.GetUser(NadekoBot.Client.CurrentUser.Id)?.ServerPermissions;
 | 
			
		||||
                    if (serverPerms == null)
 | 
			
		||||
                        return;
 | 
			
		||||
                    if (!serverPerms.Value.ManageChannels || !serverPerms.Value.ManageRoles)
 | 
			
		||||
                    {
 | 
			
		||||
//namespace NadekoBot.Modules.Administration.Commands
 | 
			
		||||
//{
 | 
			
		||||
//    internal class VoicePlusTextCommand : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        Regex channelNameRegex = new Regex(@"[^a-zA-Z0-9 -]", RegexOptions.Compiled);
 | 
			
		||||
//        public VoicePlusTextCommand(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
//            // changing servers may cause bugs
 | 
			
		||||
//            NadekoBot.Client.UserUpdated += async (sender, e) =>
 | 
			
		||||
//            {
 | 
			
		||||
//                try
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (e.Server == null)
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    if (e.Before.VoiceChannel == e.After.VoiceChannel) return;
 | 
			
		||||
//                    if (!config.VoicePlusTextEnabled)
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    var serverPerms = e.Server.GetUser(NadekoBot.Client.CurrentUser.Id)?.ServerPermissions;
 | 
			
		||||
//                    if (serverPerms == null)
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    if (!serverPerms.Value.ManageChannels || !serverPerms.Value.ManageRoles)
 | 
			
		||||
//                    {
 | 
			
		||||
 | 
			
		||||
                        try
 | 
			
		||||
                        {
 | 
			
		||||
                            await e.Server.Owner.SendMessage(
 | 
			
		||||
                                "I don't have manage server and/or Manage Channels permission," +
 | 
			
		||||
                                $" so I cannot run voice+text on **{e.Server.Name}** server.").ConfigureAwait(false);
 | 
			
		||||
                        }
 | 
			
		||||
                        catch { } // meh
 | 
			
		||||
                        config.VoicePlusTextEnabled = false;
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
//                        try
 | 
			
		||||
//                        {
 | 
			
		||||
//                            await e.Server.Owner.SendMessage(
 | 
			
		||||
//                                "I don't have manage server and/or Manage Channels permission," +
 | 
			
		||||
//                                $" so I cannot run voice+text on **{e.Server.Name}** server.").ConfigureAwait(false);
 | 
			
		||||
//                        }
 | 
			
		||||
//                        catch { } // meh
 | 
			
		||||
//                        config.VoicePlusTextEnabled = false;
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    var beforeVch = e.Before.VoiceChannel;
 | 
			
		||||
                    if (beforeVch != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        var textChannel =
 | 
			
		||||
                            e.Server.FindChannels(GetChannelName(beforeVch.Name), ChannelType.Text).FirstOrDefault();
 | 
			
		||||
                        if (textChannel != null)
 | 
			
		||||
                            await textChannel.AddPermissionsRule(e.Before,
 | 
			
		||||
                                new ChPermOverride(readMessages: PermValue.Deny,
 | 
			
		||||
                                                   sendMessages: PermValue.Deny)).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    var afterVch = e.After.VoiceChannel;
 | 
			
		||||
                    if (afterVch != null && e.Server.AFKChannel != afterVch)
 | 
			
		||||
                    {
 | 
			
		||||
                        var textChannel = e.Server.FindChannels(
 | 
			
		||||
                                                    GetChannelName(afterVch.Name),
 | 
			
		||||
                                                    ChannelType.Text)
 | 
			
		||||
                                                    .FirstOrDefault();
 | 
			
		||||
                        if (textChannel == null)
 | 
			
		||||
                        {
 | 
			
		||||
                            textChannel = (await e.Server.CreateChannel(GetChannelName(afterVch.Name), ChannelType.Text).ConfigureAwait(false));
 | 
			
		||||
                            await textChannel.AddPermissionsRule(e.Server.EveryoneRole,
 | 
			
		||||
                                new ChPermOverride(readMessages: PermValue.Deny,
 | 
			
		||||
                                                   sendMessages: PermValue.Deny)).ConfigureAwait(false);
 | 
			
		||||
                        }
 | 
			
		||||
                        await textChannel.AddPermissionsRule(e.After,
 | 
			
		||||
                            new ChPermOverride(readMessages: PermValue.Allow,
 | 
			
		||||
                                               sendMessages: PermValue.Allow)).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine(ex);
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
//                    var beforeVch = e.Before.VoiceChannel;
 | 
			
		||||
//                    if (beforeVch != null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var textChannel =
 | 
			
		||||
//                            e.Server.FindChannels(GetChannelName(beforeVch.Name), ChannelType.Text).FirstOrDefault();
 | 
			
		||||
//                        if (textChannel != null)
 | 
			
		||||
//                            await textChannel.AddPermissionsRule(e.Before,
 | 
			
		||||
//                                new ChPermOverride(readMessages: PermValue.Deny,
 | 
			
		||||
//                                                   sendMessages: PermValue.Deny)).ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    var afterVch = e.After.VoiceChannel;
 | 
			
		||||
//                    if (afterVch != null && e.Server.AFKChannel != afterVch)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var textChannel = e.Server.FindChannels(
 | 
			
		||||
//                                                    GetChannelName(afterVch.Name),
 | 
			
		||||
//                                                    ChannelType.Text)
 | 
			
		||||
//                                                    .FirstOrDefault();
 | 
			
		||||
//                        if (textChannel == null)
 | 
			
		||||
//                        {
 | 
			
		||||
//                            textChannel = (await e.Server.CreateChannel(GetChannelName(afterVch.Name), ChannelType.Text).ConfigureAwait(false));
 | 
			
		||||
//                            await textChannel.AddPermissionsRule(e.Server.EveryoneRole,
 | 
			
		||||
//                                new ChPermOverride(readMessages: PermValue.Deny,
 | 
			
		||||
//                                                   sendMessages: PermValue.Deny)).ConfigureAwait(false);
 | 
			
		||||
//                        }
 | 
			
		||||
//                        await textChannel.AddPermissionsRule(e.After,
 | 
			
		||||
//                            new ChPermOverride(readMessages: PermValue.Allow,
 | 
			
		||||
//                                               sendMessages: PermValue.Allow)).ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                }
 | 
			
		||||
//                catch (Exception ex)
 | 
			
		||||
//                {
 | 
			
		||||
//                    Console.WriteLine(ex);
 | 
			
		||||
//                }
 | 
			
		||||
//            };
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        private string GetChannelName(string voiceName) =>
 | 
			
		||||
            channelNameRegex.Replace(voiceName, "").Trim().Replace(" ", "-").TrimTo(90, true) + "-voice";
 | 
			
		||||
//        private string GetChannelName(string voiceName) =>
 | 
			
		||||
//            channelNameRegex.Replace(voiceName, "").Trim().Replace(" ", "-").TrimTo(90, true) + "-voice";
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "cleanv+t")
 | 
			
		||||
                .Alias(Module.Prefix + "cv+t")
 | 
			
		||||
                .Description($"Deletes all text channels ending in `-voice` for which voicechannels are not found. **Use at your own risk.\nNeeds Manage Roles and Manage Channels Permissions.** | `{Prefix}cleanv+t`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.CanManageRoles)
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageChannels())
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (!e.Server.CurrentUser.ServerPermissions.ManageChannels)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("`I have insufficient permission to do that.`");
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "cleanv+t")
 | 
			
		||||
//                .Alias(Module.Prefix + "cv+t")
 | 
			
		||||
//                .Description($"Deletes all text channels ending in `-voice` for which voicechannels are not found. **Use at your own risk.\nNeeds Manage Roles and Manage Channels Permissions.** | `{Prefix}cleanv+t`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.CanManageRoles)
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageChannels())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (!e.Server.CurrentUser.ServerPermissions.ManageChannels)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("`I have insufficient permission to do that.`");
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
                    var allTxtChannels = e.Server.TextChannels.Where(c => c.Name.EndsWith("-voice"));
 | 
			
		||||
                    var validTxtChannelNames = e.Server.VoiceChannels.Select(c => GetChannelName(c.Name));
 | 
			
		||||
//                    var allTxtChannels = e.Server.TextChannels.Where(c => c.Name.EndsWith("-voice"));
 | 
			
		||||
//                    var validTxtChannelNames = e.Server.VoiceChannels.Select(c => GetChannelName(c.Name));
 | 
			
		||||
 | 
			
		||||
                    var invalidTxtChannels = allTxtChannels.Where(c => !validTxtChannelNames.Contains(c.Name));
 | 
			
		||||
//                    var invalidTxtChannels = allTxtChannels.Where(c => !validTxtChannelNames.Contains(c.Name));
 | 
			
		||||
 | 
			
		||||
                    foreach (var c in invalidTxtChannels)
 | 
			
		||||
                    {
 | 
			
		||||
                        try
 | 
			
		||||
                        {
 | 
			
		||||
                            await c.Delete();
 | 
			
		||||
                        }
 | 
			
		||||
                        catch { }
 | 
			
		||||
                        await Task.Delay(500);
 | 
			
		||||
                    }
 | 
			
		||||
//                    foreach (var c in invalidTxtChannels)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        try
 | 
			
		||||
//                        {
 | 
			
		||||
//                            await c.Delete();
 | 
			
		||||
//                        }
 | 
			
		||||
//                        catch { }
 | 
			
		||||
//                        await Task.Delay(500);
 | 
			
		||||
//                    }
 | 
			
		||||
 | 
			
		||||
                    await imsg.Channel.SendMessageAsync("`Done.`");
 | 
			
		||||
                });
 | 
			
		||||
//                    await imsg.Channel.SendMessageAsync("`Done.`");
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "voice+text")
 | 
			
		||||
                .Alias(Module.Prefix + "v+t")
 | 
			
		||||
                .Description("Creates a text channel for each voice channel only users in that voice channel can see." +
 | 
			
		||||
                             $"If you are server owner, keep in mind you will see them all the time regardless. **Needs Manage Roles and Manage Channels Permissions.**| `{Prefix}voice+text`")
 | 
			
		||||
                .AddCheck(SimpleCheckers.ManageChannels())
 | 
			
		||||
                .AddCheck(SimpleCheckers.CanManageRoles)
 | 
			
		||||
                .Do(async e =>
 | 
			
		||||
                {
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
                        if (config.VoicePlusTextEnabled == true)
 | 
			
		||||
                        {
 | 
			
		||||
                            config.VoicePlusTextEnabled = false;
 | 
			
		||||
                            foreach (var textChannel in e.Server.TextChannels.Where(c => c.Name.EndsWith("-voice")))
 | 
			
		||||
                            {
 | 
			
		||||
                                try
 | 
			
		||||
                                {
 | 
			
		||||
                                    await textChannel.Delete().ConfigureAwait(false);
 | 
			
		||||
                                }
 | 
			
		||||
                                catch
 | 
			
		||||
                                {
 | 
			
		||||
                                    await imsg.Channel.SendMessageAsync(
 | 
			
		||||
                                            ":anger: Error: Most likely i don't have permissions to do this.")
 | 
			
		||||
                                                .ConfigureAwait(false);
 | 
			
		||||
                                    return;
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            await imsg.Channel.SendMessageAsync("Successfuly removed voice + text feature.").ConfigureAwait(false);
 | 
			
		||||
                            return;
 | 
			
		||||
                        }
 | 
			
		||||
                        config.VoicePlusTextEnabled = true;
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync("Successfuly enabled voice + text feature. " +
 | 
			
		||||
                                                    "**Make sure the bot has manage roles and manage channels permissions**")
 | 
			
		||||
                                                    .ConfigureAwait(false);
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "voice+text")
 | 
			
		||||
//                .Alias(Module.Prefix + "v+t")
 | 
			
		||||
//                .Description("Creates a text channel for each voice channel only users in that voice channel can see." +
 | 
			
		||||
//                             $"If you are server owner, keep in mind you will see them all the time regardless. **Needs Manage Roles and Manage Channels Permissions.**| `{Prefix}voice+text`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageChannels())
 | 
			
		||||
//                .AddCheck(SimpleCheckers.CanManageRoles)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    try
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                        if (config.VoicePlusTextEnabled == true)
 | 
			
		||||
//                        {
 | 
			
		||||
//                            config.VoicePlusTextEnabled = false;
 | 
			
		||||
//                            foreach (var textChannel in e.Server.TextChannels.Where(c => c.Name.EndsWith("-voice")))
 | 
			
		||||
//                            {
 | 
			
		||||
//                                try
 | 
			
		||||
//                                {
 | 
			
		||||
//                                    await textChannel.Delete().ConfigureAwait(false);
 | 
			
		||||
//                                }
 | 
			
		||||
//                                catch
 | 
			
		||||
//                                {
 | 
			
		||||
//                                    await imsg.Channel.SendMessageAsync(
 | 
			
		||||
//                                            ":anger: Error: Most likely i don't have permissions to do this.")
 | 
			
		||||
//                                                .ConfigureAwait(false);
 | 
			
		||||
//                                    return;
 | 
			
		||||
//                                }
 | 
			
		||||
//                            }
 | 
			
		||||
//                            await imsg.Channel.SendMessageAsync("Successfuly removed voice + text feature.").ConfigureAwait(false);
 | 
			
		||||
//                            return;
 | 
			
		||||
//                        }
 | 
			
		||||
//                        config.VoicePlusTextEnabled = true;
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync("Successfuly enabled voice + text feature. " +
 | 
			
		||||
//                                                    "**Make sure the bot has manage roles and manage channels permissions**")
 | 
			
		||||
//                                                    .ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                    catch (Exception ex)
 | 
			
		||||
                    {
 | 
			
		||||
                        await imsg.Channel.SendMessageAsync(ex.ToString()).ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//                    }
 | 
			
		||||
//                    catch (Exception ex)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await imsg.Channel.SendMessageAsync(ex.ToString()).ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -37,9 +37,9 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task CreateWar(IMessage imsg, int size, [Remainder] string enemyClan)
 | 
			
		||||
        public async Task CreateWar(IMessage imsg, int size, [Remainder] string enemyClan = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (!(imsg.Author as IGuildUser).GuildPermissions.ManageChannels)
 | 
			
		||||
                return;
 | 
			
		||||
@@ -70,9 +70,9 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task StartWar(IMessage imsg, [Remainder] string number)
 | 
			
		||||
        public async Task StartWar(IMessage imsg, [Remainder] string number = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            int num = 0;
 | 
			
		||||
            int.TryParse(number, out num);
 | 
			
		||||
@@ -97,9 +97,9 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task ListWar(IMessage imsg, [Remainder] string number)
 | 
			
		||||
        public async Task ListWar(IMessage imsg, [Remainder] string number = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            // if number is null, print all wars in a short way
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(number))
 | 
			
		||||
@@ -140,9 +140,9 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Claim(IMessage imsg, int number, int baseNumber, [Remainder] string other_name)
 | 
			
		||||
        public async Task Claim(IMessage imsg, int number, int baseNumber, [Remainder] string other_name = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            var warsInfo = GetWarInfo(imsg, number);
 | 
			
		||||
            if (warsInfo == null || warsInfo.Item1.Count == 0)
 | 
			
		||||
            {
 | 
			
		||||
@@ -167,25 +167,25 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task ClaimFinish1(IMessage imsg, int number, int baseNumber, [Remainder] string other_name)
 | 
			
		||||
        public async Task ClaimFinish1(IMessage imsg, int number, int baseNumber, [Remainder] string other_name = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            await FinishClaim(imsg, number, baseNumber, other_name, 1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task ClaimFinish2(IMessage imsg, int number, int baseNumber, [Remainder] string other_name)
 | 
			
		||||
        public async Task ClaimFinish2(IMessage imsg, int number, int baseNumber, [Remainder] string other_name = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            await FinishClaim(imsg, number, baseNumber, other_name, 2);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task ClaimFinish(IMessage imsg, int number, int baseNumber, [Remainder] string other_name)
 | 
			
		||||
        public async Task ClaimFinish(IMessage imsg, int number, int baseNumber, [Remainder] string other_name = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            await FinishClaim(imsg, number, baseNumber, other_name);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -193,7 +193,7 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task EndWar(IMessage imsg, int number)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            var warsInfo = GetWarInfo(imsg,number);
 | 
			
		||||
            if (warsInfo == null)
 | 
			
		||||
@@ -210,9 +210,9 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Unclaim(IMessage imsg, int number, [Remainder] string otherName)
 | 
			
		||||
        public async Task Unclaim(IMessage imsg, int number, [Remainder] string otherName = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            var warsInfo = GetWarInfo(imsg, number);
 | 
			
		||||
            if (warsInfo == null || warsInfo.Item1.Count == 0)
 | 
			
		||||
@@ -238,7 +238,7 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
 | 
			
		||||
        private async Task FinishClaim(IMessage imsg, int number, int baseNumber, [Remainder] string other_name, int stars = 3)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            var warInfo = GetWarInfo(imsg, number);
 | 
			
		||||
            if (warInfo == null || warInfo.Item1.Count == 0)
 | 
			
		||||
            {
 | 
			
		||||
@@ -264,7 +264,7 @@ namespace NadekoBot.Modules.ClashOfClans
 | 
			
		||||
 | 
			
		||||
        private static Tuple<List<ClashWar>, int> GetWarInfo(IMessage imsg, int num)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            //check if there are any wars
 | 
			
		||||
            List<ClashWar> wars = null;
 | 
			
		||||
            ClashWars.TryGetValue(channel.Guild.Id, out wars);
 | 
			
		||||
 
 | 
			
		||||
@@ -14,9 +14,9 @@ namespace NadekoBot.Modules.Games.Commands
 | 
			
		||||
    {
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Leet(IMessage imsg, int level, [Remainder] string text)
 | 
			
		||||
        public async Task Leet(IMessage imsg, int level, [Remainder] string text = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            text = text.Trim();
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(text))
 | 
			
		||||
 
 | 
			
		||||
@@ -18,9 +18,9 @@ namespace NadekoBot.Modules.Games.Commands
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Poll(IMessage imsg, [Remainder] string arg)
 | 
			
		||||
        public async Task Poll(IMessage imsg, [Remainder] string arg = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (!(imsg.Author as IGuildUser).GuildPermissions.ManageChannels)
 | 
			
		||||
                return;
 | 
			
		||||
@@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Games.Commands
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Pollend(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (!(imsg.Author as IGuildUser).GuildPermissions.ManageChannels)
 | 
			
		||||
                return;
 | 
			
		||||
 
 | 
			
		||||
@@ -107,7 +107,7 @@ namespace NadekoBot.Modules.Games.Commands.Trivia
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (!(imsg.Channel is IGuildChannel && imsg.Channel is ITextChannel)) return;
 | 
			
		||||
                if ((imsg.Channel as IGuildChannel).Guild != guild) return;
 | 
			
		||||
                if ((imsg.Channel as ITextChannel).Guild != guild) return;
 | 
			
		||||
                if (imsg.Author.Id == (await NadekoBot.Client.GetCurrentUserAsync()).Id) return;
 | 
			
		||||
 | 
			
		||||
                var guildUser = imsg.Author as IGuildUser;
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ namespace NadekoBot.Modules.Games.Commands
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Trivia(IMessage imsg, string[] args)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
                var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
                TriviaGame trivia;
 | 
			
		||||
                if (!RunningTrivias.TryGetValue(channel.Guild.Id, out trivia))
 | 
			
		||||
@@ -48,7 +48,7 @@ namespace NadekoBot.Modules.Games.Commands
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Tl(IMessage imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
                var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
                TriviaGame trivia;
 | 
			
		||||
                if (RunningTrivias.TryGetValue(channel.Guild.Id, out trivia))
 | 
			
		||||
@@ -61,7 +61,7 @@ namespace NadekoBot.Modules.Games.Commands
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Tq(IMessage imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
                var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
                TriviaGame trivia;
 | 
			
		||||
                if (RunningTrivias.TryRemove(channel.Guild.Id, out trivia))
 | 
			
		||||
 
 | 
			
		||||
@@ -21,9 +21,9 @@ namespace NadekoBot.Modules.Games
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Choose(IMessage imsg, [Remainder] string list)
 | 
			
		||||
        public async Task Choose(IMessage imsg, [Remainder] string list = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(list))
 | 
			
		||||
                return;
 | 
			
		||||
            var listArr = list.Split(';');
 | 
			
		||||
@@ -35,9 +35,9 @@ namespace NadekoBot.Modules.Games
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task _8Ball(IMessage imsg, [Remainder] string question)
 | 
			
		||||
        public async Task _8Ball(IMessage imsg, [Remainder] string question = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(question))
 | 
			
		||||
                return;
 | 
			
		||||
@@ -50,7 +50,7 @@ namespace NadekoBot.Modules.Games
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Rps(IMessage imsg, string input)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            Func<int,string> GetRPSPick = (p) =>
 | 
			
		||||
            {
 | 
			
		||||
@@ -100,7 +100,7 @@ namespace NadekoBot.Modules.Games
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Linux(IMessage imsg, string guhnoo, string loonix)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            await imsg.Channel.SendMessageAsync(
 | 
			
		||||
$@"I'd just like to interject for moment. What you're refering to as {loonix}, is in fact, {guhnoo}/{loonix}, or as I've recently taken to calling it, {guhnoo} plus {loonix}. {loonix} is not an operating system unto itself, but rather another free component of a fully functioning {guhnoo} system made useful by the {guhnoo} corelibs, shell utilities and vital system components comprising a full OS as defined by POSIX.
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ namespace NadekoBot.Modules.Help
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Modules(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            await imsg.Channel.SendMessageAsync("`List of modules:` \n• " + string.Join("\n• ", _commands.Modules.Select(m => m.Name)) + $"\n`Type \"-commands module_name\" to get a list of commands in that module.`")
 | 
			
		||||
                                       .ConfigureAwait(false);
 | 
			
		||||
@@ -36,9 +36,9 @@ namespace NadekoBot.Modules.Help
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Commands(IMessage imsg, [Remainder] string module)
 | 
			
		||||
        public async Task Commands(IMessage imsg, [Remainder] string module = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            module = module?.Trim().ToUpperInvariant();
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(module))
 | 
			
		||||
@@ -66,9 +66,9 @@ namespace NadekoBot.Modules.Help
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Help(IMessage imsg, [Remainder] string comToFind)
 | 
			
		||||
        public async Task Help(IMessage imsg, [Remainder] string comToFind = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            comToFind = comToFind?.ToLowerInvariant();
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(comToFind))
 | 
			
		||||
@@ -116,7 +116,7 @@ namespace NadekoBot.Modules.Help
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Guide(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            await imsg.Channel.SendMessageAsync(
 | 
			
		||||
@"**LIST OF COMMANDS**: <http://nadekobot.readthedocs.io/en/latest/Commands%20List/>
 | 
			
		||||
@@ -127,7 +127,7 @@ namespace NadekoBot.Modules.Help
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Donate(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            await imsg.Channel.SendMessageAsync(
 | 
			
		||||
$@"You can support the project on patreon. <https://patreon.com/nadekobot> or
 | 
			
		||||
 
 | 
			
		||||
@@ -21,9 +21,9 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Hentai(IMessage imsg, [Remainder] string tag)
 | 
			
		||||
        public async Task Hentai(IMessage imsg, [Remainder] string tag = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            tag = tag?.Trim() ?? "";
 | 
			
		||||
 | 
			
		||||
@@ -40,9 +40,9 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Danbooru(IMessage imsg, [Remainder] string tag)
 | 
			
		||||
        public async Task Danbooru(IMessage imsg, [Remainder] string tag = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            tag = tag?.Trim() ?? "";
 | 
			
		||||
            var link = await GetDanbooruImageLink(tag).ConfigureAwait(false);
 | 
			
		||||
@@ -54,9 +54,9 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Gelbooru(IMessage imsg, [Remainder] string tag)
 | 
			
		||||
        public async Task Gelbooru(IMessage imsg, [Remainder] string tag = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            tag = tag?.Trim() ?? "";
 | 
			
		||||
            var link = await GetRule34ImageLink(tag).ConfigureAwait(false);
 | 
			
		||||
@@ -68,9 +68,9 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Rule34(IMessage imsg, [Remainder] string tag)
 | 
			
		||||
        public async Task Rule34(IMessage imsg, [Remainder] string tag = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            tag = tag?.Trim() ?? "";
 | 
			
		||||
            var link = await GetGelbooruImageLink(tag).ConfigureAwait(false);
 | 
			
		||||
@@ -82,9 +82,9 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task E621(IMessage imsg, [Remainder] string tag)
 | 
			
		||||
        public async Task E621(IMessage imsg, [Remainder] string tag = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            tag = tag?.Trim() ?? "";
 | 
			
		||||
            var link = await GetE621ImageLink(tag).ConfigureAwait(false);
 | 
			
		||||
@@ -98,7 +98,7 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Cp(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            await imsg.Channel.SendMessageAsync("http://i.imgur.com/MZkY1md.jpg").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
@@ -107,7 +107,7 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Boobs(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                JToken obj;
 | 
			
		||||
@@ -127,7 +127,7 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Butts(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ namespace NadekoBot.Modules.Games.Commands
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Poke(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -13,9 +13,9 @@
 | 
			
		||||
//    {
 | 
			
		||||
//        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
//        [RequireContext(ContextType.Guild)]
 | 
			
		||||
//        public async Task Anime(IMessage imsg, [Remainder] string query)
 | 
			
		||||
//        public async Task Anime(IMessage imsg, [Remainder] string query = null)
 | 
			
		||||
//        {
 | 
			
		||||
//            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
//            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
//            if (!(await ValidateQuery(imsg.Channel as ITextChannel, query).ConfigureAwait(false))) return;
 | 
			
		||||
//            string result;
 | 
			
		||||
@@ -34,9 +34,9 @@
 | 
			
		||||
 | 
			
		||||
//        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
//        [RequireContext(ContextType.Guild)]
 | 
			
		||||
//        public async Task Manga(IMessage imsg, [Remainder] string query)
 | 
			
		||||
//        public async Task Manga(IMessage imsg, [Remainder] string query = null)
 | 
			
		||||
//        {
 | 
			
		||||
//            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
//            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
//            if (!(await ValidateQuery(imsg.Channel as ITextChannel, query).ConfigureAwait(false))) return;
 | 
			
		||||
//            string result;
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,7 @@ namespace NadekoBot.Modules.Searches.Commands.IMDB
 | 
			
		||||
                mov.Status = true;
 | 
			
		||||
                mov.Title = match(@"<title>(IMDb \- )*(.*?) \(.*?</title>", html, 2);
 | 
			
		||||
                mov.OriginalTitle = match(@"title-extra"">(.*?)<", html);
 | 
			
		||||
                mov.Year = match(@"<title>.*?\(.*?(\d{4}).*?\).*?</title>", match(@"(<title>.*?</title>)", html));
 | 
			
		||||
                mov.Year = match(@"<title>.*?\(.*?(\d{4}).*?).*?</title>", match(@"(<title>.*?</title>)", html));
 | 
			
		||||
                mov.Rating = match(@"<b>(\d.\d)/10</b>", html);
 | 
			
		||||
                mov.Genres = MatchAll(@"<a.*?>(.*?)</a>", match(@"Genre.?:(.*?)(</div>|See more)", html)).Cast<string>().ToList();
 | 
			
		||||
                mov.Plot = match(@"Plot:</h5>.*?<div class=""info-content"">(.*?)(<a|</div)", html);
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ namespace NadekoBot.Modules.Searches.Commands
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Yomama(IMessage imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
                var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
                using (var http = new HttpClient())
 | 
			
		||||
                {
 | 
			
		||||
                    var response = await http.GetStringAsync("http://api.yomomma.info/").ConfigureAwait(false);
 | 
			
		||||
@@ -44,7 +44,7 @@ namespace NadekoBot.Modules.Searches.Commands
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Randjoke(IMessage imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
                var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
                using (var http = new HttpClient())
 | 
			
		||||
                {
 | 
			
		||||
                    var response = await http.GetStringAsync("http://tambal.azurewebsites.net/joke/random").ConfigureAwait(false);
 | 
			
		||||
@@ -56,7 +56,7 @@ namespace NadekoBot.Modules.Searches.Commands
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task ChuckNorris(IMessage imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
                var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
                using (var http = new HttpClient())
 | 
			
		||||
                {
 | 
			
		||||
                    var response = await http.GetStringAsync("http://tambal.azurewebsites.net/joke/random").ConfigureAwait(false);
 | 
			
		||||
@@ -68,7 +68,7 @@ namespace NadekoBot.Modules.Searches.Commands
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task WowJoke(IMessage imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
                var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
                if (!wowJokes.Any())
 | 
			
		||||
                {
 | 
			
		||||
@@ -80,7 +80,7 @@ namespace NadekoBot.Modules.Searches.Commands
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task MagicItem(IMessage imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
                var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
                var rng = new Random();
 | 
			
		||||
                var item = magicItems[rng.Next(0, magicItems.Count)].ToString();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ namespace NadekoBot.Modules.Searches.Commands
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Memelist(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            using (var http = new HttpClient())
 | 
			
		||||
            {
 | 
			
		||||
                var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(await http.GetStringAsync("http://memegen.link/templates/"))
 | 
			
		||||
@@ -37,7 +37,7 @@ namespace NadekoBot.Modules.Searches.Commands
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Memegen(IMessage imsg, string meme, string topText, string botText)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            var top = Uri.EscapeDataString(topText.Replace(' ', '-'));
 | 
			
		||||
            var bot = Uri.EscapeDataString(botText.Replace(' ', '-'));
 | 
			
		||||
 
 | 
			
		||||
@@ -26,9 +26,9 @@ namespace NadekoBot.Modules.Searches.Commands
 | 
			
		||||
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task Pokemon(IMessage imsg, [Remainder] string pokemon)
 | 
			
		||||
            public async Task Pokemon(IMessage imsg, [Remainder] string pokemon = null)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
                var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
                pokemon = pokemon?.Trim().ToUpperInvariant();
 | 
			
		||||
                if (string.IsNullOrWhiteSpace(pokemon))
 | 
			
		||||
@@ -47,9 +47,9 @@ namespace NadekoBot.Modules.Searches.Commands
 | 
			
		||||
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task PokemonAbility(IMessage imsg, [Remainder] string ability)
 | 
			
		||||
            public async Task PokemonAbility(IMessage imsg, [Remainder] string ability = null)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
                var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
                ability = ability?.Trim().ToUpperInvariant().Replace(" ", "");
 | 
			
		||||
                if (string.IsNullOrWhiteSpace(ability))
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ namespace NadekoBot.Modules.Searches
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Weather(IMessage imsg, string city, string country)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            city = city.Replace(" ", "");
 | 
			
		||||
            country = city.Replace(" ", "");
 | 
			
		||||
            string response;
 | 
			
		||||
@@ -52,9 +52,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Youtube(IMessage imsg, [Remainder] string query)
 | 
			
		||||
        public async Task Youtube(IMessage imsg, [Remainder] string query = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            if (!(await ValidateQuery(imsg.Channel as ITextChannel, query).ConfigureAwait(false))) return;
 | 
			
		||||
            var result = (await _yt.FindVideosByKeywordsAsync(query, 1)).FirstOrDefault();
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(result))
 | 
			
		||||
@@ -68,9 +68,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Imdb(IMessage imsg, [Remainder] string query)
 | 
			
		||||
        public async Task Imdb(IMessage imsg, [Remainder] string query = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (!(await ValidateQuery(imsg.Channel as ITextChannel, query).ConfigureAwait(false))) return;
 | 
			
		||||
            await imsg.Channel.TriggerTypingAsync().ConfigureAwait(false);
 | 
			
		||||
@@ -94,7 +94,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task RandomCat(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            using (var http = new HttpClient())
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync(JObject.Parse(
 | 
			
		||||
@@ -107,7 +107,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task RandomDog(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            using (var http = new HttpClient())
 | 
			
		||||
            {
 | 
			
		||||
                await imsg.Channel.SendMessageAsync("http://random.dog/" + await http.GetStringAsync("http://random.dog/woof").ConfigureAwait(false)).ConfigureAwait(false);
 | 
			
		||||
@@ -116,9 +116,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task I(IMessage imsg, [Remainder] string query)
 | 
			
		||||
        public async Task I(IMessage imsg, [Remainder] string query = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(query))
 | 
			
		||||
                return;
 | 
			
		||||
@@ -146,9 +146,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Ir(IMessage imsg, [Remainder] string query)
 | 
			
		||||
        public async Task Ir(IMessage imsg, [Remainder] string query = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(query))
 | 
			
		||||
                return;
 | 
			
		||||
@@ -177,9 +177,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Lmgtfy(IMessage imsg, [Remainder] string ffs)
 | 
			
		||||
        public async Task Lmgtfy(IMessage imsg, [Remainder] string ffs = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(ffs))
 | 
			
		||||
@@ -191,9 +191,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Google(IMessage imsg, [Remainder] string terms)
 | 
			
		||||
        public async Task Google(IMessage imsg, [Remainder] string terms = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            terms = terms?.Trim();
 | 
			
		||||
@@ -205,9 +205,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
        ////todo drawing
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Hearthstone(IMessage imsg, [Remainder] string name)
 | 
			
		||||
        //public async Task Hearthstone(IMessage imsg, [Remainder] string name = null)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
        //    var arg = e.GetArg("name");
 | 
			
		||||
        //    if (string.IsNullOrWhiteSpace(arg))
 | 
			
		||||
        //    {
 | 
			
		||||
@@ -250,9 +250,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task UrbanDictionary(IMessage imsg, [Remainder] string query)
 | 
			
		||||
        public async Task UrbanDictionary(IMessage imsg, [Remainder] string query = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            var arg = query;
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(arg))
 | 
			
		||||
@@ -284,9 +284,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Hashtag(IMessage imsg, [Remainder] string query)
 | 
			
		||||
        public async Task Hashtag(IMessage imsg, [Remainder] string query = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            var arg = query;
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(arg))
 | 
			
		||||
@@ -321,7 +321,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Quote(IMessage imsg)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //    var quote = NadekoBot.Config.Quotes[rng.Next(0, NadekoBot.Config.Quotes.Count)].ToString();
 | 
			
		||||
        //    await imsg.Channel.SendMessageAsync(quote).ConfigureAwait(false);
 | 
			
		||||
@@ -331,7 +331,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Catfact(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            using (var http = new HttpClient())
 | 
			
		||||
            {
 | 
			
		||||
                var response = await http.GetStringAsync("http://catfacts-api.appspot.com/api/facts").ConfigureAwait(false);
 | 
			
		||||
@@ -343,9 +343,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Revav(IMessage imsg, [Remainder] string arg)
 | 
			
		||||
        public async Task Revav(IMessage imsg, [Remainder] string arg = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            var usrStr = arg?.Trim().ToUpperInvariant();
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(usrStr))
 | 
			
		||||
@@ -360,9 +360,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Revimg(IMessage imsg, [Remainder] string imageLink)
 | 
			
		||||
        public async Task Revimg(IMessage imsg, [Remainder] string imageLink = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            imageLink = imageLink?.Trim() ?? "";
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(imageLink))
 | 
			
		||||
@@ -372,9 +372,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Safebooru(IMessage imsg, [Remainder] string tag)
 | 
			
		||||
        public async Task Safebooru(IMessage imsg, [Remainder] string tag = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            tag = tag?.Trim() ?? "";
 | 
			
		||||
            var link = await GetSafebooruImageLink(tag).ConfigureAwait(false);
 | 
			
		||||
@@ -386,9 +386,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Wiki(IMessage imsg, [Remainder] string query)
 | 
			
		||||
        public async Task Wiki(IMessage imsg, [Remainder] string query = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            query = query?.Trim();
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(query))
 | 
			
		||||
@@ -407,9 +407,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
        ////todo drawing
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Clr(IMessage imsg, [Remainder] string color)
 | 
			
		||||
        //public async Task Clr(IMessage imsg, [Remainder] string color = null)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
        //    var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
        //    color = color?.Trim().Replace("#", "");
 | 
			
		||||
        //    if (string.IsNullOrWhiteSpace((string)color))
 | 
			
		||||
@@ -432,9 +432,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Videocall(IMessage imsg, [Remainder] string arg)
 | 
			
		||||
        public async Task Videocall(IMessage imsg, [Remainder] string arg = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
@@ -455,9 +455,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Avatar(IMessage imsg, [Remainder] string mention)
 | 
			
		||||
        public async Task Avatar(IMessage imsg, [Remainder] string mention = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            var usr = imsg.MentionedUsers.FirstOrDefault();
 | 
			
		||||
            if (usr == null)
 | 
			
		||||
 
 | 
			
		||||
@@ -17,9 +17,9 @@ namespace NadekoBot.Modules.Translator
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Translate(IMessage imsg, string langs, [Remainder] string text)
 | 
			
		||||
        public async Task Translate(IMessage imsg, string langs, [Remainder] string text = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
@@ -47,7 +47,7 @@ namespace NadekoBot.Modules.Translator
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Translangs(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
 | 
			
		||||
            await imsg.Channel.SendTableAsync(GoogleTranslator.Instance.Languages, str => str, columns: 4);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ namespace NadekoBot.Modules.Utility
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task ServerInfo(IMessage msg, string guild = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = msg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = msg.Channel as ITextChannel;
 | 
			
		||||
            guild = guild?.ToUpperInvariant();
 | 
			
		||||
            IGuild server;
 | 
			
		||||
            if (guild == null)
 | 
			
		||||
@@ -66,7 +66,7 @@ namespace NadekoBot.Modules.Utility
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task UserInfo(IMessage msg, IGuildUser usr = null)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = msg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = msg.Channel as ITextChannel;
 | 
			
		||||
            var user = usr ?? msg.Author as IGuildUser;
 | 
			
		||||
            if (user == null)
 | 
			
		||||
                return;
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ namespace NadekoBot.Modules.Utility
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task WhoPlays(IMessage imsg, [Remainder] string game)
 | 
			
		||||
        public async Task WhoPlays(IMessage imsg, [Remainder] string game = null)
 | 
			
		||||
        {
 | 
			
		||||
            var chnl = (IGuildChannel)imsg.Channel;
 | 
			
		||||
            game = game.Trim().ToUpperInvariant();
 | 
			
		||||
@@ -44,11 +44,11 @@ namespace NadekoBot.Modules.Utility
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task InRole(IMessage imsg, [Remainder] string roles)
 | 
			
		||||
        public async Task InRole(IMessage imsg, [Remainder] string roles = null)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(roles))
 | 
			
		||||
                return;
 | 
			
		||||
            var channel = imsg.Channel as IGuildChannel;
 | 
			
		||||
            var channel = imsg.Channel as ITextChannel;
 | 
			
		||||
            var arg = roles.Split(',').Select(r => r.Trim().ToUpperInvariant());
 | 
			
		||||
            string send = _l["`Here is a list of users in a specfic role:`"];
 | 
			
		||||
            foreach (var roleStr in arg.Where(str => !string.IsNullOrWhiteSpace(str) && str != "@EVERYONE" && str != "EVERYONE"))
 | 
			
		||||
@@ -110,21 +110,21 @@ namespace NadekoBot.Modules.Utility
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task ServerId(IMessage msg)
 | 
			
		||||
        {
 | 
			
		||||
            await msg.Reply($"This server's ID is {(msg.Channel as IGuildChannel).Guild.Id}");
 | 
			
		||||
            await msg.Reply($"This server's ID is {(msg.Channel as ITextChannel).Guild.Id}");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Roles(IMessage msg, IGuildUser target = null)
 | 
			
		||||
        {
 | 
			
		||||
            var guild = (msg.Channel as IGuildChannel).Guild;
 | 
			
		||||
            var guild = (msg.Channel as ITextChannel).Guild;
 | 
			
		||||
            if (target != null)
 | 
			
		||||
            {
 | 
			
		||||
                await msg.Reply($"`List of roles for **{target.Username}**:` \n• " + string.Join("\n• ", target.Roles.Except(new[] { guild.EveryoneRole })));
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                await msg.Reply("`List of roles:` \n• " + string.Join("\n• ", (msg.Channel as IGuildChannel).Guild.Roles.Except(new[] { guild.EveryoneRole })));
 | 
			
		||||
                await msg.Reply("`List of roles:` \n• " + string.Join("\n• ", (msg.Channel as ITextChannel).Guild.Roles.Except(new[] { guild.EveryoneRole })));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ namespace NadekoBot
 | 
			
		||||
        private async Task Client_MessageReceived(IMessage arg)
 | 
			
		||||
        {
 | 
			
		||||
                var t = await Commands.Execute(arg, 0);
 | 
			
		||||
                if(!t.IsSuccess)
 | 
			
		||||
                if(!t.IsSuccess && t.Error != CommandError.UnknownCommand)
 | 
			
		||||
                    Console.WriteLine(t.ErrorReason);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -3,13 +3,14 @@ using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Services.Impl
 | 
			
		||||
{
 | 
			
		||||
    //todo load creds
 | 
			
		||||
    public class BotCredentials : IBotCredentials
 | 
			
		||||
    {
 | 
			
		||||
        public string ClientId { get; }
 | 
			
		||||
 | 
			
		||||
        public string GoogleApiKey {
 | 
			
		||||
            get {
 | 
			
		||||
                throw new NotImplementedException();
 | 
			
		||||
                return "";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -17,7 +18,7 @@ namespace NadekoBot.Services.Impl
 | 
			
		||||
 | 
			
		||||
        public string Token {
 | 
			
		||||
            get {
 | 
			
		||||
                throw new NotImplementedException();
 | 
			
		||||
                return "";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -13,12 +13,25 @@ namespace NadekoBot.Extensions
 | 
			
		||||
{
 | 
			
		||||
    public static class Extensions
 | 
			
		||||
    {
 | 
			
		||||
        public static async Task<IMessage> Reply(this IMessage msg, string content) => await msg.Channel.SendMessageAsync(content);
 | 
			
		||||
        public static async Task<IMessage> SendMessageAsync(this IGuildUser user, string message, bool isTTS = false) =>
 | 
			
		||||
            await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendMessageAsync(message, isTTS).ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
        public static async Task<IMessage> SendFileAsync(this IGuildUser user, string filePath, string caption = null, bool isTTS = false) =>
 | 
			
		||||
            await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(filePath, caption, isTTS).ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
        public static async Task<IMessage> SendFileAsync(this IGuildUser user, Stream fileStream, string fileName, string caption = null, bool isTTS = false) =>
 | 
			
		||||
            await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(fileStream, fileName, caption, isTTS).ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
        public static async Task<IMessage> Reply(this IMessage msg, string content) => 
 | 
			
		||||
            await msg.Channel.SendMessageAsync(content).ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
        public static async Task<IEnumerable<IUser>> Members(this IRole role) =>
 | 
			
		||||
            await role.Members();
 | 
			
		||||
 | 
			
		||||
        public static async Task<IMessage[]> ReplyLong(this IMessage msg, string content, string breakOn = "\n", string addToEnd = "", string addToStart = "")
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            if (content.Length < 2000) return new[] { await msg.Channel.SendMessageAsync(content) };
 | 
			
		||||
            if (content.Length < 2000) return new[] { await msg.Channel.SendMessageAsync(content).ConfigureAwait(false) };
 | 
			
		||||
            var list = new List<IMessage>();
 | 
			
		||||
 | 
			
		||||
            var temp = Regex.Split(content, breakOn).Select(x => x += breakOn).ToList();
 | 
			
		||||
@@ -204,6 +217,17 @@ namespace NadekoBot.Extensions
 | 
			
		||||
            return d[n, m];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<Stream> ToStream(this string str)
 | 
			
		||||
        {
 | 
			
		||||
            var ms = new MemoryStream();
 | 
			
		||||
            var sw = new StreamWriter(ms);
 | 
			
		||||
            await sw.WriteAsync(str);
 | 
			
		||||
            await sw.FlushAsync();
 | 
			
		||||
            ms.Position = 0;
 | 
			
		||||
            return ms;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static int KiB(this int value) => value * 1024;
 | 
			
		||||
        public static int KB(this int value) => value * 1000;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -339,7 +339,7 @@
 | 
			
		||||
      "Microsoft.NETCore.Jit/1.0.2": {
 | 
			
		||||
        "type": "package"
 | 
			
		||||
      },
 | 
			
		||||
      "Microsoft.NETCore.Platforms/1.0.2-beta-24410-01": {
 | 
			
		||||
      "Microsoft.NETCore.Platforms/1.0.1": {
 | 
			
		||||
        "type": "package",
 | 
			
		||||
        "compile": {
 | 
			
		||||
          "lib/netstandard1.0/_._": {}
 | 
			
		||||
@@ -1353,11 +1353,7 @@
 | 
			
		||||
          "ref/netstandard1.3/System.Net.Security.dll": {}
 | 
			
		||||
        },
 | 
			
		||||
        "runtimeTargets": {
 | 
			
		||||
          "runtimes/unix/lib/netstandard1.6/System.Net.Security.dll": {
 | 
			
		||||
            "assetType": "runtime",
 | 
			
		||||
            "rid": "unix"
 | 
			
		||||
          },
 | 
			
		||||
          "runtimes/win/lib/netstandard1.3/System.Net.Security.dll": {
 | 
			
		||||
          "runtimes/win/lib/netstandard1.3/_._": {
 | 
			
		||||
            "assetType": "runtime",
 | 
			
		||||
            "rid": "win"
 | 
			
		||||
          }
 | 
			
		||||
@@ -1407,20 +1403,16 @@
 | 
			
		||||
          "lib/netstandard1.3/System.Net.WebSockets.dll": {}
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      "System.Net.WebSockets.Client/4.0.1-beta-24410-01": {
 | 
			
		||||
      "System.Net.WebSockets.Client/4.0.0": {
 | 
			
		||||
        "type": "package",
 | 
			
		||||
        "dependencies": {
 | 
			
		||||
          "Microsoft.NETCore.Platforms": "1.0.2-beta-24410-01",
 | 
			
		||||
          "Microsoft.NETCore.Platforms": "1.0.1",
 | 
			
		||||
          "Microsoft.Win32.Primitives": "4.0.1",
 | 
			
		||||
          "System.Collections": "4.0.11",
 | 
			
		||||
          "System.Diagnostics.Debug": "4.0.11",
 | 
			
		||||
          "System.Diagnostics.Tracing": "4.1.0",
 | 
			
		||||
          "System.Globalization": "4.0.11",
 | 
			
		||||
          "System.IO": "4.1.0",
 | 
			
		||||
          "System.Net.NameResolution": "4.0.0",
 | 
			
		||||
          "System.Net.Primitives": "4.0.11",
 | 
			
		||||
          "System.Net.Security": "4.0.0",
 | 
			
		||||
          "System.Net.Sockets": "4.1.0",
 | 
			
		||||
          "System.Net.WebHeaderCollection": "4.0.1",
 | 
			
		||||
          "System.Net.WebSockets": "4.0.0",
 | 
			
		||||
          "System.Resources.ResourceManager": "4.0.1",
 | 
			
		||||
@@ -1428,14 +1420,10 @@
 | 
			
		||||
          "System.Runtime.Extensions": "4.1.0",
 | 
			
		||||
          "System.Runtime.Handles": "4.0.1",
 | 
			
		||||
          "System.Runtime.InteropServices": "4.1.0",
 | 
			
		||||
          "System.Security.Cryptography.Algorithms": "4.2.0",
 | 
			
		||||
          "System.Security.Cryptography.Primitives": "4.0.0",
 | 
			
		||||
          "System.Security.Cryptography.X509Certificates": "4.1.0",
 | 
			
		||||
          "System.Text.Encoding": "4.0.11",
 | 
			
		||||
          "System.Text.Encoding.Extensions": "4.0.11",
 | 
			
		||||
          "System.Threading": "4.0.11",
 | 
			
		||||
          "System.Threading.Tasks": "4.0.11",
 | 
			
		||||
          "System.Threading.Timer": "4.0.1"
 | 
			
		||||
          "System.Threading.Tasks": "4.0.11"
 | 
			
		||||
        },
 | 
			
		||||
        "compile": {
 | 
			
		||||
          "ref/netstandard1.3/System.Net.WebSockets.Client.dll": {}
 | 
			
		||||
@@ -2374,7 +2362,7 @@
 | 
			
		||||
          "System.Net.Http": "4.1.0",
 | 
			
		||||
          "System.Net.NameResolution": "4.0.0",
 | 
			
		||||
          "System.Net.Sockets": "4.1.0",
 | 
			
		||||
          "System.Net.WebSockets.Client": "4.0.1-beta-24410-01",
 | 
			
		||||
          "System.Net.WebSockets.Client": "4.0.0",
 | 
			
		||||
          "System.Reflection.Extensions": "4.0.1",
 | 
			
		||||
          "System.Runtime.InteropServices": "4.1.0",
 | 
			
		||||
          "System.Runtime.InteropServices.RuntimeInformation": "4.0.0",
 | 
			
		||||
@@ -2758,12 +2746,12 @@
 | 
			
		||||
        "runtime.json"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    "Microsoft.NETCore.Platforms/1.0.2-beta-24410-01": {
 | 
			
		||||
      "sha512": "uc/pGYdE4sVy3OovFF8hg79MvCxptzICxn0jdA6WusGWZa7VieqFoZYc+a6bHUVhMI0s/7SfBriux0RUq+PpbA==",
 | 
			
		||||
    "Microsoft.NETCore.Platforms/1.0.1": {
 | 
			
		||||
      "sha512": "2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
 | 
			
		||||
      "type": "package",
 | 
			
		||||
      "path": "Microsoft.NETCore.Platforms/1.0.2-beta-24410-01",
 | 
			
		||||
      "path": "Microsoft.NETCore.Platforms/1.0.1",
 | 
			
		||||
      "files": [
 | 
			
		||||
        "Microsoft.NETCore.Platforms.1.0.2-beta-24410-01.nupkg.sha512",
 | 
			
		||||
        "Microsoft.NETCore.Platforms.1.0.1.nupkg.sha512",
 | 
			
		||||
        "Microsoft.NETCore.Platforms.nuspec",
 | 
			
		||||
        "ThirdPartyNotices.txt",
 | 
			
		||||
        "dotnet_library_license.txt",
 | 
			
		||||
@@ -5109,12 +5097,12 @@
 | 
			
		||||
        "ref/xamarinwatchos10/_._"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    "System.Net.WebSockets.Client/4.0.1-beta-24410-01": {
 | 
			
		||||
      "sha512": "IOqAcR7k+3LwNI6aL7qN61HcCOA9X4MM9LbrZhDeNbeB/IeWTk7zpeb7kh3d7H678s7ndIqN6a7okO8dAAfcYQ==",
 | 
			
		||||
    "System.Net.WebSockets.Client/4.0.0": {
 | 
			
		||||
      "sha512": "GY5h9cn0ZVsG4ORQqMytTldrqxet2RC2CSEsgWGf4XNW5jhL5SxzcUZph03xbZsgn7K3qMr+Rq+gkbJNI+FEXg==",
 | 
			
		||||
      "type": "package",
 | 
			
		||||
      "path": "System.Net.WebSockets.Client/4.0.1-beta-24410-01",
 | 
			
		||||
      "path": "System.Net.WebSockets.Client/4.0.0",
 | 
			
		||||
      "files": [
 | 
			
		||||
        "System.Net.WebSockets.Client.4.0.1-beta-24410-01.nupkg.sha512",
 | 
			
		||||
        "System.Net.WebSockets.Client.4.0.0.nupkg.sha512",
 | 
			
		||||
        "System.Net.WebSockets.Client.nuspec",
 | 
			
		||||
        "ThirdPartyNotices.txt",
 | 
			
		||||
        "dotnet_library_license.txt",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user