A lot of work on administration module
This commit is contained in:
		
							
								
								
									
										765
									
								
								src/NadekoBot/Modules/Administration/AdministrationModule.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										765
									
								
								src/NadekoBot/Modules/Administration/AdministrationModule.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,765 @@ | ||||
| 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; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Attributes; | ||||
|  | ||||
| //todo fix delmsgoncmd | ||||
| //todo DB | ||||
| namespace NadekoBot.Modules.Administration | ||||
| { | ||||
|     [Module(".", AppendSpace = false)] | ||||
|     public partial class AdministrationModule : DiscordModule | ||||
|     { | ||||
|         public AdministrationModule(ILocalization loc, CommandService cmds, IBotConfiguration config, IDiscordClient client) : base(loc, cmds, config, client) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         //todo owner only | ||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task Restart(IMessage imsg) | ||||
|         //{ | ||||
|         //    var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|         //    await imsg.Channel.SendMessageAsync("`Restarting in 2 seconds...`"); | ||||
|         //    await Task.Delay(2000); | ||||
|         //    System.Diagnostics.Process.Start(System.Reflection.Assembly.GetEntryAssembly().Location); | ||||
|         //    Environment.Exit(0); | ||||
|         //} | ||||
|  | ||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //[RequirePermission(GuildPermission.ManageGuild)] | ||||
|         //public async Task Delmsgoncmd(IMessage imsg) | ||||
|         //{ | ||||
|         //    var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|         //    var conf = SpecificConfigurations.Default.Of(channel.Guild.Id); | ||||
|         //    conf.AutoDeleteMessagesOnCommand = !conf.AutoDeleteMessagesOnCommand; | ||||
|         //    await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false); | ||||
|         //    if (conf.AutoDeleteMessagesOnCommand) | ||||
|         //        await imsg.Channel.SendMessageAsync("❗`Now automatically deleting successfull command invokations.`"); | ||||
|         //    else | ||||
|         //        await imsg.Channel.SendMessageAsync("❗`Stopped automatic deletion of successfull command invokations.`"); | ||||
|         //} | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.ManageRoles)] | ||||
|         public async Task Setrole(IMessage imsg, IUser userName, [Remainder] string roleName) | ||||
|         { | ||||
|             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.AddRoles(role).ConfigureAwait(false); | ||||
|                 await imsg.Channel.SendMessageAsync($"Successfully added role **{role.Name}** to user **{usr.Name}**").ConfigureAwait(false); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Failed to add roles. Bot has insufficient permissions.\n").ConfigureAwait(false); | ||||
|                 Console.WriteLine(ex.ToString()); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.ManageRoles)] | ||||
|         public async Task Removerole(IMessage imsg, IUser userName, [Remainder] string roleName) | ||||
|         { | ||||
|             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); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.ManageRoles)] | ||||
|         public async Task RenameRole(IMessage imsg, string r1, string r2) | ||||
|         { | ||||
|             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; | ||||
|             } | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 if (roleToEdit.Position > channel.Guild.CurrentUser.Roles.Max(r => r.Position)) | ||||
|                 { | ||||
|                     await imsg.Channel.SendMessageAsync("I can't edit roles higher than my highest role.").ConfigureAwait(false); | ||||
|                     return; | ||||
|                 } | ||||
|                 await roleToEdit.Edit(r2); | ||||
|                 await imsg.Channel.SendMessageAsync("Role renamed.").ConfigureAwait(false); | ||||
|             } | ||||
|             catch (Exception) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Failed to rename role. Probably insufficient permissions.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.ManageRoles)] | ||||
|         public async Task RemoveAllRoles(IMessage imsg, [Remainder] string userName) | ||||
|         { | ||||
|             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; | ||||
|             } | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 await usr.RemoveRoles(usr.Roles.ToArray()).ConfigureAwait(false); | ||||
|                 await imsg.Channel.SendMessageAsync($"Successfully removed **all** roles from user **{usr.Name}**").ConfigureAwait(false); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.ManageRoles)] | ||||
|         public async Task CreateRole(IMessage imsg, [Remainder] string roleName) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|  | ||||
|             if (string.IsNullOrWhiteSpace(e.GetArg("role_name"))) | ||||
|                 return; | ||||
|             try | ||||
|             { | ||||
|                 var r = await channel.Guild.CreateRole(e.GetArg("role_name")).ConfigureAwait(false); | ||||
|                 await imsg.Channel.SendMessageAsync($"Successfully created role **{r.Name}**.").ConfigureAwait(false); | ||||
|             } | ||||
|             catch (Exception) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync(":warning: Unspecified error.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.ManageRoles)] | ||||
|         public async Task RoleColor(IMessage imsg, string roleName, string r="", string g="", string b="") | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             var args = e.Args.Where(s => s != string.Empty); | ||||
|  | ||||
|             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(); | ||||
|  | ||||
|             if (role == null) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("That role does not exist.").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|             try | ||||
|             { | ||||
|                 var rgb = args.Count() == 4; | ||||
|                 var arg1 = e.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); | ||||
|                 await imsg.Channel.SendMessageAsync($"Role {role.Name}'s color has been changed.").ConfigureAwait(false); | ||||
|             } | ||||
|             catch (Exception) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Error occured, most likely invalid parameters or insufficient permissions.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.BanMembers)] | ||||
|         public async Task Ban(IMessage imsg, IUser user, [Remainder] string msg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|             if (user == null) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("User not found.").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|             if (!string.IsNullOrWhiteSpace(msg)) | ||||
|             { | ||||
|                 await user.SendMessage($"**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 imsg.Channel.SendMessageAsync("Banned user " + user.Name + " Id: " + user.Id).ConfigureAwait(false); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.BanMembers)] | ||||
|         public async Task Softban(IMessage imsg, IUser user, [Remainder] string msg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|              | ||||
|             if (user == null) | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("User not found.").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|             if (!string.IsNullOrWhiteSpace(msg)) | ||||
|             { | ||||
|                 await user.SendMessage($"**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 imsg.Channel.SendMessageAsync("Soft-Banned user " + user.Username + " Id: " + user.Id).ConfigureAwait(false); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Kick(IMessage imsg, IUser user, [Remainder] string msg) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             var usr = channel.Guild.FindUsers(user).FirstOrDefault(); | ||||
|             if (usr == 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" + | ||||
|                                       $"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); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.MuteMembers)] | ||||
|         public async Task Mute(IMessage imsg, [Remainder] string throwaway) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             if (!e.Message.MentionedUsers.Any()) | ||||
|                 return; | ||||
|             try | ||||
|             { | ||||
|                 foreach (var u in e.Message.MentionedUsers) | ||||
|                 { | ||||
|                     await u.Edit(isMuted: true).ConfigureAwait(false); | ||||
|                 } | ||||
|                 await imsg.Channel.SendMessageAsync("Mute successful").ConfigureAwait(false); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Unmute(IMessage imsg, [Remainder] string throwaway) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             if (!e.Message.MentionedUsers.Any()) | ||||
|                 return; | ||||
|             try | ||||
|             { | ||||
|                 foreach (var u in e.Message.MentionedUsers) | ||||
|                 { | ||||
|                     await u.Edit(isMuted: false).ConfigureAwait(false); | ||||
|                 } | ||||
|                 await imsg.Channel.SendMessageAsync("Unmute successful").ConfigureAwait(false); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.DeafenMembers)] | ||||
|         public async Task Deafen(IMessage imsg, [Remainder] string throwaway) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             if (!e.Message.MentionedUsers.Any()) | ||||
|                 return; | ||||
|             try | ||||
|             { | ||||
|                 foreach (var u in e.Message.MentionedUsers) | ||||
|                 { | ||||
|                     await u.Edit(isDeafened: true).ConfigureAwait(false); | ||||
|                 } | ||||
|                 await imsg.Channel.SendMessageAsync("Deafen successful").ConfigureAwait(false); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); | ||||
|             } | ||||
|  | ||||
|         } | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.DeafenMembers)] | ||||
|         public async Task UnDeafen(IMessage imsg, [Remainder] string throwaway) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             if (!e.Message.MentionedUsers.Any()) | ||||
|                 return; | ||||
|             try | ||||
|             { | ||||
|                 foreach (var u in e.Message.MentionedUsers) | ||||
|                 { | ||||
|                     await u.Edit(isDeafened: false).ConfigureAwait(false); | ||||
|                 } | ||||
|                 await imsg.Channel.SendMessageAsync("Undeafen successful").ConfigureAwait(false); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 await imsg.Channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task DelVoiChanl(IMessage imsg, [Remainder] channelName) | ||||
|         { | ||||
|             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); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         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); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.ManageChannels)] | ||||
|         public async Task CreaTxtChanl(IMessage imsg, [Remainder] string arg) | ||||
|         { | ||||
|             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); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.ManageChannels)] | ||||
|         public async Task SetTopic(IMessage imsg, [Remainder] string arg) | ||||
|         { | ||||
|             var topic = e.GetArg("topic")?.Trim() ?? ""; | ||||
|             await e.Channel.Edit(topic: topic).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) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|             var name = e.GetArg("name"); | ||||
|             if (string.IsNullOrWhiteSpace(name)) | ||||
|                 return; | ||||
|             await e.Channel.Edit(name: name).ConfigureAwait(false); | ||||
|             await imsg.Channel.SendMessageAsync(":ok: **New channel name set.**").ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         //todo maybe split into 3/4 different commands with the same name | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Prune(IMessage msg, [Remainder] string target = null) | ||||
|         { | ||||
|             var channel = msg.Channel as IGuildChannel; | ||||
|  | ||||
|             var user = await channel.Guild.GetCurrentUserAsync(); | ||||
|             if (string.IsNullOrWhiteSpace(target)) | ||||
|             { | ||||
|  | ||||
|                 var enumerable = (await msg.Channel.GetMessagesAsync()).Where(x => x.Author.Id == user.Id); | ||||
|                 await msg.Channel.DeleteMessagesAsync(enumerable); | ||||
|                 return; | ||||
|             } | ||||
|             target = target.Trim(); | ||||
|             if (!user.GetPermissions(channel).ManageMessages) | ||||
|             { | ||||
|                 await msg.Reply("Don't have permissions to manage messages in channel"); | ||||
|                 return; | ||||
|             } | ||||
|             int count; | ||||
|             if (int.TryParse(target, out count)) | ||||
|             { | ||||
|                 while (count > 0) | ||||
|                 { | ||||
|                     int limit = (count < 100) ? count : 100; | ||||
|                     var enumerable = (await msg.Channel.GetMessagesAsync(limit: limit)); | ||||
|                     await msg.Channel.DeleteMessagesAsync(enumerable); | ||||
|                     await Task.Delay(1000); // there is a 1 per second per guild ratelimit for deletemessages | ||||
|                     if (enumerable.Count < limit) break; | ||||
|                     count -= limit; | ||||
|                 } | ||||
|             } | ||||
|             else if (msg.MentionedUsers.Count > 0) | ||||
|             { | ||||
|                 var toDel = new List<IMessage>(); | ||||
|  | ||||
|                 var match = Regex.Match(target, @"\s(\d+)\s"); | ||||
|                 if (match.Success) | ||||
|                 { | ||||
|                     int.TryParse(match.Groups[1].Value, out count); | ||||
|                     var messages = new List<IMessage>(count); | ||||
|  | ||||
|                     while (count > 0) | ||||
|                     { | ||||
|                         var toAdd = await msg.Channel.GetMessagesAsync(limit: count < 100 ? count : 100); | ||||
|                         messages.AddRange(toAdd); | ||||
|                         count -= toAdd.Count; | ||||
|                     } | ||||
|  | ||||
|                     foreach (var mention in msg.MentionedUsers) | ||||
|                     { | ||||
|                         toDel.AddRange(messages.Where(m => m.Author.Id == mention.Id)); | ||||
|                     } | ||||
|  | ||||
|                     var messagesEnum = messages.AsEnumerable(); | ||||
|                     while (messagesEnum.Count() > 0) | ||||
|                     { | ||||
|                         await msg.Channel.DeleteMessagesAsync(messagesEnum.Take(100)); | ||||
|                         await Task.Delay(1000); // 1 second ratelimit | ||||
|                         messagesEnum = messagesEnum.Skip(100); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         //todo owner only | ||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task Die(IMessage imsg) | ||||
|         //{ | ||||
|         //    var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|         //    await imsg.Channel.SendMessageAsync("`Shutting down.`").ConfigureAwait(false); | ||||
|         //    await Task.Delay(2000).ConfigureAwait(false); | ||||
|         //    Environment.Exit(0); | ||||
|         //} | ||||
|  | ||||
|         ////todo owner only | ||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task Setname(IMessage imsg, [Remainder] string newName) | ||||
|         //{ | ||||
|         //    var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|         //} | ||||
|  | ||||
|         ////todo owner only | ||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task NewAvatar(IMessage imsg, [Remainder] string img) | ||||
|         //{ | ||||
|         //    var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|         //    if (string.IsNullOrWhiteSpace(e.GetArg("img"))) | ||||
|         //        return; | ||||
|         //    // Gather user provided URL. | ||||
|         //    var avatarAddress = e.GetArg("img"); | ||||
|         //    var imageStream = await SearchHelper.GetResponseStreamAsync(avatarAddress).ConfigureAwait(false); | ||||
|         //    var image = System.Drawing.Image.FromStream(imageStream); | ||||
|         //    await client.CurrentUser.Edit("", avatar: image.ToStream()).ConfigureAwait(false); | ||||
|  | ||||
|         //    // Send confirm. | ||||
|         //    await imsg.Channel.SendMessageAsync("New avatar set.").ConfigureAwait(false); | ||||
|         //} | ||||
|  | ||||
|         ////todo owner only | ||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task SetGame(IMessage imsg, [Remainder] string game) | ||||
|         //{ | ||||
|         //    var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|         //    game = game ?? ""; | ||||
|  | ||||
|         //    client.SetGame(e.GetArg("set_game")); | ||||
|         //} | ||||
|  | ||||
|         ////todo owner only | ||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task Send(IMessage imsg, string where, [Remainder] string msg) | ||||
|         //{ | ||||
|         //    var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|         //    if (string.IsNullOrWhiteSpace(msg)) | ||||
|         //        return; | ||||
|  | ||||
|         //    var ids = where.Split('|'); | ||||
|         //    if (ids.Length != 2) | ||||
|         //        return; | ||||
|         //    var sid = ulong.Parse(ids[0]); | ||||
|         //    var server = NadekoBot.Client.Servers.Where(s => s.Id == sid).FirstOrDefault(); | ||||
|  | ||||
|         //    if (server == null) | ||||
|         //        return; | ||||
|  | ||||
|         //    if (ids[1].ToUpperInvariant().StartsWith("C:")) | ||||
|         //    { | ||||
|         //        var cid = ulong.Parse(ids[1].Substring(2)); | ||||
|         //        var channel = server.TextChannels.Where(c => c.Id == cid).FirstOrDefault(); | ||||
|         //        if (channel == null) | ||||
|         //        { | ||||
|         //            return; | ||||
|         //        } | ||||
|         //        await channel.SendMessage(msg); | ||||
|         //    } | ||||
|         //    else if (ids[1].ToUpperInvariant().StartsWith("U:")) | ||||
|         //    { | ||||
|         //        var uid = ulong.Parse(ids[1].Substring(2)); | ||||
|         //        var user = server.Users.Where(u => u.Id == uid).FirstOrDefault(); | ||||
|         //        if (user == null) | ||||
|         //        { | ||||
|         //            return; | ||||
|         //        } | ||||
|         //        await user.SendMessage(msg); | ||||
|         //    } | ||||
|         //    else | ||||
|         //    { | ||||
|         //        await imsg.Channel.SendMessageAsync("`Invalid format.`"); | ||||
|         //    } | ||||
|         //} | ||||
|  | ||||
|         ////todo owner only | ||||
|         ////todo DB | ||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task Donadd(IMessage imsg, IUser donator, int amount) | ||||
|         //{ | ||||
|         //    var channel = imsg.Channel as IGuildChannel; | ||||
|         //    var donator = channel.Guild.FindUsers(e.GetArg("donator")).FirstOrDefault(); | ||||
|         //    var amount = int.Parse(e.GetArg("amount")); | ||||
|         //    if (donator == null) return; | ||||
|         //    try | ||||
|         //    { | ||||
|         //        DbHandler.Instance.Connection.Insert(new Donator | ||||
|         //        { | ||||
|         //            Amount = amount, | ||||
|         //            UserName = donator.Name, | ||||
|         //            UserId = (long)donator.Id | ||||
|         //        }); | ||||
|         //        imsg.Channel.SendMessageAsync("Successfuly added a new donator. 👑").ConfigureAwait(false); | ||||
|         //    } | ||||
|         //    catch { } | ||||
|  | ||||
|         //} | ||||
|  | ||||
|         //todo owner only | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Announce(IMessage imsg, [Remainder] string message) | ||||
|         { | ||||
|             var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|  | ||||
|             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); | ||||
|         } | ||||
|  | ||||
|         //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; | ||||
|  | ||||
|                 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); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         [RequirePermission(GuildPermission.MentionEveryone)] | ||||
|         public async Task MentionRole(IMessage imsg, [Remainder] string 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; | ||||
|                 send += $"\n`{role.Name}`\n"; | ||||
|                 send += string.Join(", ", role.Members.Select(r => r.Mention)); | ||||
|             } | ||||
|  | ||||
|             while (send.Length > 2000) | ||||
|             { | ||||
|                 var curstr = send.Substring(0, 2000); | ||||
|                 await | ||||
|                     e.Channel.Send(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); | ||||
|         } | ||||
|  | ||||
|         //todo DB | ||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task Donators(IMessage imsg) | ||||
|         //{ | ||||
|         //    var channel = imsg.Channel as IGuildChannel; | ||||
|  | ||||
|         //    var rows = DbHandler.Instance.GetAllRows<Donator>(); | ||||
|         //    var donatorsOrdered = rows.OrderByDescending(d => d.Amount); | ||||
|         //    string str = $"**Thanks to the people listed below for making this project happen!**\n"; | ||||
|  | ||||
|         //    await imsg.Channel.SendMessageAsync(str + string.Join("⭐", donatorsOrdered.Select(d => d.UserName))).ConfigureAwait(false); | ||||
|         //} | ||||
|     } | ||||
| } | ||||
| @@ -127,73 +127,6 @@ namespace NadekoBot.Modules.Utility | ||||
|                 await msg.Reply("`List of roles:` \n• " + string.Join("\n• ", (msg.Channel as IGuildChannel).Guild.Roles.Except(new[] { guild.EveryoneRole }))); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         //todo maybe split into 3/4 different commands with the same name | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Prune(IMessage msg, [Remainder] string target = null) | ||||
|         { | ||||
|             var channel = msg.Channel as IGuildChannel; | ||||
|  | ||||
|             var user = await channel.Guild.GetCurrentUserAsync(); | ||||
|             if (string.IsNullOrWhiteSpace(target)) | ||||
|             { | ||||
|  | ||||
|                 var enumerable = (await msg.Channel.GetMessagesAsync()).Where(x => x.Author.Id == user.Id); | ||||
|                 await msg.Channel.DeleteMessagesAsync(enumerable); | ||||
|                 return; | ||||
|             } | ||||
|             target = target.Trim(); | ||||
|             if (!user.GetPermissions(channel).ManageMessages) | ||||
|             { | ||||
|                 await msg.Reply("Don't have permissions to manage messages in channel"); | ||||
|                 return; | ||||
|             } | ||||
|             int count; | ||||
|             if (int.TryParse(target, out count)) | ||||
|             { | ||||
|                 while (count > 0) | ||||
|                 { | ||||
|                     int limit = (count < 100) ? count : 100; | ||||
|                     var enumerable = (await msg.Channel.GetMessagesAsync(limit: limit)); | ||||
|                     await msg.Channel.DeleteMessagesAsync(enumerable); | ||||
|                     await Task.Delay(1000); // there is a 1 per second per guild ratelimit for deletemessages | ||||
|                     if (enumerable.Count < limit) break; | ||||
|                     count -= limit; | ||||
|                 } | ||||
|             } | ||||
|             else if (msg.MentionedUsers.Count > 0) | ||||
|             { | ||||
|                 var toDel = new List<IMessage>(); | ||||
|  | ||||
|                 var match = Regex.Match(target, @"\s(\d+)\s"); | ||||
|                 if (match.Success) | ||||
|                 { | ||||
|                     int.TryParse(match.Groups[1].Value, out count); | ||||
|                     var messages = new List<IMessage>(count); | ||||
|  | ||||
|                     while (count > 0) | ||||
|                     { | ||||
|                         var toAdd = await msg.Channel.GetMessagesAsync(limit: count < 100 ? count : 100); | ||||
|                         messages.AddRange(toAdd); | ||||
|                         count -= toAdd.Count; | ||||
|                     } | ||||
|  | ||||
|                     foreach (var mention in msg.MentionedUsers) | ||||
|                     { | ||||
|                         toDel.AddRange(messages.Where(m => m.Author.Id == mention.Id)); | ||||
|                     } | ||||
|  | ||||
|                     var messagesEnum = messages.AsEnumerable(); | ||||
|                     while (messagesEnum.Count() > 0) | ||||
|                     {    | ||||
|                         await msg.Channel.DeleteMessagesAsync(messagesEnum.Take(100)); | ||||
|                         await Task.Delay(1000); // 1 second ratelimit | ||||
|                         messagesEnum = messagesEnum.Skip(100); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,901 +0,0 @@ | ||||
| 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; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Administration | ||||
| { | ||||
|     internal class AdministrationModule : DiscordModule | ||||
|     { | ||||
|         public AdministrationModule() | ||||
|         { | ||||
|             commands.Add(new ServerGreetCommand(this)); | ||||
|             commands.Add(new LogCommand(this)); | ||||
|             commands.Add(new MessageRepeater(this)); | ||||
|             commands.Add(new PlayingRotate(this)); | ||||
|             commands.Add(new RatelimitCommand(this)); | ||||
|             commands.Add(new VoicePlusTextCommand(this)); | ||||
|             commands.Add(new CrossServerTextChannel(this)); | ||||
|             commands.Add(new SelfAssignedRolesCommand(this)); | ||||
|             commands.Add(new CustomReactionsCommands(this)); | ||||
|             commands.Add(new AutoAssignRole(this)); | ||||
|             commands.Add(new SelfCommands(this)); | ||||
|             commands.Add(new IncidentsCommands(this)); | ||||
|  | ||||
|             NadekoBot.Client.GetService<CommandService>().CommandExecuted += DeleteCommandMessage; | ||||
|         } | ||||
|  | ||||
|         private void DeleteCommandMessage(object sender, CommandEventArgs e) | ||||
|         { | ||||
|             if (e.Server == null || e.Channel.IsPrivate) | ||||
|                 return; | ||||
|             var conf = SpecificConfigurations.Default.Of(e.Server.Id); | ||||
|             if (!conf.AutoDeleteMessagesOnCommand) | ||||
|                 return; | ||||
|             try | ||||
|             { | ||||
|                 e.Message.Delete(); | ||||
|             } | ||||
|             catch { } | ||||
|         } | ||||
|  | ||||
|         public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.Administration; | ||||
|  | ||||
|         public override void Install(ModuleManager manager) | ||||
|         { | ||||
|  | ||||
|             manager.CreateCommands("", cgb => | ||||
|             { | ||||
|  | ||||
|                 cgb.AddCheck(PermissionChecker.Instance); | ||||
|  | ||||
|                 var client = manager.Client; | ||||
|  | ||||
|                 commands.ForEach(cmd => cmd.Init(cgb)); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "delmsgoncmd") | ||||
|                     .Description($"Toggles the automatic deletion of user's successful command message to prevent chat flood. **Server Manager Only.** | `{Prefix}delmsgoncmd`") | ||||
|                     .AddCheck(SimpleCheckers.ManageServer()) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var conf = SpecificConfigurations.Default.Of(e.Server.Id); | ||||
|                         conf.AutoDeleteMessagesOnCommand = !conf.AutoDeleteMessagesOnCommand; | ||||
|                         await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false); | ||||
|                         if (conf.AutoDeleteMessagesOnCommand) | ||||
|                             await imsg.Channel.SendMessageAsync("❗`Now automatically deleting successfull command invokations.`"); | ||||
|                         else | ||||
|                             await imsg.Channel.SendMessageAsync("❗`Stopped automatic deletion of successfull command invokations.`"); | ||||
|  | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "restart") | ||||
|                     .Description($"Restarts the bot. Might not work. **Bot Owner Only** | `{Prefix}restart`") | ||||
|                     .AddCheck(SimpleCheckers.OwnerOnly()) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         await imsg.Channel.SendMessageAsync("`Restarting in 2 seconds...`"); | ||||
|                         await Task.Delay(2000); | ||||
|                         System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location); | ||||
|                         Environment.Exit(0); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "setrole").Alias(Prefix + "sr") | ||||
|                     .Description($"Sets a role for a given user. **Needs Manage Roles Permissions.**| `{Prefix}sr @User Guest`") | ||||
|                     .Parameter("user_name", ParameterType.Required) | ||||
|                     .Parameter("role_name", ParameterType.Unparsed) | ||||
|                     .AddCheck(SimpleCheckers.CanManageRoles) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var userName = e.GetArg("user_name"); | ||||
|                         var roleName = e.GetArg("role_name"); | ||||
|  | ||||
|                         if (string.IsNullOrWhiteSpace(roleName)) return; | ||||
|  | ||||
|                         if (!e.User.ServerPermissions.ManageRoles) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("You have insufficient permissions.").ConfigureAwait(false); | ||||
|                         } | ||||
|  | ||||
|                         var usr = e.Server.FindUsers(userName).FirstOrDefault(); | ||||
|                         if (usr == null) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("You failed to supply a valid username").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         var role = e.Server.FindRoles(roleName).FirstOrDefault(); | ||||
|                         if (role == null) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("You failed to supply a valid role").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         try | ||||
|                         { | ||||
|                             await usr.AddRoles(role).ConfigureAwait(false); | ||||
|                             await imsg.Channel.SendMessageAsync($"Successfully added role **{role.Name}** to user **{usr.Name}**").ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch (Exception ex) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("Failed to add roles. Bot has insufficient permissions.\n").ConfigureAwait(false); | ||||
|                             Console.WriteLine(ex.ToString()); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "removerole").Alias(Prefix + "rr") | ||||
|                     .Description($"Removes a role from a given user. **Needs Manage Roles Permissions.**| `{Prefix}rr @User Admin`") | ||||
|                     .Parameter("user_name", ParameterType.Required) | ||||
|                     .Parameter("role_name", ParameterType.Unparsed) | ||||
|                     .AddCheck(SimpleCheckers.CanManageRoles) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var userName = e.GetArg("user_name"); | ||||
|                         var roleName = e.GetArg("role_name"); | ||||
|  | ||||
|                         if (string.IsNullOrWhiteSpace(roleName)) return; | ||||
|  | ||||
|                         var usr = e.Server.FindUsers(userName).FirstOrDefault(); | ||||
|                         if (usr == null) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("You failed to supply a valid username").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         var role = e.Server.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); | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "renamerole") | ||||
|                     .Alias(Prefix + "renr") | ||||
|                     .Description($"Renames a role. Roles you are renaming must be lower than bot's highest role. **Manage Roles Permissions.** | `{Prefix}renr \"First role\" SecondRole`") | ||||
|                     .Parameter("r1", ParameterType.Required) | ||||
|                     .Parameter("r2", ParameterType.Required) | ||||
|                     .AddCheck(new SimpleCheckers.ManageRoles()) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var r1 = e.GetArg("r1").Trim(); | ||||
|                         var r2 = e.GetArg("r2").Trim(); | ||||
|  | ||||
|                         var roleToEdit = e.Server.FindRoles(r1).FirstOrDefault(); | ||||
|                         if (roleToEdit == null) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("Can't find that role.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         try | ||||
|                         { | ||||
|                             if (roleToEdit.Position > e.Server.CurrentUser.Roles.Max(r => r.Position)) | ||||
|                             { | ||||
|                                 await imsg.Channel.SendMessageAsync("I can't edit roles higher than my highest role.").ConfigureAwait(false); | ||||
|                                 return; | ||||
|                             } | ||||
|                             await roleToEdit.Edit(r2); | ||||
|                             await imsg.Channel.SendMessageAsync("Role renamed.").ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch (Exception) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("Failed to rename role. Probably insufficient permissions.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "removeallroles").Alias(Prefix + "rar") | ||||
|                     .Description($"Removes all roles from a mentioned user. **Needs Manage Roles Permissions.**| `{Prefix}rar @User`") | ||||
|                     .Parameter("user_name", ParameterType.Unparsed) | ||||
|                     .AddCheck(SimpleCheckers.CanManageRoles) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var userName = e.GetArg("user_name"); | ||||
|  | ||||
|                         var usr = e.Server.FindUsers(userName).FirstOrDefault(); | ||||
|                         if (usr == null) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("You failed to supply a valid username").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         try | ||||
|                         { | ||||
|                             await usr.RemoveRoles(usr.Roles.ToArray()).ConfigureAwait(false); | ||||
|                             await imsg.Channel.SendMessageAsync($"Successfully removed **all** roles from user **{usr.Name}**").ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "createrole").Alias(Prefix + "cr") | ||||
|                     .Description($"Creates a role with a given name. **Needs Manage Roles Permissions.**| `{Prefix}cr Awesome Role`") | ||||
|                     .Parameter("role_name", ParameterType.Unparsed) | ||||
|                     .AddCheck(SimpleCheckers.CanManageRoles) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (string.IsNullOrWhiteSpace(e.GetArg("role_name"))) | ||||
|                             return; | ||||
|                         try | ||||
|                         { | ||||
|                             var r = await e.Server.CreateRole(e.GetArg("role_name")).ConfigureAwait(false); | ||||
|                             await imsg.Channel.SendMessageAsync($"Successfully created role **{r.Name}**.").ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch (Exception) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync(":warning: Unspecified error.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "rolecolor").Alias(Prefix + "rc") | ||||
|                     .Parameter("role_name", ParameterType.Required) | ||||
|                     .Parameter("r", ParameterType.Optional) | ||||
|                     .Parameter("g", ParameterType.Optional) | ||||
|                     .Parameter("b", ParameterType.Optional) | ||||
|                     .Description($"Set a role's color to the hex or 0-255 rgb color value provided. **Needs Manage Roles Permissions.** | `{Prefix}rc Admin 255 200 100` or `{Prefix}rc Admin ffba55`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (!e.User.ServerPermissions.ManageRoles) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("You don't have permission to use this!").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         var args = e.Args.Where(s => s != string.Empty); | ||||
|  | ||||
|                         if (args.Count() != 2 && args.Count() != 4) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("The parameters are invalid.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         var role = e.Server.FindRoles(e.Args[0]).FirstOrDefault(); | ||||
|  | ||||
|                         if (role == null) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("That role does not exist.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|                         try | ||||
|                         { | ||||
|                             var rgb = args.Count() == 4; | ||||
|                             var arg1 = e.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); | ||||
|                             await imsg.Channel.SendMessageAsync($"Role {role.Name}'s color has been changed.").ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch (Exception) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("Error occured, most likely invalid parameters or insufficient permissions.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "ban").Alias(Prefix + "b") | ||||
|                     .Parameter("user", ParameterType.Required) | ||||
|                     .Parameter("msg", ParameterType.Unparsed) | ||||
|                     .Description($"Bans a user by id or name with an optional message. **Needs Ban Permissions.**| `{Prefix}b \"@some Guy\" Your behaviour is toxic.`") | ||||
|                         .Do(async e => | ||||
|                         { | ||||
|                             var msg = e.GetArg("msg"); | ||||
|                             var user = e.GetArg("user"); | ||||
|                             if (e.User.ServerPermissions.BanMembers) | ||||
|                             { | ||||
|                                 var usr = e.Server.FindUsers(user).FirstOrDefault(); | ||||
|                                 if (usr == null) | ||||
|                                 { | ||||
|                                     await imsg.Channel.SendMessageAsync("User not found.").ConfigureAwait(false); | ||||
|                                     return; | ||||
|                                 } | ||||
|                                 if (!string.IsNullOrWhiteSpace(msg)) | ||||
|                                 { | ||||
|                                     await usr.SendMessage($"**You have been BANNED from `{e.Server.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 e.Server.Ban(usr, 7).ConfigureAwait(false); | ||||
|  | ||||
|                                     await imsg.Channel.SendMessageAsync("Banned user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false); | ||||
|                                 } | ||||
|                                 catch | ||||
|                                 { | ||||
|                                     await imsg.Channel.SendMessageAsync("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); | ||||
|                                 } | ||||
|                             } | ||||
|                         }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "softban").Alias(Prefix + "sb") | ||||
|                     .Parameter("user", ParameterType.Required) | ||||
|                     .Parameter("msg", ParameterType.Unparsed) | ||||
|                     .Description($"Bans and then unbans a user by id or name with an optional message. **Needs Ban Permissions.**| `{Prefix}sb \"@some Guy\" Your behaviour is toxic.`") | ||||
|                         .Do(async e => | ||||
|                         { | ||||
|                             var msg = e.GetArg("msg"); | ||||
|                             var user = e.GetArg("user"); | ||||
|                             if (e.User.ServerPermissions.BanMembers) | ||||
|                             { | ||||
|                                 var usr = e.Server.FindUsers(user).FirstOrDefault(); | ||||
|                                 if (usr == null) | ||||
|                                 { | ||||
|                                     await imsg.Channel.SendMessageAsync("User not found.").ConfigureAwait(false); | ||||
|                                     return; | ||||
|                                 } | ||||
|                                 if (!string.IsNullOrWhiteSpace(msg)) | ||||
|                                 { | ||||
|                                     await usr.SendMessage($"**You have been SOFT-BANNED from `{e.Server.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 e.Server.Ban(usr, 7).ConfigureAwait(false); | ||||
|                                     await e.Server.Unban(usr).ConfigureAwait(false); | ||||
|  | ||||
|                                     await imsg.Channel.SendMessageAsync("Soft-Banned user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false); | ||||
|                                 } | ||||
|                                 catch | ||||
|                                 { | ||||
|                                     await imsg.Channel.SendMessageAsync("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); | ||||
|                                 } | ||||
|                             } | ||||
|                         }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "kick").Alias(Prefix + "k") | ||||
|                     .Parameter("user") | ||||
|                     .Parameter("msg", ParameterType.Unparsed) | ||||
|                     .Description($"Kicks a mentioned user. **Needs Kick Permissions.**| `{Prefix}k \"@some Guy\" Your behaviour is toxic.`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var msg = e.GetArg("msg"); | ||||
|                         var user = e.GetArg("user"); | ||||
|                         if (e.User.ServerPermissions.KickMembers) | ||||
|                         { | ||||
|                             var usr = e.Server.FindUsers(user).FirstOrDefault(); | ||||
|                             if (usr == null) | ||||
|                             { | ||||
|                                 await imsg.Channel.SendMessageAsync("User not found.").ConfigureAwait(false); | ||||
|                                 return; | ||||
|                             } | ||||
|                             if (!string.IsNullOrWhiteSpace(msg)) | ||||
|                             { | ||||
|                                 await usr.SendMessage($"**You have been KICKED from `{e.Server.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); | ||||
|                             } | ||||
|                             catch | ||||
|                             { | ||||
|                                 await imsg.Channel.SendMessageAsync("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); | ||||
|                             } | ||||
|                         } | ||||
|                     }); | ||||
|                 cgb.CreateCommand(Prefix + "mute") | ||||
|                     .Description($"Mutes mentioned user or users. **Needs Mute Permissions.**| `{Prefix}mute \"@Someguy\"` or `{Prefix}mute \"@Someguy\" \"@Someguy\"`") | ||||
|                     .Parameter("throwaway", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (!e.User.ServerPermissions.MuteMembers) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|                         if (!e.Message.MentionedUsers.Any()) | ||||
|                             return; | ||||
|                         try | ||||
|                         { | ||||
|                             foreach (var u in e.Message.MentionedUsers) | ||||
|                             { | ||||
|                                 await u.Edit(isMuted: true).ConfigureAwait(false); | ||||
|                             } | ||||
|                             await imsg.Channel.SendMessageAsync("Mute successful").ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "unmute") | ||||
|                     .Description($"Unmutes mentioned user or users. **Needs Mute Permissions.**| `{Prefix}unmute \"@Someguy\"` or `{Prefix}unmute \"@Someguy\" \"@Someguy\"`") | ||||
|                     .Parameter("throwaway", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (!e.User.ServerPermissions.MuteMembers) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("You do not have permission to do that.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|                         if (!e.Message.MentionedUsers.Any()) | ||||
|                             return; | ||||
|                         try | ||||
|                         { | ||||
|                             foreach (var u in e.Message.MentionedUsers) | ||||
|                             { | ||||
|                                 await u.Edit(isMuted: false).ConfigureAwait(false); | ||||
|                             } | ||||
|                             await imsg.Channel.SendMessageAsync("Unmute successful").ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "deafen") | ||||
|                     .Alias(Prefix + "deaf") | ||||
|                     .Description($"Deafens mentioned user or users. **Needs Deafen Permissions.**| `{Prefix}deaf \"@Someguy\"` or `{Prefix}deaf \"@Someguy\" \"@Someguy\"`") | ||||
|                     .Parameter("throwaway", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (!e.User.ServerPermissions.DeafenMembers) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("You do not have permission to do that.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|                         if (!e.Message.MentionedUsers.Any()) | ||||
|                             return; | ||||
|                         try | ||||
|                         { | ||||
|                             foreach (var u in e.Message.MentionedUsers) | ||||
|                             { | ||||
|                                 await u.Edit(isDeafened: true).ConfigureAwait(false); | ||||
|                             } | ||||
|                             await imsg.Channel.SendMessageAsync("Deafen successful").ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "undeafen") | ||||
|                     .Alias(Prefix + "undef") | ||||
|                     .Description($"Undeafens mentioned user or users. **Needs Deafen Permissions.** | `{Prefix}undef \"@Someguy\"` or `{Prefix}undef \"@Someguy\" \"@Someguy\"`") | ||||
|                     .Parameter("throwaway", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (!e.User.ServerPermissions.DeafenMembers) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("You do not have permission to do that.").ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|                         if (!e.Message.MentionedUsers.Any()) | ||||
|                             return; | ||||
|                         try | ||||
|                         { | ||||
|                             foreach (var u in e.Message.MentionedUsers) | ||||
|                             { | ||||
|                                 await u.Edit(isDeafened: false).ConfigureAwait(false); | ||||
|                             } | ||||
|                             await imsg.Channel.SendMessageAsync("Undeafen successful").ConfigureAwait(false); | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "delvoichanl") | ||||
|                     .Alias(Prefix + "dvch") | ||||
|                     .Description($"Deletes a voice channel with a given name. **Needs Manage Channel Permissions.**| `{Prefix}dvch VoiceChannelName`") | ||||
|                     .Parameter("channel_name", ParameterType.Required) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         try | ||||
|                         { | ||||
|                             if (e.User.ServerPermissions.ManageChannels) | ||||
|                             { | ||||
|                                 var ch = e.Server.FindChannels(e.GetArg("channel_name"), ChannelType.Voice).FirstOrDefault(); | ||||
|                                 if (ch == null) | ||||
|                                     return; | ||||
|                                 await ch.Delete().ConfigureAwait(false); | ||||
|                                 await imsg.Channel.SendMessageAsync($"Removed channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); | ||||
|                             } | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("Insufficient permissions."); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "creatvoichanl") | ||||
|                     .Alias(Prefix + "cvch") | ||||
|                     .Description($"Creates a new voice channel with a given name. **Needs Manage Channel Permissions.** | `{Prefix}cvch VoiceChannelName`") | ||||
|                     .Parameter("channel_name", ParameterType.Required) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         try | ||||
|                         { | ||||
|                             if (e.User.ServerPermissions.ManageChannels) | ||||
|                             { | ||||
|                                 await e.Server.CreateChannel(e.GetArg("channel_name"), ChannelType.Voice).ConfigureAwait(false); | ||||
|                                 await imsg.Channel.SendMessageAsync($"Created voice channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); | ||||
|                             } | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("Insufficient permissions.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "deltxtchanl") | ||||
|                     .Alias(Prefix + "dtch") | ||||
|                     .Description($"Deletes a text channel with a given name. **Needs Manage Channel Permissions.** | `{Prefix}dtch TextChannelName`") | ||||
|                     .Parameter("channel_name", ParameterType.Required) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         try | ||||
|                         { | ||||
|                             if (e.User.ServerPermissions.ManageChannels) | ||||
|                             { | ||||
|                                 var channel = e.Server.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); | ||||
|                             } | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("Insufficient permissions.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "creatxtchanl") | ||||
|                     .Alias(Prefix + "ctch") | ||||
|                     .Description($"Creates a new text channel with a given name. **Needs Manage Channel Permissions.** | `{Prefix}ctch TextChannelName`") | ||||
|                     .Parameter("channel_name", ParameterType.Required) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         try | ||||
|                         { | ||||
|                             if (e.User.ServerPermissions.ManageChannels) | ||||
|                             { | ||||
|                                 await e.Server.CreateChannel(e.GetArg("channel_name"), ChannelType.Text).ConfigureAwait(false); | ||||
|                                 await imsg.Channel.SendMessageAsync($"Added text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); | ||||
|                             } | ||||
|                         } | ||||
|                         catch | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("Insufficient permissions.").ConfigureAwait(false); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "settopic") | ||||
|                     .Alias(Prefix + "st") | ||||
|                     .Description($"Sets a topic on the current channel. **Needs Manage Channel Permissions.** | `{Prefix}st My new topic`") | ||||
|                     .AddCheck(SimpleCheckers.ManageChannels()) | ||||
|                     .Parameter("topic", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var topic = e.GetArg("topic")?.Trim() ?? ""; | ||||
|                         await e.Channel.Edit(topic: topic).ConfigureAwait(false); | ||||
|                         await imsg.Channel.SendMessageAsync(":ok: **New channel topic set.**").ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "setchanlname") | ||||
|                     .Alias(Prefix + "schn") | ||||
|                     .Description($"Changed the name of the current channel. **Needs Manage Channel Permissions.**| `{Prefix}schn NewName`") | ||||
|                     .AddCheck(SimpleCheckers.ManageChannels()) | ||||
|                     .Parameter("name", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var name = e.GetArg("name"); | ||||
|                         if (string.IsNullOrWhiteSpace(name)) | ||||
|                             return; | ||||
|                         await e.Channel.Edit(name: name).ConfigureAwait(false); | ||||
|                         await imsg.Channel.SendMessageAsync(":ok: **New channel name set.**").ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "heap") | ||||
|                   .Description($"Shows allocated memory - **Bot Owner Only!** | `{Prefix}heap`") | ||||
|                   .AddCheck(SimpleCheckers.OwnerOnly()) | ||||
|                   .Do(async e => | ||||
|                   { | ||||
|                       var heap = await Task.Run(() => NadekoStats.Instance.Heap()).ConfigureAwait(false); | ||||
|                       await imsg.Channel.SendMessageAsync($"`Heap Size:` {heap}").ConfigureAwait(false); | ||||
|                   }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "prune") | ||||
|                     .Alias(Prefix + "clr") | ||||
|                     .Description( | ||||
|                     "`.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. " + | ||||
|                     $"| `{Prefix}prune` or `{Prefix}prune 5` or `{Prefix}prune @Someone` or `{Prefix}prune @Someone X`") | ||||
|                     .Parameter("user_or_num", ParameterType.Optional) | ||||
|                     .Parameter("num", ParameterType.Optional) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (string.IsNullOrWhiteSpace(e.GetArg("user_or_num"))) // if nothing is set, clear nadeko's messages, no permissions required | ||||
|                         { | ||||
|                             var msgs = (await e.Channel.DownloadMessages(100).ConfigureAwait(false)).Where(m => m.User?.Id == e.Server.CurrentUser.Id)?.ToArray(); | ||||
|                             if (msgs == null || !msgs.Any()) | ||||
|                                 return; | ||||
|                             var toDelete = msgs as Message[] ?? msgs.ToArray(); | ||||
|                             await e.Channel.DeleteMessages(toDelete).ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|                         if (!e.User.GetPermissions(e.Channel).ManageMessages) | ||||
|                             return; | ||||
|                         else if (!e.Server.CurrentUser.GetPermissions(e.Channel).ManageMessages) | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("💢I don't have the permission to manage messages."); | ||||
|                             return; | ||||
|                         } | ||||
|                         int val; | ||||
|                         if (int.TryParse(e.GetArg("user_or_num"), out val)) // if num is set in the first argument,  | ||||
|                                                                             //delete that number of messages. | ||||
|                         { | ||||
|                             if (val <= 0) | ||||
|                                 return; | ||||
|                             val++; | ||||
|                             await e.Channel.DeleteMessages((await e.Channel.DownloadMessages(val).ConfigureAwait(false)).ToArray()).ConfigureAwait(false); | ||||
|                             return; | ||||
|                         } | ||||
|                         //else if first argument is user | ||||
|                         var usr = e.Server.FindUsers(e.GetArg("user_or_num")).FirstOrDefault(); | ||||
|                         if (usr == null) | ||||
|                             return; | ||||
|                         val = 100; | ||||
|                         if (!int.TryParse(e.GetArg("num"), out val)) | ||||
|                             val = 100; | ||||
|                         var mesgs = (await e.Channel.DownloadMessages(100).ConfigureAwait(false)).Where(m => m.User?.Id == usr.Id).Take(val); | ||||
|                         if (mesgs == null || !mesgs.Any()) | ||||
|                             return; | ||||
|                         await e.Channel.DeleteMessages(mesgs as Message[] ?? mesgs.ToArray()).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "die") | ||||
|                     .Description($"Shuts the bot down and notifies users about the restart. **Bot Owner Only!** | `{Prefix}die`") | ||||
|                     .AddCheck(SimpleCheckers.OwnerOnly()) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         await imsg.Channel.SendMessageAsync("`Shutting down.`").ConfigureAwait(false); | ||||
|                         await Task.Delay(2000).ConfigureAwait(false); | ||||
|                         Environment.Exit(0); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "setname") | ||||
|                     .Alias(Prefix + "newnm") | ||||
|                     .Description($"Give the bot a new name. **Bot Owner Only!** | {Prefix}newnm BotName") | ||||
|                     .Parameter("new_name", ParameterType.Unparsed) | ||||
|                     .AddCheck(SimpleCheckers.OwnerOnly()) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (e.GetArg("new_name") == null) return; | ||||
|  | ||||
|                         await client.CurrentUser.Edit("", e.GetArg("new_name")).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "newavatar") | ||||
|                     .Alias(Prefix + "setavatar") | ||||
|                     .Description($"Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot Owner Only!** | `{Prefix}setavatar https://i.ytimg.com/vi/WDudkR1eTMM/maxresdefault.jpg`") | ||||
|                     .Parameter("img", ParameterType.Unparsed) | ||||
|                     .AddCheck(SimpleCheckers.OwnerOnly()) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         if (string.IsNullOrWhiteSpace(e.GetArg("img"))) | ||||
|                             return; | ||||
|                         // Gather user provided URL. | ||||
|                         var avatarAddress = e.GetArg("img"); | ||||
|                         var imageStream = await SearchHelper.GetResponseStreamAsync(avatarAddress).ConfigureAwait(false); | ||||
|                         var image = System.Drawing.Image.FromStream(imageStream); | ||||
|                         await client.CurrentUser.Edit("", avatar: image.ToStream()).ConfigureAwait(false); | ||||
|  | ||||
|                         // Send confirm. | ||||
|                         await imsg.Channel.SendMessageAsync("New avatar set.").ConfigureAwait(false); | ||||
|  | ||||
|                         // Save the image to disk. | ||||
|                         image.Save("data/avatar.png", System.Drawing.Imaging.ImageFormat.Png); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "setgame") | ||||
|                   .Description($"Sets the bots game. **Bot Owner Only!** | `{Prefix}setgame Playing with kwoth`") | ||||
|                   .Parameter("set_game", ParameterType.Unparsed) | ||||
|                   .Do(e => | ||||
|                   { | ||||
|                       if (!NadekoBot.IsOwner(e.User.Id) || e.GetArg("set_game") == null) return; | ||||
|  | ||||
|                       client.SetGame(e.GetArg("set_game")); | ||||
|                   }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "send") | ||||
|                     .Description($"Send a message to someone on a different server through the bot. **Bot Owner Only!** | `{Prefix}send serverid|u:user_id Send this to a user!` or `{Prefix}send serverid|c:channel_id Send this to a channel!`") | ||||
|                     .Parameter("ids", ParameterType.Required) | ||||
|                     .Parameter("msg", ParameterType.Unparsed) | ||||
|                     .AddCheck(SimpleCheckers.OwnerOnly()) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var msg = e.GetArg("msg")?.Trim(); | ||||
|  | ||||
|                         if (string.IsNullOrWhiteSpace(msg)) | ||||
|                             return; | ||||
|  | ||||
|                         var ids = e.GetArg("ids").Split('|'); | ||||
|                         if (ids.Length != 2) | ||||
|                             return; | ||||
|                         var sid = ulong.Parse(ids[0]); | ||||
|                         var server = NadekoBot.Client.Servers.Where(s => s.Id == sid).FirstOrDefault(); | ||||
|  | ||||
|                         if (server == null) | ||||
|                             return; | ||||
|  | ||||
|                         if (ids[1].ToUpperInvariant().StartsWith("C:")) | ||||
|                         { | ||||
|                             var cid = ulong.Parse(ids[1].Substring(2)); | ||||
|                             var channel = server.TextChannels.Where(c => c.Id == cid).FirstOrDefault(); | ||||
|                             if (channel == null) | ||||
|                             { | ||||
|                                 return; | ||||
|                             } | ||||
|                             await channel.SendMessage(msg); | ||||
|                         } | ||||
|                         else if (ids[1].ToUpperInvariant().StartsWith("U:")) | ||||
|                         { | ||||
|                             var uid = ulong.Parse(ids[1].Substring(2)); | ||||
|                             var user = server.Users.Where(u => u.Id == uid).FirstOrDefault(); | ||||
|                             if (user == null) | ||||
|                             { | ||||
|                                 return; | ||||
|                             } | ||||
|                             await user.SendMessage(msg); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             await imsg.Channel.SendMessageAsync("`Invalid format.`"); | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "mentionrole") | ||||
|                     .Alias(Prefix + "menro") | ||||
|                     .Description($"Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission. | `{Prefix}menro RoleName`") | ||||
|                     .Parameter("roles", ParameterType.Unparsed) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         await Task.Run(async () => | ||||
|                         { | ||||
|                             if (!e.User.ServerPermissions.MentionEveryone) return; | ||||
|                             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 = e.Server.FindRoles(roleStr).FirstOrDefault(); | ||||
|                                 if (role == null) continue; | ||||
|                                 send += $"\n`{role.Name}`\n"; | ||||
|                                 send += string.Join(", ", role.Members.Select(r => r.Mention)); | ||||
|                             } | ||||
|  | ||||
|                             while (send.Length > 2000) | ||||
|                             { | ||||
|                                 var curstr = send.Substring(0, 2000); | ||||
|                                 await | ||||
|                                     e.Channel.Send(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); | ||||
|                         }).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "unstuck") | ||||
|                   .Description($"Clears the message queue. **Bot Owner Only!** | `{Prefix}unstuck`") | ||||
|                   .AddCheck(SimpleCheckers.OwnerOnly()) | ||||
|                   .Do(e => | ||||
|                   { | ||||
|                       NadekoBot.Client.MessageQueue.Clear(); | ||||
|                   }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "donators") | ||||
|                     .Description($"List of lovely people who donated to keep this project alive. | `{Prefix}donators`") | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         await Task.Run(async () => | ||||
|                         { | ||||
|                             var rows = DbHandler.Instance.GetAllRows<Donator>(); | ||||
|                             var donatorsOrdered = rows.OrderByDescending(d => d.Amount); | ||||
|                             string str = $"**Thanks to the people listed below for making this project happen!**\n"; | ||||
|  | ||||
|                             await imsg.Channel.SendMessageAsync(str + string.Join("⭐", donatorsOrdered.Select(d => d.UserName))).ConfigureAwait(false); | ||||
|                         }).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "donadd") | ||||
|                     .Description($"Add a donator to the database. **Kwoth Only** | `{Prefix}donadd Donate Amount`") | ||||
|                     .Parameter("donator") | ||||
|                     .Parameter("amount") | ||||
|                     .AddCheck(SimpleCheckers.OwnerOnly()) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         await Task.Run(() => | ||||
|                         { | ||||
|                             var donator = e.Server.FindUsers(e.GetArg("donator")).FirstOrDefault(); | ||||
|                             var amount = int.Parse(e.GetArg("amount")); | ||||
|                             if (donator == null) return; | ||||
|                             try | ||||
|                             { | ||||
|                                 DbHandler.Instance.Connection.Insert(new Donator | ||||
|                                 { | ||||
|                                     Amount = amount, | ||||
|                                     UserName = donator.Name, | ||||
|                                     UserId = (long)donator.Id | ||||
|                                 }); | ||||
|                                 imsg.Channel.SendMessageAsync("Successfuly added a new donator. 👑").ConfigureAwait(false); | ||||
|                             } | ||||
|                             catch { } | ||||
|                         }).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "announce") | ||||
|                     .Description($"Sends a message to all servers' general channel bot is connected to.**Bot Owner Only!** | `{Prefix}announce Useless spam`") | ||||
|                     .Parameter("msg", ParameterType.Unparsed) | ||||
|                     .AddCheck(SimpleCheckers.OwnerOnly()) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         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); | ||||
|                     }); | ||||
|  | ||||
|                 cgb.CreateCommand(Prefix + "savechat") | ||||
|                     .Description($"Saves a number of messages to a text file and sends it to you. **Bot Owner Only** | `{Prefix}savechat 150`") | ||||
|                     .Parameter("cnt", ParameterType.Required) | ||||
|                     .AddCheck(SimpleCheckers.OwnerOnly()) | ||||
|                     .Do(async e => | ||||
|                     { | ||||
|                         var cntstr = e.GetArg("cnt")?.Trim(); | ||||
|                         int cnt; | ||||
|                         if (!int.TryParse(cntstr, out cnt)) | ||||
|                             return; | ||||
|                         ulong? lastmsgId = null; | ||||
|                         var sb = new StringBuilder(); | ||||
|                         var msgs = new List<Message>(cnt); | ||||
|                         while (cnt > 0) | ||||
|                         { | ||||
|                             var dlcnt = cnt < 100 ? cnt : 100; | ||||
|  | ||||
|                             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-{e.Server.Name}/#{e.Channel.Name}-{DateTime.Now}.txt", JsonConvert.SerializeObject(new { Messages = msgs.Select(s => s.ToString()) }, Formatting.Indented).ToStream()).ConfigureAwait(false); | ||||
|                     }); | ||||
|  | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user