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