Did a full pass on stuff done so far
This commit is contained in:
		| @@ -1,72 +1,53 @@ | ||||
| //using Discord.Commands; | ||||
| //using NadekoBot.Classes; | ||||
| //using NadekoBot.Modules.Permissions.Classes; | ||||
| //using System; | ||||
| //using System.Linq; | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.Attributes; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| //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 | ||||
| { | ||||
|     //todo DB | ||||
|     public partial class Administration | ||||
|     { | ||||
|         [Group] | ||||
|         public class AutoAssignRole | ||||
|         { | ||||
|             public AutoAssignRole(DiscordSocketClient _client) | ||||
|             { | ||||
|                 _client.UserJoined += (user) => | ||||
|                 { | ||||
|                     //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); | ||||
|                     return Task.CompletedTask; | ||||
|                 }; | ||||
|             } | ||||
|  | ||||
| //        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(); | ||||
|             //[LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|             //[RequireContext(ContextType.Guild)] | ||||
|             //[RequirePermission(GuildPermission.ManageRoles)] | ||||
|             //public async Task AutoAssignRole(IMessage imsg, IRole role) | ||||
|             //{ | ||||
|             //    var channel = imsg.Channel as ITextChannel; | ||||
|  | ||||
| //                    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; | ||||
|             //    } | ||||
|  | ||||
| //                    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); | ||||
|             //} | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
| //using System.Collections.Generic; | ||||
| //using System.Linq; | ||||
|  | ||||
| ////todo DB | ||||
| //namespace NadekoBot.Modules.Administration.Commands | ||||
| //{ | ||||
| //    class CrossServerTextChannel : DiscordCommand | ||||
|   | ||||
| @@ -1,225 +0,0 @@ | ||||
| //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) | ||||
| //        { | ||||
|  | ||||
| //        } | ||||
|  | ||||
| //        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 + "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); | ||||
| //                    } | ||||
| //                }); | ||||
|  | ||||
| //            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()); | ||||
| //                }); | ||||
|  | ||||
| //            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; | ||||
| //                    } | ||||
|  | ||||
| //                    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); | ||||
| //                }); | ||||
|  | ||||
| //            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); | ||||
| //                }); | ||||
| //        } | ||||
|  | ||||
| //        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 | ||||
| ////├ | ||||
| ////─ | ||||
| ////│ | ||||
| ////└ | ||||
| @@ -5,6 +5,7 @@ | ||||
| //using System.IO; | ||||
| //using System.Linq; | ||||
|  | ||||
| ////todo DB | ||||
| //namespace NadekoBot.Modules.Administration.Commands | ||||
| //{ | ||||
| //    internal class IncidentsCommands : DiscordCommand | ||||
|   | ||||
| @@ -9,6 +9,8 @@ | ||||
| //using System.Linq; | ||||
| //using System.Threading.Tasks; | ||||
|  | ||||
| ////todo DB | ||||
| ////todo Add flags for every event | ||||
| //namespace NadekoBot.Modules.Administration.Commands | ||||
| //{ | ||||
| //    internal class LogCommand : DiscordCommand | ||||
|   | ||||
| @@ -6,7 +6,8 @@ | ||||
| //using System.Collections.Concurrent; | ||||
| //using System.Threading.Tasks; | ||||
| //using System.Timers; | ||||
|  | ||||
| ////todo DB | ||||
| ////todo persist restarts | ||||
| //namespace NadekoBot.Modules.Administration.Commands | ||||
| //{ | ||||
| //    class MessageRepeater : DiscordCommand | ||||
|   | ||||
| @@ -12,6 +12,7 @@ | ||||
| //using System.Timers; | ||||
| //using Timer = System.Timers.Timer; | ||||
|  | ||||
| ////todo DB | ||||
| //namespace NadekoBot.Modules.Administration.Commands | ||||
| //{ | ||||
| //    internal class PlayingRotate : DiscordCommand | ||||
|   | ||||
| @@ -1,63 +1,75 @@ | ||||
| //using Discord.Commands; | ||||
| //using NadekoBot.Classes; | ||||
| //using NadekoBot.Modules.Permissions.Classes; | ||||
| //using System; | ||||
| //using System.Collections.Concurrent; | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Classes; | ||||
| using NadekoBot.Extensions; | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| //namespace NadekoBot.Modules.Administration.Commands | ||||
| //{ | ||||
| //    internal class RatelimitCommand : DiscordCommand | ||||
| //    { | ||||
| //todo rewrite to accept msg/sec (for example 1/5 - 1 message every 5 seconds) | ||||
| namespace NadekoBot.Modules.Administration.Commands | ||||
| { | ||||
|     public partial class Administration | ||||
|     { | ||||
|         [Group] | ||||
|         public class RatelimitCommand | ||||
|         { | ||||
|             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 DiscordSocketClient _client { get; } | ||||
|  | ||||
| //        private static readonly TimeSpan ratelimitTime = new TimeSpan(0, 0, 0, 5); | ||||
|             public RatelimitCommand(DiscordSocketClient client) | ||||
|             { | ||||
|  | ||||
| //        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); | ||||
| //            }; | ||||
| //        } | ||||
|                 this._client = client; | ||||
|  | ||||
| //        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); | ||||
| //                    } | ||||
| //                }); | ||||
| //        } | ||||
| //    } | ||||
| //} | ||||
|                _client.MessageReceived += async (imsg) => | ||||
|                 { | ||||
|                     var channel = imsg.Channel as ITextChannel; | ||||
|  | ||||
|                     if (channel == null || await imsg.IsAuthor(client)) | ||||
|                         return; | ||||
|                     ConcurrentDictionary<ulong, DateTime> userTimePair; | ||||
|                     if (!RatelimitingChannels.TryGetValue(channel.Id, out userTimePair)) return; | ||||
|                     DateTime lastMessageTime; | ||||
|                     if (userTimePair.TryGetValue(imsg.Author.Id, out lastMessageTime)) | ||||
|                     { | ||||
|                         if (DateTime.Now - lastMessageTime < ratelimitTime) | ||||
|                         { | ||||
|                             try | ||||
|                             { | ||||
|                                 await imsg.DeleteAsync().ConfigureAwait(false); | ||||
|                             } | ||||
|                             catch { } | ||||
|                             return; | ||||
|                         } | ||||
|                     } | ||||
|                     userTimePair.AddOrUpdate(imsg.Author.Id, id => DateTime.Now, (id, dt) => DateTime.Now); | ||||
|                 }; | ||||
|             } | ||||
|  | ||||
|             [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             public async Task Slowmode(IMessage imsg) | ||||
|             { | ||||
|                 var channel = imsg.Channel as ITextChannel; | ||||
|  | ||||
|                 ConcurrentDictionary<ulong, DateTime> throwaway; | ||||
|                 if (RatelimitingChannels.TryRemove(channel.Id, out throwaway)) | ||||
|                 { | ||||
|                     await imsg.Channel.SendMessageAsync("Slow mode disabled.").ConfigureAwait(false); | ||||
|                     return; | ||||
|                 } | ||||
|                 if (RatelimitingChannels.TryAdd(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); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -7,7 +7,7 @@ | ||||
| //using System.Linq; | ||||
| //using System.Text; | ||||
| //using System.Threading.Tasks; | ||||
|  | ||||
| ////todo DB | ||||
| //namespace NadekoBot.Modules.Administration.Commands | ||||
| //{ | ||||
| //    internal class SelfAssignedRolesCommand : DiscordCommand | ||||
|   | ||||
| @@ -1,42 +1,50 @@ | ||||
| //using Discord.Commands; | ||||
| //using NadekoBot.Classes; | ||||
| //using NadekoBot.Modules.Permissions.Classes; | ||||
| //using Discord; | ||||
| //using Discord.Commands; | ||||
| //using Discord.WebSocket; | ||||
| //using NadekoBot.Attributes; | ||||
| //using System.Linq; | ||||
| //using System.Threading.Tasks; | ||||
|  | ||||
| ////todo owner only | ||||
| //namespace NadekoBot.Modules.Administration.Commands | ||||
| //{ | ||||
| //    class SelfCommands : DiscordCommand | ||||
| //    public partial class Administration | ||||
| //    { | ||||
| //        public SelfCommands(DiscordModule module) : base(module) | ||||
| //        [Group] | ||||
| //        class SelfCommands | ||||
| //        { | ||||
| //        } | ||||
| //            private DiscordSocketClient _client; | ||||
|  | ||||
| //        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 => | ||||
| //            public SelfCommands(DiscordSocketClient client) | ||||
| //            { | ||||
| //                this._client = client; | ||||
| //            } | ||||
|  | ||||
| //            [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
| //            [RequireContext(ContextType.Guild)] | ||||
| //            public async Task Leave(IMessage imsg, [Remainder] string guildStr) | ||||
| //            { | ||||
| //                var channel = imsg.Channel as ITextChannel; | ||||
|  | ||||
| //                guildStr = guildStr.ToUpperInvariant(); | ||||
| //                var server = _client.GetGuilds().FirstOrDefault(g => g.Id.ToString() == guildStr) ?? _client.GetGuilds().FirstOrDefault(g => g.Name.ToUpperInvariant() == guildStr); | ||||
|  | ||||
| //                if (server == null) | ||||
| //                { | ||||
| //                    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); | ||||
| //                }); | ||||
| //                    await imsg.Channel.SendMessageAsync("Cannot find that server").ConfigureAwait(false); | ||||
| //                    return; | ||||
| //                } | ||||
| //                if (server.OwnerId != _client.GetCurrentUser().Id) | ||||
| //                { | ||||
| //                    await server.LeaveAsync().ConfigureAwait(false); | ||||
| //                    await channel.SendMessageAsync("Left server " + server.Name).ConfigureAwait(false); | ||||
| //                } | ||||
| //                else | ||||
| //                { | ||||
| //                    await server.DeleteAsync().ConfigureAwait(false); | ||||
| //                    await channel.SendMessageAsync("Deleted server " + server.Name).ConfigureAwait(false); | ||||
| //                } | ||||
| //            } | ||||
| //        } | ||||
| //    } | ||||
| //} | ||||
| //} | ||||
| @@ -5,19 +5,8 @@ | ||||
| //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)) { } | ||||
|  | ||||
| //    public AsyncLazy(Func<Task<T>> taskFactory) :  | ||||
| //        base(() => Task.Factory.StartNew(() => taskFactory()).Unwrap()) { }  | ||||
|  | ||||
| //    public TaskAwaiter<T> GetAwaiter() { return Value.GetAwaiter(); }  | ||||
| //} | ||||
| //*/ | ||||
|  | ||||
| //// todo DB | ||||
| //// todo rewrite | ||||
| //namespace NadekoBot.Modules.Administration.Commands | ||||
| //{ | ||||
| //    internal class ServerGreetCommand : DiscordCommand | ||||
|   | ||||
| @@ -9,6 +9,8 @@ | ||||
| //using System.Threading.Tasks; | ||||
| //using ChPermOverride = Discord.ChannelPermissionOverrides; | ||||
|  | ||||
| ////todo DB | ||||
| ////todo rewrite | ||||
| //namespace NadekoBot.Modules.Administration.Commands | ||||
| //{ | ||||
| //    internal class VoicePlusTextCommand : DiscordCommand | ||||
|   | ||||
| @@ -12,7 +12,6 @@ namespace NadekoBot.Modules.Games.Commands | ||||
| { | ||||
|     public partial class GamesModule | ||||
|     { | ||||
|  | ||||
|         //todo DB in the future | ||||
|         public static ConcurrentDictionary<IGuild, Poll> ActivePolls = new ConcurrentDictionary<IGuild, Poll>(); | ||||
|  | ||||
|   | ||||
| @@ -14,7 +14,6 @@ | ||||
| ////todo Rewrite? | ||||
| //namespace NadekoBot.Modules.Games.Commands | ||||
| //{ | ||||
|  | ||||
| //    public static class SentencesProvider | ||||
| //    { | ||||
| //        internal static string GetRandomSentence() | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| //using System.Threading; | ||||
| //using System.Threading.Tasks; | ||||
|  | ||||
| //todo Unit Conversion lib | ||||
| ////todo Unit Conversion lib | ||||
| //namespace NadekoBot.Modules.Searches.Commands | ||||
| //{ | ||||
| //    class ConverterCommand : DiscordCommand | ||||
|   | ||||
| @@ -19,13 +19,10 @@ namespace NadekoBot.Modules.Searches | ||||
|     [Module("~", AppendSpace = false)] | ||||
|     public class Searches : DiscordModule | ||||
|     { | ||||
|         private readonly Random rng; | ||||
|  | ||||
|         private IYoutubeService _yt { get; } | ||||
|  | ||||
|         public Searches(ILocalization loc, CommandService cmds, IBotConfiguration config, IDiscordClient client, IYoutubeService youtube) : base(loc, cmds, config, client) | ||||
|         { | ||||
|             rng = new Random(); | ||||
|             _yt = youtube; | ||||
|         } | ||||
|  | ||||
| @@ -156,6 +153,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 | ||||
|             { | ||||
|                 using (var http = new HttpClient()) | ||||
|                 { | ||||
|                     var rng = new Random(); | ||||
|                     var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(query)}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&start={ rng.Next(1, 50) }&fields=items%2Flink&key={NadekoBot.Credentials.GoogleApiKey}"; | ||||
|                     var obj = JObject.Parse(await http.GetStringAsync(reqString).ConfigureAwait(false)); | ||||
|                     var items = obj["items"] as JArray; | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| using Discord; | ||||
| using Discord.WebSocket; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| @@ -25,6 +26,9 @@ namespace NadekoBot.Extensions | ||||
|         public static async Task<IMessage> Reply(this IMessage msg, string content) =>  | ||||
|             await msg.Channel.SendMessageAsync(content).ConfigureAwait(false); | ||||
|  | ||||
|         public static Task<bool> IsAuthor(this IMessage msg, DiscordSocketClient client) => | ||||
|             Task.FromResult(client.GetCurrentUser().Id == msg.Author.Id); | ||||
|  | ||||
|         public static async Task<IEnumerable<IUser>> Members(this IRole role) => | ||||
|             await role.Members(); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user