Beispiel #1
0
 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.")
     .Parameter("minutes", ParameterType.Optional)
     .AddCheck(SimpleCheckers.ManageMessages())
     .Do(async e =>
     {
         //var minutesStr = e.GetArg("minutes");
         //if (string.IsNullOrWhiteSpace(minutesStr)) {
         //    RatelimitingChannels.Remove(e.Channel.Id);
         //    return;
         //}
         ConcurrentDictionary <ulong, DateTime> throwaway;
         if (RatelimitingChannels.TryRemove(e.Channel.Id, out throwaway))
         {
             await e.Channel.SendMessage("Slow mode disabled.").ConfigureAwait(false);
             return;
         }
         if (RatelimitingChannels.TryAdd(e.Channel.Id, new ConcurrentDictionary <ulong, DateTime>()))
         {
             await e.Channel.SendMessage("Slow mode initiated. " +
                                         "Users can't send more than 1 message every 5 seconds.")
             .ConfigureAwait(false);
         }
     });
 }
Beispiel #2
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "listincidents")
            .Alias(Prefix + "lin")
            .Description($"Listet alle UNGELESENEN Vorfälle und markiert sie als gelesen. | `{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)));
            });

            cgb.CreateCommand(Module.Prefix + "listallincidents")
            .Alias(Prefix + "lain")
            .Description($"Sendet dir eine Datei mit allen Vorfällen und markiert sie als gelesen. | `{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);
            });
        }
Beispiel #3
0
        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)));
            });

            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);
            });
        }
Beispiel #4
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "cleanv+t")
            .Description("Deletes all text channels ending in `-voice` for which voicechannels are not found. **Use at your own risk.**")
            .AddCheck(SimpleCheckers.CanManageRoles)
            .AddCheck(SimpleCheckers.ManageChannels())
            .Do(async e =>
            {
                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));

                invalidTxtChannels.ForEach(async c => await c.Delete());

                await e.Channel.SendMessage("`Done.`");
            });

            cgb.CreateCommand(Module.Prefix + "v+t")
            .Alias(Module.Prefix + "voice+text")
            .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.")
            .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 e.Channel.SendMessage(
                                    ":anger: Error: Most likely i don't have permissions to do this.")
                                .ConfigureAwait(false);
                                return;
                            }
                        }
                        await e.Channel.SendMessage("Successfuly removed voice + text feature.").ConfigureAwait(false);
                        return;
                    }
                    config.VoicePlusTextEnabled = true;
                    await e.Channel.SendMessage("Successfuly enabled voice + text feature. " +
                                                "**Make sure the bot has manage roles and manage channels permissions**")
                    .ConfigureAwait(false);
                }
                catch (Exception ex)
                {
                    await e.Channel.SendMessage(ex.ToString()).ConfigureAwait(false);
                }
            });
        }
Beispiel #5
0
 internal override void Init(CommandGroupBuilder cgb)
 {
     cgb.CreateCommand(Module.Prefix + "leave")
     .Description("Makes Nadeko leave the server. Either name or id required.\n**Usage**: `.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 e.Channel.SendMessage("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);
     });
 }
Beispiel #6
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "h")
            .Alias(Module.Prefix + "help", NadekoBot.BotMention + " help", NadekoBot.BotMention + " h", "~h")
            .Description($"Either shows a help for a single command, or PMs you help link if no arguments are specified. | `{Prefix}h !m q` or just `{Prefix}h` ")
            .Parameter("command", ParameterType.Unparsed)
            .Do(HelpFunc());
            cgb.CreateCommand(Module.Prefix + "hgit")
            .Description($"Generates the commandlist.md file. **Bot Owner Only!** | `{Prefix}hgit`")
            .AddCheck(SimpleCheckers.OwnerOnly())
            .Do(DoGitFunc());
            cgb.CreateCommand(Module.Prefix + "readme")
            .Alias(Module.Prefix + "guide")
            .Description($"Sends a readme and a guide links to the channel. | `{Prefix}readme` or `{Prefix}guide`")
            .Do(async e =>
                await e.Channel.SendMessage(
                    @"**LIST OF COMMANDS**: Type -modules
**Hosting Guides and docs can be found here**: <http://nadekobot.rtfd.io>").ConfigureAwait(false));

            cgb.CreateCommand(Module.Prefix + "donate")
            .Alias("~donate")
            .Description($"Instructions for helping the project! | `{Prefix}donate` or `~donate`")
            .Do(async e =>
            {
                await e.Channel.SendMessage(
                    $@"You can support the project that YoumuBot was built on using patreon. <https://patreon.com/nadekobot> or
You can send donations to `[email protected]`
Don't forget to leave your discord name or id in the message.

**Thank you** ♥️").ConfigureAwait(false);
            });
        }
Beispiel #7
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "h")
            .Alias(Module.Prefix + "help", WizBot.BotMention + " help", WizBot.BotMention + " h", "~h")
            .Description("Either shows a help for a single command, or PMs you help link if no arguments are specified.\n**Usage**: '-h !m q' or just '-h' ")
            .Parameter("command", ParameterType.Unparsed)
            .Do(HelpFunc());
            cgb.CreateCommand(Module.Prefix + "hgit")
            .Description("Generates the commandlist.md file. **Owner Only!**")
            .AddCheck(SimpleCheckers.OwnerOnly())
            .Do(DoGitFunc());
            cgb.CreateCommand(Module.Prefix + "readme")
            .Alias(Module.Prefix + "guide")
            .Description("Sends a readme and a guide links to the channel.")
            .Do(async e =>
                await e.Channel.SendMessage(
                    @"**FULL README**: <None>
**GUIDE ONLY**: <None>
**WINDOWS SETUP GUIDE**: <None>
**LINUX SETUP GUIDE**: <None>
**LIST OF COMMANDS**: <http://wizkiller96network.com/wizbot-cmds.html>").ConfigureAwait(false));

            cgb.CreateCommand(Module.Prefix + "donate")
            .Alias("~donate")
            .Description("Instructions for helping the project!")
            .Do(async e =>
            {
                await e.Channel.SendMessage(
                    $@"I've created a **paypal** email for WizBot, so if you wish to support the project, you can send your donations to `[email protected]`
Don't forget to leave your discord name or id in the message, so that I can reward people who help out.
You can join WizBot server by typing {Module.Prefix}h and you will get an invite in a private message.
*If you want to support in some other way or on a different platform, please message me*"
                    ).ConfigureAwait(false);
            });
        }
Beispiel #8
0
 internal override void Init(CommandGroupBuilder cgb)
 {
     cgb.CreateCommand(Module.Prefix + "leave")
     .Description($"Lässt {BotName} den Server verlassen. Entweder Name, oder ID benötigt. | `{Prefix}leave 123123123331`")
     .Parameter("arg", ParameterType.Required)
     .AddCheck(SimpleCheckers.OwnerOnly())
     .Do(async e =>
     {
         var arg    = e.GetArg("arg").Trim();
         var server = MidnightBot.Client.Servers.FirstOrDefault(s => s.Id.ToString() == arg) ??
                      MidnightBot.Client.FindServers(arg).FirstOrDefault();
         if (server == null)
         {
             await e.Channel.SendMessage("Kann Server nicht finden.").ConfigureAwait(false);
             return;
         }
         if (!server.IsOwner)
         {
             await server.Leave().ConfigureAwait(false);
         }
         else
         {
             await server.Delete().ConfigureAwait(false);
         }
         await MidnightBot.SendMessageToOwner($"Server {server.Name} verlassen.").ConfigureAwait(false);
     });
 }
Beispiel #9
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "repeat")
            .Description("Repeat a message every X minutes. If no parameters are specified, " +
                         "repeat is disabled. Requires manage messages.\n**Usage**:`.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))
                {
                    await e.Channel.SendMessage("Repeating disabled").ConfigureAwait(false);
                    Repeater rep;
                    if (repeaters.TryRemove(e.Server, out rep))
                    {
                        rep.MessageTimer.Stop();
                    }
                    return;
                }
                int minutes;
                if (!int.TryParse(minutesStr, out minutes) || minutes < 1 || minutes > 1440)
                {
                    await e.Channel.SendMessage("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()
                    );

                if (!string.IsNullOrWhiteSpace(msg))
                {
                    repeater.RepeatingMessage = msg;
                }

                repeater.MessageTimer.Stop();
                repeater.MessageTimer.Start();

                await e.Channel.SendMessage(String.Format("👌 Repeating `{0}` every " +
                                                          "**{1}** minutes on {2} channel.",
                                                          repeater.RepeatingMessage, minutes, repeater.RepeatingChannel))
                .ConfigureAwait(false);
            });
        }
Beispiel #10
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "scsc")
            .Description("Startet eine Instanz eines Cross Server Channels. Du bekommst einen Token " +
                         $"den andere Benutzer benutzen müssen, um auf die selbe Instanz zu kommen.. | `{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("Das ist dein CSC Token:" + token.ToString()).ConfigureAwait(false);
                }
            });

            cgb.CreateCommand(Module.Prefix + "jcsc")
            .Description($"Joint derzeitigen Channel einer Instanz des Cross Server Channel durch Benutzung des Tokens. | `{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 e.Channel.SendMessage(":ok:").ConfigureAwait(false);
            });

            cgb.CreateCommand(Module.Prefix + "lcsc")
            .Description($"Verlässt Cross server Channel Instance von diesem Channel. | `{Prefix}lcsc`")
            .AddCheck(SimpleCheckers.ManageServer())
            .Do(async e =>
            {
                foreach (var subscriber in Subscribers)
                {
                    subscriber.Value.Remove(e.Channel);
                }
                await e.Channel.SendMessage(":ok:").ConfigureAwait(false);
            });
        }
Beispiel #11
0
        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 e.Channel.SendMessage(":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 e.Channel.SendMessage(":ok:").ConfigureAwait(false);
            });
        }
Beispiel #12
0
 internal override void Init(CommandGroupBuilder cgb)
 {
     cgb.CreateCommand(Module.Prefix + "slowmode")
     .Description($"Schaltet Slow Mode um. Wenn AN, Benutzer können nur alle 5 Sekunden eine Nachricht schicken. | `{Prefix}slowmode`")
     .AddCheck(SimpleCheckers.ManageMessages())
     .Do(async e =>
     {
         ConcurrentDictionary <ulong, DateTime> throwaway;
         if (RatelimitingChannels.TryRemove(e.Channel.Id, out throwaway))
         {
             await e.Channel.SendMessage("Slow Mode deaktiviert.").ConfigureAwait(false);
             return;
         }
         if (RatelimitingChannels.TryAdd(e.Channel.Id, new ConcurrentDictionary <ulong, DateTime> ()))
         {
             await e.Channel.SendMessage("Slow Mode aktivier. " +
                                         "Benutzer können nicht mehr als 1 Nachricht, alle 5 Sekunden schicken.")
             .ConfigureAwait(false);
         }
     });
 }
Beispiel #13
0
 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 e.Channel.SendMessage("Slow mode disabled.").ConfigureAwait(false);
             return;
         }
         if (RatelimitingChannels.TryAdd(e.Channel.Id, new ConcurrentDictionary <ulong, DateTime>()))
         {
             await e.Channel.SendMessage("Slow mode initiated. " +
                                         "Users can't send more than 1 message every 5 seconds.")
             .ConfigureAwait(false);
         }
     });
 }
Beispiel #14
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "h")
            .Alias(Module.Prefix + "help", MidnightBot.BotMention + " help", MidnightBot.BotMention + " h", "~h")
            .Description("Hilfe-Befehl. | `-h !m q` oder einfach `-h`")
            .Parameter("module", ParameterType.Unparsed)
            .Do(HelpFunc());
            cgb.CreateCommand(Module.Prefix + "hh")
            .Description("Hilfe-Befehl. | `-hh !m q` or just `-h` ")
            .Parameter("command", ParameterType.Unparsed)
            .Do(NewHelpFunc());
            cgb.CreateCommand(Module.Prefix + "hgit")
            .Description($"commandlist.md Datei erstellung. **Bot Owner Only!** | `{Prefix}hgit`")
            .AddCheck(SimpleCheckers.OwnerOnly())
            .Do(DoGitFunc());
            cgb.CreateCommand(Module.Prefix + "readme")
            .Alias(Module.Prefix + "guide")
            .Description($"Sendet eine readme und ein Guide verlinkt zum Channel. | `{Prefix}readme` or `{Prefix}guide`")
            .AddCheck(SimpleCheckers.OwnerOnly())
            .Do(async e =>
                await e.Channel.SendMessage(
                    @"**Wiki with all info**: <https://github.com/Midnight-Myth/MidnightBot/wiki>

 **WINDOWS SETUP GUIDE**: <https://github.com/Midnight-Myth/MidnightBot/blob/master/ComprehensiveGuide.md>
  
 **LINUX SETUP GUIDE**: <https://github.com/Midnight-Myth/MidnightBot/blob/master/LinuxSetup.md>

**LIST OF COMMANDS**: <https://github.com/Midnight-Myth/MidnightBot/blob/master/commandlist.md>").ConfigureAwait(false));

            cgb.CreateCommand(Module.Prefix + "donate")
            .Alias("~donate")
            .Description($"Informationen um das Projekt zu unterstützen! | `{Prefix}donate` or `{Prefix}donate`")
            .Do(async e =>
            {
                await e.Channel.SendMessage(
                    @"Habt Spaß"
                    ).ConfigureAwait(false);
            });
        }
Beispiel #15
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "h")
            .Alias(Module.Prefix + "help", NadekoBot.BotMention + " help", NadekoBot.BotMention + " h", "~h")
            .Description($"Either shows a help for a single command, or PMs you help link if no arguments are specified. | `{Prefix}h !m q` or just `{Prefix}h` ")
            .Parameter("command", ParameterType.Unparsed)
            .Do(HelpFunc());
            cgb.CreateCommand(Module.Prefix + "hgit")
            .Description($"Generates the commandlist.md file. **Bot Owner Only!** | `{Prefix}hgit`")
            .AddCheck(SimpleCheckers.OwnerOnly())
            .Do(DoGitFunc());
            cgb.CreateCommand(Module.Prefix + "readme")
            .Alias(Module.Prefix + "guide")
            .Description($"Sends a readme and a guide links to the channel. | `{Prefix}readme` or `{Prefix}guide`")
            .Do(async e =>
                await e.Channel.SendMessage(
                    @"**Wiki with all info**: <https://github.com/Kwoth/NadekoBot/wiki>

**WINDOWS SETUP GUIDE**: <https://github.com/Kwoth/NadekoBot/blob/master/ComprehensiveGuide.md>

**LINUX SETUP GUIDE**: <https://github.com/Kwoth/NadekoBot/blob/master/LinuxSetup.md>

**LIST OF COMMANDS**: <https://github.com/Kwoth/NadekoBot/blob/master/commandlist.md>").ConfigureAwait(false));

            cgb.CreateCommand(Module.Prefix + "donate")
            .Alias("~donate")
            .Description($"Instructions for helping the project! | `{Prefix}donate` or `~donate`")
            .Do(async e =>
            {
                await e.Channel.SendMessage(
                    $@"You can support the project on patreon. <https://patreon.com/nadekobot> or
You can send donations to `[email protected]`
Don't forget to leave your discord name or id in the message.

**Thank you** ♥️").ConfigureAwait(false);
            });
        }
Beispiel #16
0
        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 " + slowtime + " seconds. **Needs Manage Messages or Kick Members Permissions.**| `{Prefix}slowmode`")
            .AddCheck(SimpleCheckers.KickMembersOrManageServer())
            .Parameter("msg", ParameterType.Unparsed)
            .Do(async e =>
            {
                try
                {
                    slowtime = Int32.Parse(e.GetArg("msg"));
                }
                catch (FormatException x)
                {
                    Console.WriteLine(x.Message);
                }

                if (slowtime == 0 || string.IsNullOrWhiteSpace(e.GetArg("msg")))
                {
                    slowtime = 10;
                }
                ConcurrentDictionary <ulong, DateTime> throwaway;
                if (RatelimitingChannels.TryRemove(e.Channel.Id, out throwaway))
                {
                    await e.Channel.SendMessage("Slow mode disabled.").ConfigureAwait(false);
                    return;
                }
                if (RatelimitingChannels.TryAdd(e.Channel.Id, new ConcurrentDictionary <ulong, DateTime>()))
                {
                    await e.Channel.SendMessage("Slow mode initiated. " +
                                                "Users can't send more than 1 message every " + slowtime + " seconds.")
                    .ConfigureAwait(false);
                    return;
                }
            });
        }
Beispiel #17
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "repeatinvoke")
            .Alias(Module.Prefix + "repinv")
            .Description($"Zeigt die Repeat Nachricht sofort an und startet den Timer neu. | `{Prefix}repinv`")
            .AddCheck(SimpleCheckers.ManageMessages())
            .Do(async e =>
            {
                Repeater rep;
                if (!repeaters.TryGetValue(e.Server, out rep))
                {
                    await e.Channel.SendMessage("`Keine Nachricht die auf diesem Server wiederholt wird.`");
                    return;
                }

                await rep.Invoke();
            });


            cgb.CreateCommand(Module.Prefix + "repeat")
            .Description("Wiederholt eine Nachricht alle X Minuten. Falls nicht spezifiziert, " +
                         $"Wiederholung ist deaktiviert. Benötigt 'manage messages'. | `{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))
                {
                    Repeater rep;
                    if (!repeaters.TryRemove(e.Server, out rep))
                    {
                        return;
                    }
                    rep.MessageTimer.Stop();
                    await e.Channel.SendMessage("Wiederholung deaktiviert").ConfigureAwait(false);
                    return;
                }
                int minutes;
                if (!int.TryParse(minutesStr, out minutes) || minutes < 1 || minutes > 1440)
                {
                    await e.Channel.SendMessage("Ungüültige Eingabe").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()
                    );

                if (!string.IsNullOrWhiteSpace(msg))
                {
                    repeater.RepeatingMessage = msg;
                }

                repeater.MessageTimer.Stop();
                repeater.MessageTimer.Start();

                await e.Channel.SendMessage(String.Format("👌 Wiederhole `{0}` alle " +
                                                          "**{1}** Minuten auf Channel {2}.",
                                                          repeater.RepeatingMessage, minutes, repeater.RepeatingChannel))
                .ConfigureAwait(false);
            });
        }
Beispiel #18
0
        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 e.Channel.SendMessage("🆗 `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 e.Channel.SendMessage("`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 e.Channel.SendMessage(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 e.Channel.SendMessage($"🆗 `Removed playing string #{num}`({str})").ConfigureAwait(false);
            });
        }
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "remind")
            .Description("Sends a message to you or a channel after certain amount of time. " +
                         "First argument is me/here/'channelname'. Second argument is time in a descending order (mo>w>d>h>m) example: 1w5d3h10m. " +
                         "Third argument is a (multiword)message. " +
                         "\n**Usage**: `.remind me 1d5h Do something` or `.remind #general Start now!`")
            .Parameter("meorchannel", ParameterType.Required)
            .Parameter("time", ParameterType.Required)
            .Parameter("message", ParameterType.Unparsed)
            .Do(async e =>
            {
                var meorchStr = e.GetArg("meorchannel").ToUpperInvariant();
                Channel ch;
                bool isPrivate = false;
                if (meorchStr == "ME")
                {
                    isPrivate = true;
                    ch        = await e.User.CreatePMChannel().ConfigureAwait(false);
                }
                else if (meorchStr == "HERE")
                {
                    ch = e.Channel;
                }
                else
                {
                    ch = e.Server.FindChannels(meorchStr).FirstOrDefault();
                }

                if (ch == null)
                {
                    await e.Channel.SendMessage($"{e.User.Mention} Something went wrong (channel cannot be found) ;(").ConfigureAwait(false);
                    return;
                }

                var timeStr = e.GetArg("time");

                var m = regex.Match(timeStr);

                if (m.Length == 0)
                {
                    await e.Channel.SendMessage("Not a valid time format blablabla").ConfigureAwait(false);
                    return;
                }

                string output      = "";
                var namesAndValues = new Dictionary <string, int>();

                foreach (var groupName in regex.GetGroupNames())
                {
                    if (groupName == "0")
                    {
                        continue;
                    }
                    int value = 0;
                    int.TryParse(m.Groups[groupName].Value, out value);

                    if (string.IsNullOrEmpty(m.Groups[groupName].Value))
                    {
                        namesAndValues[groupName] = 0;
                        continue;
                    }
                    else if (value < 1 ||
                             (groupName == "months" && value > 1) ||
                             (groupName == "weeks" && value > 4) ||
                             (groupName == "days" && value >= 7) ||
                             (groupName == "hours" && value > 23) ||
                             (groupName == "minutes" && value > 59))
                    {
                        await e.Channel.SendMessage($"Invalid {groupName} value.").ConfigureAwait(false);
                        return;
                    }
                    else
                    {
                        namesAndValues[groupName] = value;
                    }
                    output += m.Groups[groupName].Value + " " + groupName + " ";
                }
                var time = DateTime.Now + new TimeSpan(30 * namesAndValues["months"] +
                                                       7 * namesAndValues["weeks"] +
                                                       namesAndValues["days"],
                                                       namesAndValues["hours"],
                                                       namesAndValues["minutes"],
                                                       0);

                var rem = new Reminder
                {
                    ChannelId = (long)ch.Id,
                    IsPrivate = isPrivate,
                    When      = time,
                    Message   = e.GetArg("message"),
                    UserId    = (long)e.User.Id,
                    ServerId  = (long)e.Server.Id
                };
                DbHandler.Instance.InsertData(rem);

                reminders.Add(StartNewReminder(rem));

                await e.Channel.SendMessage($"⏰ I will remind \"{ch.Name}\" to \"{e.GetArg("message").ToString()}\" in {output}. ({time:d.M.yyyy.} at {time:HH:mm})").ConfigureAwait(false);
            });
            cgb.CreateCommand(Module.Prefix + "remindmsg")
            .Description("Sets message for when the remind is triggered. " +
                         " Available placeholders are %user% - user who ran the command, %message% -" +
                         " Message specified in the remind, %target% - target channel of the remind. **Owner only!**")
            .Parameter("msg", ParameterType.Unparsed)
            .AddCheck(SimpleCheckers.OwnerOnly())
            .Do(async e =>
            {
                var arg = e.GetArg("msg")?.Trim();
                if (string.IsNullOrWhiteSpace(arg))
                {
                    return;
                }

                WizBot.Config.RemindMessageFormat = arg;
                await e.Channel.SendMessage("`New remind message set.`");
            });
        }
Beispiel #20
0
        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 e.Channel.SendMessage($"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 e.Channel.SendMessage($"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 e.Channel.SendMessage("`There are no custom reactions.`");
                }
                else
                {
                    string result = SearchHelper.ShowInPrettyCode <string>(cmds, s => $"{s,-25}");    //People prefer starting with 1
                    await e.Channel.SendMessage($"`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 e.Channel.SendMessage("`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 e.Channel.SendMessage(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 e.Channel.SendMessage("`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 e.Channel.SendMessage("`Invalid index.`").ConfigureAwait(false);
                    return;
                }
                index = index - 1;
                NadekoBot.Config.CustomReactions[name][index] = msg;

                await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
                await e.Channel.SendMessage($"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 e.Channel.SendMessage("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 e.Channel.SendMessage("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 e.Channel.SendMessage(message).ConfigureAwait(false);
            });
        }
Beispiel #21
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                var client = manager.Client;

                commands.ForEach(cmd => cmd.Init(cgb));

                cgb.CreateCommand(Prefix + "sr").Alias(Prefix + "setrole")
                .Description("Sets a role for a given user.\n**Usage**: .sr @User Guest")
                .Parameter("user_name", ParameterType.Required)
                .Parameter("role_name", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.CanManageRoles)
                .Do(async e =>
                {
                    var userName = e.GetArg("user_name");
                    var roleName = e.GetArg("role_name");

                    if (string.IsNullOrWhiteSpace(roleName))
                    {
                        return;
                    }

                    if (!e.User.ServerPermissions.ManageRoles)
                    {
                        await e.Channel.SendMessage("You have insufficient permissions.").ConfigureAwait(false);
                    }

                    var usr = e.Server.FindUsers(userName).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("You failed to supply a valid username").ConfigureAwait(false);
                        return;
                    }

                    var role = e.Server.FindRoles(roleName).FirstOrDefault();
                    if (role == null)
                    {
                        await e.Channel.SendMessage("You failed to supply a valid role").ConfigureAwait(false);
                        return;
                    }

                    try
                    {
                        await usr.AddRoles(role).ConfigureAwait(false);
                        await e.Channel.SendMessage($"Successfully added role **{role.Name}** to user **{usr.Name}**").ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Failed to add roles. Bot has insufficient permissions.\n").ConfigureAwait(false);
                        Console.WriteLine(ex.ToString());
                    }
                });

                cgb.CreateCommand(Prefix + "rr").Alias(Prefix + "removerole")
                .Description("Removes a role from a given user.\n**Usage**: .rr @User Admin")
                .Parameter("user_name", ParameterType.Required)
                .Parameter("role_name", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.CanManageRoles)
                .Do(async e =>
                {
                    var userName = e.GetArg("user_name");
                    var roleName = e.GetArg("role_name");

                    if (string.IsNullOrWhiteSpace(roleName))
                    {
                        return;
                    }

                    var usr = e.Server.FindUsers(userName).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("You failed to supply a valid username").ConfigureAwait(false);
                        return;
                    }

                    var role = e.Server.FindRoles(roleName).FirstOrDefault();
                    if (role == null)
                    {
                        await e.Channel.SendMessage("You failed to supply a valid role").ConfigureAwait(false);
                        return;
                    }

                    try
                    {
                        await usr.RemoveRoles(role).ConfigureAwait(false);
                        await e.Channel.SendMessage($"Successfully removed role **{role.Name}** from user **{usr.Name}**").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "rar").Alias(Prefix + "removeallroles")
                .Description("Removes all roles from a mentioned user.\n**Usage**: .rar @User")
                .Parameter("user_name", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.CanManageRoles)
                .Do(async e =>
                {
                    var userName = e.GetArg("user_name");

                    var usr = e.Server.FindUsers(userName).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("You failed to supply a valid username").ConfigureAwait(false);
                        return;
                    }

                    try
                    {
                        await usr.RemoveRoles(usr.Roles.ToArray()).ConfigureAwait(false);
                        await e.Channel.SendMessage($"Successfully removed **all** roles from user **{usr.Name}**").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "r").Alias(Prefix + "role").Alias(Prefix + "cr")
                .Description("Creates a role with a given name.**Usage**: `.r Awesome Role`")
                .Parameter("role_name", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.CanManageRoles)
                .Do(async e =>
                {
                    if (string.IsNullOrWhiteSpace(e.GetArg("role_name")))
                    {
                        return;
                    }
                    try
                    {
                        var r = await e.Server.CreateRole(e.GetArg("role_name")).ConfigureAwait(false);
                        await e.Channel.SendMessage($"Successfully created role **{r.Name}**.").ConfigureAwait(false);
                    }
                    catch (Exception)
                    {
                        await e.Channel.SendMessage(":warning: Unspecified error.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "rolecolor").Alias(Prefix + "rc")
                .Parameter("role_name", ParameterType.Required)
                .Parameter("r", ParameterType.Optional)
                .Parameter("g", ParameterType.Optional)
                .Parameter("b", ParameterType.Optional)
                .Description("Set a role's color to the hex or 0-255 rgb color value provided.\n**Usage**: `.color Admin 255 200 100` or `.color Admin ffba55`")
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.ManageRoles)
                    {
                        await e.Channel.SendMessage("You don't have permission to use this!").ConfigureAwait(false);
                        return;
                    }

                    var args = e.Args.Where(s => s != string.Empty);

                    if (args.Count() != 2 && args.Count() != 4)
                    {
                        await e.Channel.SendMessage("The parameters are invalid.").ConfigureAwait(false);
                        return;
                    }

                    var role = e.Server.FindRoles(e.Args[0]).FirstOrDefault();

                    if (role == null)
                    {
                        await e.Channel.SendMessage("That role does not exist.").ConfigureAwait(false);
                        return;
                    }
                    try
                    {
                        var rgb  = args.Count() == 4;
                        var arg1 = e.Args[1].Replace("#", "");

                        var red   = Convert.ToByte(rgb ? int.Parse(arg1) : Convert.ToInt32(arg1.Substring(0, 2), 16));
                        var green = Convert.ToByte(rgb ? int.Parse(e.Args[2]) : Convert.ToInt32(arg1.Substring(2, 2), 16));
                        var blue  = Convert.ToByte(rgb ? int.Parse(e.Args[3]) : Convert.ToInt32(arg1.Substring(4, 2), 16));

                        await role.Edit(color: new Color(red, green, blue)).ConfigureAwait(false);
                        await e.Channel.SendMessage($"Role {role.Name}'s color has been changed.").ConfigureAwait(false);
                    }
                    catch (Exception)
                    {
                        await e.Channel.SendMessage("Error occured, most likely invalid parameters or insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "roles")
                .Description("List all roles on this server or a single user if specified.")
                .Parameter("user", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!string.IsNullOrWhiteSpace(e.GetArg("user")))
                    {
                        var usr = e.Server.FindUsers(e.GetArg("user")).FirstOrDefault();
                        if (usr == null)
                        {
                            return;
                        }

                        await e.Channel.SendMessage($"`List of roles for **{usr.Name}**:` \n• " + string.Join("\n• ", usr.Roles)).ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage("`List of roles:` \n• " + string.Join("\n• ", e.Server.Roles)).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "b").Alias(Prefix + "ban")
                .Parameter("user", ParameterType.Required)
                .Parameter("msg", ParameterType.Optional)
                .Description("Bans a user by id or name with an optional message.\n**Usage**: .b \"@some Guy\" Your behaviour is toxic.")
                .Do(async e =>
                {
                    var msg  = e.GetArg("msg");
                    var user = e.GetArg("user");
                    if (e.User.ServerPermissions.BanMembers)
                    {
                        var usr = e.Server.FindUsers(user).FirstOrDefault();
                        if (usr == null)
                        {
                            await e.Channel.SendMessage("User not found.").ConfigureAwait(false);
                            return;
                        }
                        if (!string.IsNullOrWhiteSpace(msg))
                        {
                            await usr.SendMessage($"**You have been BANNED from `{e.Server.Name}` server.**\n" +
                                                  $"Reason: {msg}").ConfigureAwait(false);
                            await Task.Delay(2000).ConfigureAwait(false);         // temp solution; give time for a message to be send, fu volt
                        }
                        try
                        {
                            await e.Server.Ban(usr).ConfigureAwait(false);

                            await e.Channel.SendMessage("Banned user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false);
                        }
                        catch
                        {
                            await e.Channel.SendMessage("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false);
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "k").Alias(Prefix + "kick")
                .Parameter("user")
                .Parameter("msg", ParameterType.Unparsed)
                .Description("Kicks a mentioned user.")
                .Do(async e =>
                {
                    var msg  = e.GetArg("msg");
                    var user = e.GetArg("user");
                    if (e.User.ServerPermissions.KickMembers)
                    {
                        var usr = e.Server.FindUsers(user).FirstOrDefault();
                        if (usr == null)
                        {
                            await e.Channel.SendMessage("User not found.").ConfigureAwait(false);
                            return;
                        }
                        if (!string.IsNullOrWhiteSpace(msg))
                        {
                            await usr.SendMessage($"**You have been KICKED from `{e.Server.Name}` server.**\n" +
                                                  $"Reason: {msg}").ConfigureAwait(false);
                            await Task.Delay(2000).ConfigureAwait(false);     // temp solution; give time for a message to be send, fu volt
                        }
                        try
                        {
                            await usr.Kick().ConfigureAwait(false);
                            await e.Channel.SendMessage("Kicked user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false);
                        }
                        catch
                        {
                            await e.Channel.SendMessage("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false);
                        }
                    }
                });
                cgb.CreateCommand(Prefix + "mute")
                .Description("Mutes mentioned user or users.")
                .Parameter("throwaway", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.MuteMembers)
                    {
                        await e.Channel.SendMessage("You do not have permission to do that.").ConfigureAwait(false);
                        return;
                    }
                    if (!e.Message.MentionedUsers.Any())
                    {
                        return;
                    }
                    try
                    {
                        foreach (var u in e.Message.MentionedUsers)
                        {
                            await u.Edit(isMuted: true).ConfigureAwait(false);
                        }
                        await e.Channel.SendMessage("Mute successful").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("I do not have permission to do that most likely.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "unmute")
                .Description("Unmutes mentioned user or users.")
                .Parameter("throwaway", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.MuteMembers)
                    {
                        await e.Channel.SendMessage("You do not have permission to do that.").ConfigureAwait(false);
                        return;
                    }
                    if (!e.Message.MentionedUsers.Any())
                    {
                        return;
                    }
                    try
                    {
                        foreach (var u in e.Message.MentionedUsers)
                        {
                            await u.Edit(isMuted: false).ConfigureAwait(false);
                        }
                        await e.Channel.SendMessage("Unmute successful").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("I do not have permission to do that most likely.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "deafen")
                .Alias(Prefix + "deaf")
                .Description("Deafens mentioned user or users")
                .Parameter("throwaway", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.DeafenMembers)
                    {
                        await e.Channel.SendMessage("You do not have permission to do that.").ConfigureAwait(false);
                        return;
                    }
                    if (!e.Message.MentionedUsers.Any())
                    {
                        return;
                    }
                    try
                    {
                        foreach (var u in e.Message.MentionedUsers)
                        {
                            await u.Edit(isDeafened: true).ConfigureAwait(false);
                        }
                        await e.Channel.SendMessage("Deafen successful").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("I do not have permission to do that most likely.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "undeafen")
                .Alias(Prefix + "undeaf")
                .Description("Undeafens mentioned user or users")
                .Parameter("throwaway", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.DeafenMembers)
                    {
                        await e.Channel.SendMessage("You do not have permission to do that.").ConfigureAwait(false);
                        return;
                    }
                    if (!e.Message.MentionedUsers.Any())
                    {
                        return;
                    }
                    try
                    {
                        foreach (var u in e.Message.MentionedUsers)
                        {
                            await u.Edit(isDeafened: false).ConfigureAwait(false);
                        }
                        await e.Channel.SendMessage("Undeafen successful").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("I do not have permission to do that most likely.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "rvch")
                .Description("Removes a voice channel with a given name.")
                .Parameter("channel_name", ParameterType.Required)
                .Do(async e =>
                {
                    try
                    {
                        if (e.User.ServerPermissions.ManageChannels)
                        {
                            var ch = e.Server.FindChannels(e.GetArg("channel_name"), ChannelType.Voice).FirstOrDefault();
                            if (ch == null)
                            {
                                return;
                            }
                            await ch.Delete().ConfigureAwait(false);
                            await e.Channel.SendMessage($"Removed channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
                        }
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Insufficient permissions.");
                    }
                });

                cgb.CreateCommand(Prefix + "vch").Alias(Prefix + "cvch")
                .Description("Creates a new voice channel with a given name.")
                .Parameter("channel_name", ParameterType.Required)
                .Do(async e =>
                {
                    try
                    {
                        if (e.User.ServerPermissions.ManageChannels)
                        {
                            await e.Server.CreateChannel(e.GetArg("channel_name"), ChannelType.Voice).ConfigureAwait(false);
                            await e.Channel.SendMessage($"Created voice channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
                        }
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "rch").Alias(Prefix + "rtch")
                .Description("Removes a text channel with a given name.")
                .Parameter("channel_name", ParameterType.Required)
                .Do(async e =>
                {
                    try
                    {
                        if (e.User.ServerPermissions.ManageChannels)
                        {
                            var channel = e.Server.FindChannels(e.GetArg("channel_name"), ChannelType.Text).FirstOrDefault();
                            if (channel == null)
                            {
                                return;
                            }
                            await channel.Delete().ConfigureAwait(false);
                            await e.Channel.SendMessage($"Removed text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
                        }
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "ch").Alias(Prefix + "tch")
                .Description("Creates a new text channel with a given name.")
                .Parameter("channel_name", ParameterType.Required)
                .Do(async e =>
                {
                    try
                    {
                        if (e.User.ServerPermissions.ManageChannels)
                        {
                            await e.Server.CreateChannel(e.GetArg("channel_name"), ChannelType.Text).ConfigureAwait(false);
                            await e.Channel.SendMessage($"Added text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
                        }
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "st").Alias(Prefix + "settopic")
                .Alias(Prefix + "topic")
                .Description("Sets a topic on the current channel.")
                .AddCheck(SimpleCheckers.ManageChannels())
                .Parameter("topic", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var topic = e.GetArg("topic");
                    if (string.IsNullOrWhiteSpace(topic))
                    {
                        return;
                    }
                    await e.Channel.Edit(topic: topic).ConfigureAwait(false);
                    await e.Channel.SendMessage(":ok: **New channel topic set.**").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "uid").Alias(Prefix + "userid")
                .Description("Shows user ID.")
                .Parameter("user", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var usr = e.User;
                    if (!string.IsNullOrWhiteSpace(e.GetArg("user")))
                    {
                        usr = e.Channel.FindUsers(e.GetArg("user")).FirstOrDefault();
                    }
                    if (usr == null)
                    {
                        return;
                    }
                    await e.Channel.SendMessage($"Id of the user { usr.Name } is { usr.Id }").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "cid").Alias(Prefix + "channelid")
                .Description("Shows current channel ID.")
                .Do(async e => await e.Channel.SendMessage("This channel's ID is " + e.Channel.Id).ConfigureAwait(false));

                cgb.CreateCommand(Prefix + "sid").Alias(Prefix + "serverid")
                .Description("Shows current server ID.")
                .Do(async e => await e.Channel.SendMessage("This server's ID is " + e.Server.Id).ConfigureAwait(false));

                cgb.CreateCommand(Prefix + "stats")
                .Description("Shows some basic stats for Nadeko.")
                .Do(async e =>
                {
                    await e.Channel.SendMessage(await NadekoStats.Instance.GetStats());
                });

                cgb.CreateCommand(Prefix + "dysyd")
                .Description("Shows some basic stats for Nadeko.")
                .Do(async e =>
                {
                    await e.Channel.SendMessage((await NadekoStats.Instance.GetStats()).Matrix().TrimTo(1990)).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "heap")
                .Description("Shows allocated memory - **Owner Only!**")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    var heap = await Task.Run(() => NadekoStats.Instance.Heap()).ConfigureAwait(false);
                    await e.Channel.SendMessage($"`Heap Size:` {heap}").ConfigureAwait(false);
                });
                cgb.CreateCommand(Prefix + "prune")
                .Parameter("num", ParameterType.Required)
                .Description("Prunes a number of messages from the current channel.\n**Usage**: .prune 5")
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.ManageMessages)
                    {
                        return;
                    }
                    int val;
                    if (string.IsNullOrWhiteSpace(e.GetArg("num")) || !int.TryParse(e.GetArg("num"), out val) || val < 0)
                    {
                        return;
                    }

                    foreach (var msg in await e.Channel.DownloadMessages(val).ConfigureAwait(false))
                    {
                        await msg.Delete().ConfigureAwait(false);
                        await Task.Delay(100).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "die")
                .Alias(Prefix + "graceful")
                .Description("Shuts the bot down and notifies users about the restart. **Owner Only!**")
                .Do(async e =>
                {
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage("`Shutting down.`").ConfigureAwait(false);
                        await Task.Delay(2000).ConfigureAwait(false);
                        Environment.Exit(0);
                    }
                });

                cgb.CreateCommand(Prefix + "clr")
                .Description("Clears some of Nadeko's messages from the current channel. If given a user, will clear the user's messages from the current channel (**Owner Only!**) \n**Usage**: .clr @X")
                .Parameter("user", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var usrId = NadekoBot.Client.CurrentUser.Id;
                    if (!string.IsNullOrWhiteSpace(e.GetArg("user")) && e.User.ServerPermissions.ManageMessages)
                    {
                        var usr = e.Server.FindUsers(e.GetArg("user")).FirstOrDefault();
                        if (usr != null)
                        {
                            usrId = usr.Id;
                        }
                    }
                    await Task.Run(async() =>
                    {
                        var msgs = (await e.Channel.DownloadMessages(100).ConfigureAwait(false)).Where(m => m.User.Id == usrId);
                        foreach (var m in msgs)
                        {
                            try
                            {
                                await m.Delete().ConfigureAwait(false);
                            }
                            catch { }
                            await Task.Delay(200).ConfigureAwait(false);
                        }
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "newname")
                .Alias(Prefix + "setname")
                .Description("Give the bot a new name. **Owner Only!**")
                .Parameter("new_name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id) || e.GetArg("new_name") == null)
                    {
                        return;
                    }

                    await client.CurrentUser.Edit(NadekoBot.Creds.Password, e.GetArg("new_name")).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "newavatar")
                .Alias(Prefix + "setavatar")
                .Description("Sets a new avatar image for the NadekoBot. **Owner Only!**")
                .Parameter("img", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id) || string.IsNullOrWhiteSpace(e.GetArg("img")))
                    {
                        return;
                    }
                    // Gather user provided URL.
                    var avatarAddress = e.GetArg("img");
                    var imageStream   = await SearchHelper.GetResponseStreamAsync(avatarAddress).ConfigureAwait(false);
                    var image         = System.Drawing.Image.FromStream(imageStream);
                    // Save the image to disk.
                    image.Save("data/avatar.png", System.Drawing.Imaging.ImageFormat.Png);
                    await client.CurrentUser.Edit(NadekoBot.Creds.Password, avatar: image.ToStream()).ConfigureAwait(false);
                    // Send confirm.
                    await e.Channel.SendMessage("New avatar set.").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "setgame")
                .Description("Sets the bots game. **Owner Only!**")
                .Parameter("set_game", ParameterType.Unparsed)
                .Do(e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id) || e.GetArg("set_game") == null)
                    {
                        return;
                    }

                    client.SetGame(e.GetArg("set_game"));
                });

                cgb.CreateCommand(Prefix + "checkmyperms")
                .Description("Checks your userspecific permissions on this channel.")
                .Do(async e =>
                {
                    var output = "```\n";
                    foreach (var p in e.User.ServerPermissions.GetType().GetProperties().Where(p => !p.GetGetMethod().GetParameters().Any()))
                    {
                        output += p.Name + ": " + p.GetValue(e.User.ServerPermissions, null).ToString() + "\n";
                    }
                    output += "```";
                    await e.User.SendMessage(output).ConfigureAwait(false);
                });

                Server commsServer   = null;
                User commsUser       = null;
                Channel commsChannel = null;

                cgb.CreateCommand(Prefix + "commsuser")
                .Description("Sets a user for through-bot communication. Only works if server is set. Resets commschannel. **Owner Only!**")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    commsUser = commsServer?.FindUsers(e.GetArg("name")).FirstOrDefault();
                    if (commsUser != null)
                    {
                        commsChannel = null;
                        await e.Channel.SendMessage("User for comms set.").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("No server specified or user.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "commsserver")
                .Description("Sets a server for through-bot communication. **Owner Only!**")
                .Parameter("server", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    commsServer = client.FindServers(e.GetArg("server")).FirstOrDefault();
                    if (commsServer != null)
                    {
                        await e.Channel.SendMessage("Server for comms set.").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("No such server.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "commschannel")
                .Description("Sets a channel for through-bot communication. Only works if server is set. Resets commsuser. **Owner Only!**")
                .Parameter("ch", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    commsChannel = commsServer?.FindChannels(e.GetArg("ch"), ChannelType.Text).FirstOrDefault();
                    if (commsChannel != null)
                    {
                        commsUser = null;
                        await e.Channel.SendMessage("Server for comms set.").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("No server specified or channel is invalid.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "send")
                .Description("Send a message to someone on a different server through the bot. **Owner Only!**\n **Usage**: .send Message text multi word!")
                .Parameter("msg", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    if (commsUser != null)
                    {
                        await commsUser.SendMessage(e.GetArg("msg")).ConfigureAwait(false);
                    }
                    else if (commsChannel != null)
                    {
                        await commsChannel.SendMessage(e.GetArg("msg")).ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("Failed. Make sure you've specified server and [channel or user]").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "menrole")
                .Alias(Prefix + "mentionrole")
                .Description("Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission.")
                .Parameter("roles", ParameterType.Unparsed)
                .Do(async e =>
                {
                    await Task.Run(async() =>
                    {
                        if (!e.User.ServerPermissions.MentionEveryone)
                        {
                            return;
                        }
                        var arg     = e.GetArg("roles").Split(',').Select(r => r.Trim());
                        string send = $"--{e.User.Mention} has invoked a mention on the following roles--";
                        foreach (var roleStr in arg.Where(str => !string.IsNullOrWhiteSpace(str)))
                        {
                            var role = e.Server.FindRoles(roleStr).FirstOrDefault();
                            if (role == null)
                            {
                                continue;
                            }
                            send += $"\n`{role.Name}`\n";
                            send += string.Join(", ", role.Members.Select(r => r.Mention));
                        }

                        while (send.Length > 2000)
                        {
                            var curstr = send.Substring(0, 2000);
                            await
                            e.Channel.Send(curstr.Substring(0,
                                                            curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1)).ConfigureAwait(false);
                            send = curstr.Substring(curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1) +
                                   send.Substring(2000);
                        }
                        await e.Channel.Send(send).ConfigureAwait(false);
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "parsetosql")
                .Description("Loads exported parsedata from /data/parsedata/ into sqlite database.")
                .Do(async e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    await Task.Run(() =>
                    {
                        SaveParseToDb <Announcement>("data/parsedata/Announcements.json");
                        SaveParseToDb <DataModels.Command>("data/parsedata/CommandsRan.json");
                        SaveParseToDb <Request>("data/parsedata/Requests.json");
                        SaveParseToDb <Stats>("data/parsedata/Stats.json");
                        SaveParseToDb <TypingArticle>("data/parsedata/TypingArticles.json");
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "unstuck")
                .Description("Clears the message queue. **Owner Only!**")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(e =>
                {
                    NadekoBot.Client.MessageQueue.Clear();
                });

                cgb.CreateCommand(Prefix + "donators")
                .Description("List of lovely people who donated to keep this project alive.")
                .Do(async e =>
                {
                    await Task.Run(async() =>
                    {
                        var rows            = DbHandler.Instance.GetAllRows <Donator>();
                        var donatorsOrdered = rows.OrderByDescending(d => d.Amount);
                        string str          = $"**Thanks to the people listed below for making this project happen!**\n";

                        await e.Channel.SendMessage(str + string.Join("⭐", donatorsOrdered.Select(d => d.UserName))).ConfigureAwait(false);
                    }).ConfigureAwait(false);
                });

                //THIS IS INTENTED TO BE USED ONLY BY THE ORIGINAL BOT OWNER
                cgb.CreateCommand(Prefix + "adddon")
                .Alias(Prefix + "donadd")
                .Description("Add a donator to the database.")
                .Parameter("donator")
                .Parameter("amount")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    await Task.Run(() =>
                    {
                        if (!NadekoBot.IsOwner(e.User.Id))
                        {
                            return;
                        }
                        var donator = e.Server.FindUsers(e.GetArg("donator")).FirstOrDefault();
                        var amount  = int.Parse(e.GetArg("amount"));
                        if (donator == null)
                        {
                            return;
                        }
                        try
                        {
                            DbHandler.Instance.InsertData(new Donator
                            {
                                Amount   = amount,
                                UserName = donator.Name,
                                UserId   = (long)e.User.Id
                            });
                            e.Channel.SendMessage("Successfuly added a new donator. 👑");
                        }
                        catch { }
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "videocall")
                .Description("Creates a private <http://www.appear.in> video call link for you and other mentioned people. The link is sent to mentioned people via a private message.")
                .Parameter("arg", ParameterType.Unparsed)
                .Do(async e =>
                {
                    try
                    {
                        var allUsrs      = e.Message.MentionedUsers.Union(new User[] { e.User });
                        var allUsrsArray = allUsrs as User[] ?? allUsrs.ToArray();
                        var str          = allUsrsArray.Aggregate("http://appear.in/", (current, usr) => current + Uri.EscapeUriString(usr.Name[0].ToString()));
                        str += new Random().Next();
                        foreach (var usr in allUsrsArray)
                        {
                            await usr.SendMessage(str).ConfigureAwait(false);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                    }
                });

                cgb.CreateCommand(Prefix + "announce")
                .Description($"Sends a message to all servers' general channel bot is connected to.**Owner Only!**\n**Usage**: {Prefix}announce Useless spam")
                .Parameter("msg", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    foreach (var ch in NadekoBot.Client.Servers.Select(s => s.DefaultChannel))
                    {
                        await ch.SendMessage(e.GetArg("msg"));
                    }

                    await e.Channel.SendMessage(":ok:");
                });
            });
        }
Beispiel #22
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            var Prefix = Module.Prefix;

            cgb.CreateCommand(Prefix + "addcustreact")
            .Alias(Prefix + "acr")
            .Description($"Fügt eine \"Custom Reaction\" hinzu. **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 e.Channel.SendMessage($"Falsche Command-Benutzung. Gib -h {Prefix}acr ein für die richtige Formatierung.").ConfigureAwait(false);
                    return;
                }
                if (MidnightBot.Config.CustomReactions.ContainsKey(name))
                {
                    MidnightBot.Config.CustomReactions[name].Add(message);
                }
                else
                {
                    MidnightBot.Config.CustomReactions.Add(name, new System.Collections.Generic.List <string> ()
                    {
                        message
                    });
                }
                await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
                await e.Channel.SendMessage($"Hinzugefügt {name} : {message}").ConfigureAwait(false);
            });

            cgb.CreateCommand(Prefix + "listcustreact")
            .Alias(Prefix + "lcr")
            .Description($"Listet Custom Reactions auf(Seitenweise mit 30 Befehlen per Seite). Benutze 'all' anstatt einer Seitenzahl um alle Custom Reactions per Privater Nachricht zu erhalten. | `{Prefix}lcr 1`")
            .Parameter("num", ParameterType.Required)
            .Do(async e =>
            {
                var numStr = e.GetArg("num");

                if (numStr.ToUpperInvariant() == "ALL")
                {
                    var fullstr = String.Join("\n", MidnightBot.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 e.Channel.SendMessage("`Da sind keine Custom Reactions.`");
                }
                else
                {
                    string result = SearchHelper.ShowInPrettyCode <string>(cmds, s => $"{s,-25}"); //People prefer starting with 1
                    await e.Channel.SendMessage($"`Zeige Seite {num}:`\n" + result).ConfigureAwait(false);
                }
            });

            cgb.CreateCommand(Prefix + "showcustreact")
            .Alias(Prefix + "scr")
            .Description($"Zeigt alle möglichen Reaktionen von einer einzigen 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 (!MidnightBot.Config.CustomReactions.ContainsKey(name))
                {
                    await e.Channel.SendMessage("`Kann die Custom Reaction nicht finden.`").ConfigureAwait(false);
                    return;
                }
                var items   = MidnightBot.Config.CustomReactions[name];
                var message = new StringBuilder($"Antwort für {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 e.Channel.SendMessage(message.ToString());
            });

            cgb.CreateCommand(Prefix + "editcustreact")
            .Alias(Prefix + "ecr")
            .Description($"Bearbeitet eine Custom Reaction, Argumente sind der Custom Reaction Name, Index welcher geändert werden soll und eine (Multiwort) Nachricht.**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 (!MidnightBot.Config.CustomReactions.ContainsKey(name))
                {
                    await e.Channel.SendMessage("`Konnte gegebenen Befehls-Namen nicht finden`").ConfigureAwait(false);
                    return;
                }

                int index;
                if (!int.TryParse(indexstr, out index) || index < 1 || index > MidnightBot.Config.CustomReactions[name].Count)
                {
                    await e.Channel.SendMessage("`Ungültiger Index.`").ConfigureAwait(false);
                    return;
                }
                index = index - 1;
                MidnightBot.Config.CustomReactions[name][index] = msg;

                await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
                await e.Channel.SendMessage($"Antwort #{index + 1} von `{name}` bearbeitet").ConfigureAwait(false);
            });

            cgb.CreateCommand(Prefix + "delcustreact")
            .Alias(Prefix + "dcr")
            .Description($"Löscht eine \"Custome Reaction\" mit gegebenen Namen (und Index). | `{Prefix}dcr index`")
            .AddCheck(SimpleCheckers.OwnerOnly())
            .Parameter("name", ParameterType.Required)
            .Parameter("index", ParameterType.Optional)
            .Do(async e =>

            {
                var name = e.GetArg("name")?.Trim();
                if (string.IsNullOrWhiteSpace(name))
                {
                    return;
                }
                if (!MidnightBot.Config.CustomReactions.ContainsKey(name))
                {
                    await e.Channel.SendMessage("Gegebener Command-Name nicht gefunden.");
                    return;
                }
                string message = "";
                int index;
                if (int.TryParse(e.GetArg("index")?.Trim() ?? "", out index))
                {
                    index = index - 1;
                    if (index < 0 || index > MidnightBot.Config.CustomReactions[name].Count)
                    {
                        await e.Channel.SendMessage("Gegebener Index nicht vorhanden.").ConfigureAwait(false);
                        return;
                    }
                    MidnightBot.Config.CustomReactions[name].RemoveAt(index);
                    if (!MidnightBot.Config.CustomReactions[name].Any())
                    {
                        MidnightBot.Config.CustomReactions.Remove(name);
                    }
                    message = $"Antwort #{index + 1} von `{name}` gelöscht.";
                }
                else
                {
                    MidnightBot.Config.CustomReactions.Remove(name);
                    message = $"Custom Reaction: `{name}` gelöscht";
                }
                await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
                await e.Channel.SendMessage(message).ConfigureAwait(false);
            });
        }
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "hitbox")
            .Alias(Module.Prefix + "hb")
            .Description("Notifies this channel when a certain user starts streaming." +
                         "\n**Usage**: ~hitbox SomeStreamer")
            .Parameter("username", ParameterType.Unparsed)
            .AddCheck(SimpleCheckers.ManageServer())
            .Do(TrackStream(StreamNotificationConfig.StreamType.Hitbox));

            cgb.CreateCommand(Module.Prefix + "twitch")
            .Alias(Module.Prefix + "tw")
            .Description("Notifies this channel when a certain user starts streaming." +
                         "\n**Usage**: ~twitch SomeStreamer")
            .AddCheck(SimpleCheckers.ManageServer())
            .Parameter("username", ParameterType.Unparsed)
            .Do(TrackStream(StreamNotificationConfig.StreamType.Twitch));

            cgb.CreateCommand(Module.Prefix + "beam")
            .Alias(Module.Prefix + "bm")
            .Description("Notifies this channel when a certain user starts streaming." +
                         "\n**Usage**: ~beam SomeStreamer")
            .AddCheck(SimpleCheckers.ManageServer())
            .Parameter("username", ParameterType.Unparsed)
            .Do(TrackStream(StreamNotificationConfig.StreamType.Beam));

            cgb.CreateCommand(Module.Prefix + "removestream")
            .Alias(Module.Prefix + "rms")
            .Description("Removes notifications of a certain streamer on this channel." +
                         "\n**Usage**: ~rms SomeGuy")
            .AddCheck(SimpleCheckers.ManageServer())
            .Parameter("username", ParameterType.Unparsed)
            .Do(async e =>
            {
                var username = e.GetArg("username")?.ToLower().Trim();
                if (string.IsNullOrWhiteSpace(username))
                {
                    return;
                }

                var config = SpecificConfigurations.Default.Of(e.Server.Id);

                var toRemove = config.ObservingStreams
                               .FirstOrDefault(snc => snc.ChannelId == e.Channel.Id &&
                                               snc.Username.ToLower().Trim() == username);
                if (toRemove == null)
                {
                    await e.Channel.SendMessage(":anger: No such stream.").ConfigureAwait(false);
                    return;
                }

                config.ObservingStreams.Remove(toRemove);
                ConfigHandler.SaveConfig();
                await e.Channel.SendMessage($":ok: Removed `{toRemove.Username}`'s stream from notifications.").ConfigureAwait(false);
            });

            cgb.CreateCommand(Module.Prefix + "liststreams")
            .Alias(Module.Prefix + "ls")
            .Description("Lists all streams you are following on this server." +
                         "\n**Usage**: ~ls")
            .Do(async e =>
            {
                var config = SpecificConfigurations.Default.Of(e.Server.Id);

                var streams = config.ObservingStreams.Where(snc =>
                                                            snc.ServerId == e.Server.Id);

                var streamsArray = streams as StreamNotificationConfig[] ?? streams.ToArray();

                if (streamsArray.Length == 0)
                {
                    await e.Channel.SendMessage("You are not following any streams on this server.").ConfigureAwait(false);
                    return;
                }

                var text = string.Join("\n", streamsArray.Select(snc =>
                {
                    try
                    {
                        return($"`{snc.Username}`'s stream on **{e.Server.GetChannel(e.Channel.Id).Name}** channel. 【`{snc.Type.ToString()}`】");
                    }
                    catch { }
                    return("");
                }));

                await e.Channel.SendMessage($"You are following **{streamsArray.Length}** streams on this server.\n\n" + text).ConfigureAwait(false);
            });
        }
Beispiel #24
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "t")
            .Description($"Startet ein Quiz. Du kannst nohint hinzufügen um Tipps zu verhindern." +
                         "Erster Spieler mit 10 Punkten gewinnt. 30 Sekunden je Frage." +
                         $" |`{Module.Prefix}t nohint` oder `{Module.Prefix}t 5 nohint`")
            .Parameter("args", ParameterType.Multiple)
            .AddCheck(SimpleCheckers.ManageMessages())
            .Do(async e =>
            {
                TriviaGame trivia;
                if (!RunningTrivias.TryGetValue(e.Server.Id, out trivia))
                {
                    var showHints = !e.Args.Contains("nohint");
                    var number    = e.Args.Select(s =>
                    {
                        int num;
                        return(new Tuple <bool, int> (int.TryParse(s, out num), num));
                    }).Where(t => t.Item1).Select(t => t.Item2).FirstOrDefault();
                    if (number < 0)
                    {
                        return;
                    }
                    var triviaGame = new TriviaGame(e, showHints, number == 0 ? 10 : number);
                    if (RunningTrivias.TryAdd(e.Server.Id, triviaGame))
                    {
                        await e.Channel.SendMessage($"**Trivia Game gestartet! {triviaGame.WinRequirement} Punkte benötigt um zu gewinnen.**").ConfigureAwait(false);
                    }
                    else
                    {
                        await triviaGame.StopGame().ConfigureAwait(false);
                    }
                }
                else
                {
                    await e.Channel.SendMessage("Auf diesem Server läuft bereits ein Quiz.\n" + trivia.CurrentQuestion).ConfigureAwait(false);
                }
            });

            cgb.CreateCommand(Module.Prefix + "tl")
            .Description($"Zeigt eine Rangliste des derzeitigen Quiz. | `{Prefix}tl`")
            .Do(async e =>
            {
                TriviaGame trivia;
                if (RunningTrivias.TryGetValue(e.Server.Id, out trivia))
                {
                    await e.Channel.SendMessage(trivia.GetLeaderboard()).ConfigureAwait(false);
                }
                else
                {
                    await e.Channel.SendMessage("Es läuft kein Quiz auf diesem Server.").ConfigureAwait(false);
                }
            });

            cgb.CreateCommand(Module.Prefix + "tq")
            .Description($"Beendet Quiz nach der derzeitgen Frage. | `{Prefix}tq`")
            .AddCheck(SimpleCheckers.ManageMessages())
            .Do(async e =>
            {
                TriviaGame trivia;
                if (RunningTrivias.TryGetValue(e.Server.Id, out trivia))
                {
                    await trivia.StopGame().ConfigureAwait(false);
                }
                else
                {
                    await e.Channel.SendMessage("Es läuft kein Quiz auf diesem Server.").ConfigureAwait(false);
                }
            });
        }
Beispiel #25
0
        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!**  \n**Usage**: {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 e.Channel.SendMessage($"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 Task.Run(() => Classes.JSONModels.ConfigHandler.SaveConfig()).ConfigureAwait(false);
                await e.Channel.SendMessage($"Added {name} : {message}").ConfigureAwait(false);
            });

            cgb.CreateCommand(Prefix + "listcustreact")
            .Alias(Prefix + "lcr")
            .Description($"Lists all current custom reactions (paginated with 5 commands per page).\n**Usage**:{Prefix}lcr 1")
            .Parameter("num", ParameterType.Required)
            .Do(async e =>
            {
                int num;
                if (!int.TryParse(e.GetArg("num"), out num) || num <= 0)
                {
                    return;
                }
                string result = GetCustomsOnPage(num - 1);     //People prefer starting with 1
                await e.Channel.SendMessage(result).ConfigureAwait(false);
            });

            cgb.CreateCommand(Prefix + "delcustreact")
            .Alias(Prefix + "dcr")
            .Description("Deletes a custom reaction with given name (and 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 e.Channel.SendMessage("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 e.Channel.SendMessage("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 Task.Run(() => Classes.JSONModels.ConfigHandler.SaveConfig()).ConfigureAwait(false);
                await e.Channel.SendMessage(message).ConfigureAwait(false);
            });
        }
Beispiel #26
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "pick")
            .Description($"Picks a flower planted in this channel. | `{Prefix}pick`")
            .Do(async e =>
            {
                IEnumerable <Message> msgs;

                await e.Message.Delete().ConfigureAwait(false);
                if (!plantedFlowerChannels.TryRemove(e.Channel.Id, out msgs))
                {
                    return;
                }

                foreach (var msgToDelete in msgs)
                {
                    await msgToDelete.Delete().ConfigureAwait(false);
                }

                await FlowersHandler.AddFlowersAsync(e.User, "Picked a flower.", 1, true).ConfigureAwait(false);
                var msg = await e.Channel.SendMessage($"**{e.User.Name}** picked a {NadekoBot.Config.CurrencyName}!").ConfigureAwait(false);
                ThreadPool.QueueUserWorkItem(async(state) =>
                {
                    try
                    {
                        await Task.Delay(10000).ConfigureAwait(false);
                        await msg.Delete().ConfigureAwait(false);
                    }
                    catch { }
                });
            });

            cgb.CreateCommand(Module.Prefix + "plant")
            .Description($"Spend a flower to plant it in this channel. (If bot is restarted or crashes, flower will be lost) | `{Prefix}plant`")
            .Do(async e =>
            {
                await locker.WaitAsync().ConfigureAwait(false);
                try
                {
                    if (plantedFlowerChannels.ContainsKey(e.Channel.Id))
                    {
                        await e.Channel.SendMessage($"There is already a {NadekoBot.Config.CurrencyName} in this channel.").ConfigureAwait(false);
                        return;
                    }
                    var removed = await FlowersHandler.RemoveFlowers(e.User, "Planted a flower.", 1, true).ConfigureAwait(false);
                    if (!removed)
                    {
                        await e.Channel.SendMessage($"You don't have any {NadekoBot.Config.CurrencyName}s.").ConfigureAwait(false);
                        return;
                    }

                    var file = GetRandomCurrencyImagePath();
                    Message msg;
                    if (file == null)
                    {
                        msg = await e.Channel.SendMessage(NadekoBot.Config.CurrencySign).ConfigureAwait(false);
                    }
                    else
                    {
                        msg = await e.Channel.SendFile(file).ConfigureAwait(false);
                    }
                    var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(NadekoBot.Config.CurrencyName[0]);
                    var msg2       = await e.Channel.SendMessage($"Oh how Nice! **{e.User.Name}** planted {(vowelFirst ? "an" : "a")} {NadekoBot.Config.CurrencyName}. Pick it using {Module.Prefix}pick").ConfigureAwait(false);
                    plantedFlowerChannels.TryAdd(e.Channel.Id, new[] { msg, msg2 });
                }
                finally { locker.Release(); }
            });

            cgb.CreateCommand(Prefix + "gencurrency")
            .Alias(Prefix + "gc")
            .Description($"Toggles currency generation on this channel. Every posted message will have 2% chance to spawn a {NadekoBot.Config.CurrencyName}. Optional parameter cooldown time in minutes, 5 minutes by default. Requires Manage Messages permission. | `{Prefix}gc` or `{Prefix}gc 60`")
            .AddCheck(SimpleCheckers.ManageMessages())
            .Parameter("cd", ParameterType.Unparsed)
            .Do(async e =>
            {
                var cdStr = e.GetArg("cd");
                int cd    = 2;
                if (!int.TryParse(cdStr, out cd) || cd < 0)
                {
                    cd = 2;
                }
                var config = SpecificConfigurations.Default.Of(e.Server.Id);
                int throwaway;
                if (config.GenerateCurrencyChannels.TryRemove(e.Channel.Id, out throwaway))
                {
                    await e.Channel.SendMessage("`Currency generation disabled on this channel.`").ConfigureAwait(false);
                }
                else
                {
                    if (config.GenerateCurrencyChannels.TryAdd(e.Channel.Id, cd))
                    {
                        await e.Channel.SendMessage($"`Currency generation enabled on this channel. Cooldown is {cd} minutes.`").ConfigureAwait(false);
                    }
                }
            });
        }
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                commands.ForEach(cmd => cmd.Init(cgb));

                cgb.CreateCommand(Prefix + "permrole")
                .Alias(Prefix + "pr")
                .Description("Sets a role which can change permissions. Or supply no parameters to find out the current one. Default one is 'Wiz Bot'.")
                .Parameter("role", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (string.IsNullOrWhiteSpace(e.GetArg("role")))
                    {
                        await e.Channel.SendMessage($"Current permissions role is `{PermissionsHandler.GetServerPermissionsRoleName(e.Server)}`").ConfigureAwait(false);
                        return;
                    }

                    var arg           = e.GetArg("role");
                    Discord.Role role = null;
                    try
                    {
                        role = PermissionHelper.ValidateRole(e.Server, arg);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        await e.Channel.SendMessage($"Role `{arg}` probably doesn't exist. Create the role with that name first.").ConfigureAwait(false);
                        return;
                    }
                    PermissionsHandler.SetPermissionsRole(e.Server, role.Name);
                    await e.Channel.SendMessage($"Role `{role.Name}` is now required in order to change permissions.").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "rpc")
                .Alias(Prefix + "rolepermissionscopy")
                .Description($"Copies BOT PERMISSIONS (not discord permissions) from one role to another.\n**Usage**:`{Prefix}rpc Some Role ~ Some other role`")
                .Parameter("from_to", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("from_to")?.Trim();
                    if (string.IsNullOrWhiteSpace(arg) || !arg.Contains('~'))
                    {
                        return;
                    }
                    var args = arg.Split('~').Select(a => a.Trim()).ToArray();
                    if (args.Length > 2)
                    {
                        await e.Channel.SendMessage("💢Invalid number of '~'s in the argument.");
                        return;
                    }
                    try
                    {
                        var fromRole = PermissionHelper.ValidateRole(e.Server, args[0]);
                        var toRole   = PermissionHelper.ValidateRole(e.Server, args[1]);

                        PermissionsHandler.CopyRolePermissions(fromRole, toRole);
                        await e.Channel.SendMessage($"Copied permission settings from **{fromRole.Name}** to **{toRole.Name}**.");
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage($"💢{ex.Message}");
                    }
                });

                cgb.CreateCommand(Prefix + "cpc")
                .Alias(Prefix + "channelpermissionscopy")
                .Description($"Copies BOT PERMISSIONS (not discord permissions) from one channel to another.\n**Usage**:`{Prefix}cpc Some Channel ~ Some other channel`")
                .Parameter("from_to", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("from_to")?.Trim();
                    if (string.IsNullOrWhiteSpace(arg) || !arg.Contains('~'))
                    {
                        return;
                    }
                    var args = arg.Split('~').Select(a => a.Trim()).ToArray();
                    if (args.Length > 2)
                    {
                        await e.Channel.SendMessage("💢Invalid number of '~'s in the argument.");
                        return;
                    }
                    try
                    {
                        var fromChannel = PermissionHelper.ValidateChannel(e.Server, args[0]);
                        var toChannel   = PermissionHelper.ValidateChannel(e.Server, args[1]);

                        PermissionsHandler.CopyChannelPermissions(fromChannel, toChannel);
                        await e.Channel.SendMessage($"Copied permission settings from **{fromChannel.Name}** to **{toChannel.Name}**.");
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage($"💢{ex.Message}");
                    }
                });

                cgb.CreateCommand(Prefix + "upc")
                .Alias(Prefix + "userpermissionscopy")
                .Description($"Copies BOT PERMISSIONS (not discord permissions) from one role to another.\n**Usage**:`{Prefix}upc @SomeUser ~ @SomeOtherUser`")
                .Parameter("from_to", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("from_to")?.Trim();
                    if (string.IsNullOrWhiteSpace(arg) || !arg.Contains('~'))
                    {
                        return;
                    }
                    var args = arg.Split('~').Select(a => a.Trim()).ToArray();
                    if (args.Length > 2)
                    {
                        await e.Channel.SendMessage("💢Invalid number of '~'s in the argument.");
                        return;
                    }
                    try
                    {
                        var fromUser = PermissionHelper.ValidateUser(e.Server, args[0]);
                        var toUser   = PermissionHelper.ValidateUser(e.Server, args[1]);

                        PermissionsHandler.CopyUserPermissions(fromUser, toUser);
                        await e.Channel.SendMessage($"Copied permission settings from **{fromUser.ToString()}**to * *{toUser.ToString()}**.");
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage($"💢{ex.Message}");
                    }
                });

                cgb.CreateCommand(Prefix + "verbose")
                .Alias(Prefix + "v")
                .Description("Sets whether to show when a command/module is blocked.\n**Usage**: ;verbose true")
                .Parameter("arg", ParameterType.Required)
                .Do(async e =>
                {
                    var arg = e.GetArg("arg");
                    var val = PermissionHelper.ValidateBool(arg);
                    PermissionsHandler.SetVerbosity(e.Server, val);
                    await e.Channel.SendMessage($"Verbosity set to {val}.").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "serverperms")
                .Alias(Prefix + "sp")
                .Description("Shows banned permissions for this server.")
                .Do(async e =>
                {
                    var perms = PermissionsHandler.GetServerPermissions(e.Server);
                    if (string.IsNullOrWhiteSpace(perms?.ToString()))
                    {
                        await e.Channel.SendMessage("No permissions set for this server.").ConfigureAwait(false);
                    }
                    await e.Channel.SendMessage(perms.ToString()).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "roleperms")
                .Alias(Prefix + "rp")
                .Description("Shows banned permissions for a certain role. No argument means for everyone.\n**Usage**: ;rp AwesomeRole")
                .Parameter("role", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg  = e.GetArg("role");
                    var role = e.Server.EveryoneRole;
                    if (!string.IsNullOrWhiteSpace(arg))
                    {
                        try
                        {
                            role = PermissionHelper.ValidateRole(e.Server, arg);
                        }
                        catch (Exception ex)
                        {
                            await e.Channel.SendMessage("💢 Error: " + ex.Message).ConfigureAwait(false);
                            return;
                        }
                    }

                    var perms = PermissionsHandler.GetRolePermissionsById(e.Server, role.Id);

                    if (string.IsNullOrWhiteSpace(perms?.ToString()))
                    {
                        await e.Channel.SendMessage($"No permissions set for **{role.Name}** role.").ConfigureAwait(false);
                    }
                    await e.Channel.SendMessage(perms.ToString()).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "channelperms")
                .Alias(Prefix + "cp")
                .Description("Shows banned permissions for a certain channel. No argument means for this channel.\n**Usage**: ;cp #dev")
                .Parameter("channel", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg     = e.GetArg("channel");
                    var channel = e.Channel;
                    if (!string.IsNullOrWhiteSpace(arg))
                    {
                        try
                        {
                            channel = PermissionHelper.ValidateChannel(e.Server, arg);
                        }
                        catch (Exception ex)
                        {
                            await e.Channel.SendMessage("💢 Error: " + ex.Message).ConfigureAwait(false);
                            return;
                        }
                    }

                    var perms = PermissionsHandler.GetChannelPermissionsById(e.Server, channel.Id);
                    if (string.IsNullOrWhiteSpace(perms?.ToString()))
                    {
                        await e.Channel.SendMessage($"No permissions set for **{channel.Name}** channel.").ConfigureAwait(false);
                    }
                    await e.Channel.SendMessage(perms.ToString()).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "userperms")
                .Alias(Prefix + "up")
                .Description("Shows banned permissions for a certain user. No argument means for yourself.\n**Usage**: ;up Wizkiller96")
                .Parameter("user", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var user = e.User;
                    if (!string.IsNullOrWhiteSpace(e.GetArg("user")))
                    {
                        try
                        {
                            user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user"));
                        }
                        catch (Exception ex)
                        {
                            await e.Channel.SendMessage("💢 Error: " + ex.Message).ConfigureAwait(false);
                            return;
                        }
                    }

                    var perms = PermissionsHandler.GetUserPermissionsById(e.Server, user.Id);
                    if (string.IsNullOrWhiteSpace(perms?.ToString()))
                    {
                        await e.Channel.SendMessage($"No permissions set for user **{user.Name}**.").ConfigureAwait(false);
                    }
                    await e.Channel.SendMessage(perms.ToString()).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "sm").Alias(Prefix + "servermodule")
                .Parameter("module", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Description("Sets a module's permission at the server level.\n**Usage**: ;sm [module_name] enable")
                .Do(async e =>
                {
                    try
                    {
                        var module = PermissionHelper.ValidateModule(e.GetArg("module"));
                        var state  = PermissionHelper.ValidateBool(e.GetArg("bool"));

                        PermissionsHandler.SetServerModulePermission(e.Server, module, state);
                        await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false);
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "sc").Alias(Prefix + "servercommand")
                .Parameter("command", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Description("Sets a command's permission at the server level.\n**Usage**: ;sc [command_name] disable")
                .Do(async e =>
                {
                    try
                    {
                        var command = PermissionHelper.ValidateCommand(e.GetArg("command"));
                        var state   = PermissionHelper.ValidateBool(e.GetArg("bool"));

                        PermissionsHandler.SetServerCommandPermission(e.Server, command, state);
                        await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false);
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "rm").Alias(Prefix + "rolemodule")
                .Parameter("module", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Parameter("role", ParameterType.Unparsed)
                .Description("Sets a module's permission at the role level.\n**Usage**: ;rm [module_name] enable [role_name]")
                .Do(async e =>
                {
                    try
                    {
                        var module = PermissionHelper.ValidateModule(e.GetArg("module"));
                        var state  = PermissionHelper.ValidateBool(e.GetArg("bool"));

                        if (e.GetArg("role")?.ToLower() == "all")
                        {
                            foreach (var role in e.Server.Roles)
                            {
                                PermissionsHandler.SetRoleModulePermission(role, module, state);
                            }
                            await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles.").ConfigureAwait(false);
                        }
                        else
                        {
                            var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role"));

                            PermissionsHandler.SetRoleModulePermission(role, module, state);
                            await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false);
                        }
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "rc").Alias(Prefix + "rolecommand")
                .Parameter("command", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Parameter("role", ParameterType.Unparsed)
                .Description("Sets a command's permission at the role level.\n**Usage**: ;rc [command_name] disable [role_name]")
                .Do(async e =>
                {
                    try
                    {
                        var command = PermissionHelper.ValidateCommand(e.GetArg("command"));
                        var state   = PermissionHelper.ValidateBool(e.GetArg("bool"));

                        if (e.GetArg("role")?.ToLower() == "all")
                        {
                            foreach (var role in e.Server.Roles)
                            {
                                PermissionsHandler.SetRoleCommandPermission(role, command, state);
                            }
                            await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles.").ConfigureAwait(false);
                        }
                        else
                        {
                            var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role"));

                            PermissionsHandler.SetRoleCommandPermission(role, command, state);
                            await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false);
                        }
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "cm").Alias(Prefix + "channelmodule")
                .Parameter("module", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Parameter("channel", ParameterType.Unparsed)
                .Description("Sets a module's permission at the channel level.\n**Usage**: ;cm [module_name] enable [channel_name]")
                .Do(async e =>
                {
                    try
                    {
                        var module = PermissionHelper.ValidateModule(e.GetArg("module"));
                        var state  = PermissionHelper.ValidateBool(e.GetArg("bool"));

                        var channelArg = e.GetArg("channel");
                        if (channelArg?.ToLower() == "all")
                        {
                            foreach (var channel in e.Server.TextChannels)
                            {
                                PermissionsHandler.SetChannelModulePermission(channel, module, state);
                            }
                            await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels.").ConfigureAwait(false);
                        }
                        else if (string.IsNullOrWhiteSpace(channelArg))
                        {
                            PermissionsHandler.SetChannelModulePermission(e.Channel, module, state);
                            await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{e.Channel.Name}** channel.").ConfigureAwait(false);
                        }
                        else
                        {
                            var channel = PermissionHelper.ValidateChannel(e.Server, channelArg);

                            PermissionsHandler.SetChannelModulePermission(channel, module, state);
                            await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false);
                        }
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "cc").Alias(Prefix + "channelcommand")
                .Parameter("command", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Parameter("channel", ParameterType.Unparsed)
                .Description("Sets a command's permission at the channel level.\n**Usage**: ;cc [command_name] enable [channel_name]")
                .Do(async e =>
                {
                    try
                    {
                        var command = PermissionHelper.ValidateCommand(e.GetArg("command"));
                        var state   = PermissionHelper.ValidateBool(e.GetArg("bool"));

                        if (e.GetArg("channel")?.ToLower() == "all")
                        {
                            foreach (var channel in e.Server.TextChannels)
                            {
                                PermissionsHandler.SetChannelCommandPermission(channel, command, state);
                            }
                            await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels.").ConfigureAwait(false);
                        }
                        else
                        {
                            var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));

                            PermissionsHandler.SetChannelCommandPermission(channel, command, state);
                            await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false);
                        }
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "um").Alias(Prefix + "usermodule")
                .Parameter("module", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Parameter("user", ParameterType.Unparsed)
                .Description("Sets a module's permission at the user level.\n**Usage**: ;um [module_name] enable [user_name]")
                .Do(async e =>
                {
                    try
                    {
                        var module = PermissionHelper.ValidateModule(e.GetArg("module"));
                        var state  = PermissionHelper.ValidateBool(e.GetArg("bool"));
                        var user   = PermissionHelper.ValidateUser(e.Server, e.GetArg("user"));

                        PermissionsHandler.SetUserModulePermission(user, module, state);
                        await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**.").ConfigureAwait(false);
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "uc").Alias(Prefix + "usercommand")
                .Parameter("command", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Parameter("user", ParameterType.Unparsed)
                .Description("Sets a command's permission at the user level.\n**Usage**: ;uc [command_name] enable [user_name]")
                .Do(async e =>
                {
                    try
                    {
                        var command = PermissionHelper.ValidateCommand(e.GetArg("command"));
                        var state   = PermissionHelper.ValidateBool(e.GetArg("bool"));
                        var user    = PermissionHelper.ValidateUser(e.Server, e.GetArg("user"));

                        PermissionsHandler.SetUserCommandPermission(user, command, state);
                        await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**.").ConfigureAwait(false);
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "asm").Alias(Prefix + "allservermodules")
                .Parameter("bool", ParameterType.Required)
                .Description("Sets permissions for all modules at the server level.\n**Usage**: ;asm [enable/disable]")
                .Do(async e =>
                {
                    try
                    {
                        var state = PermissionHelper.ValidateBool(e.GetArg("bool"));

                        foreach (var module in WizBot.Client.GetService <ModuleService>().Modules)
                        {
                            PermissionsHandler.SetServerModulePermission(e.Server, module.Name, state);
                        }
                        await e.Channel.SendMessage($"All modules have been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false);
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "asc").Alias(Prefix + "allservercommands")
                .Parameter("module", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Description("Sets permissions for all commands from a certain module at the server level.\n**Usage**: ;asc [module_name] [enable/disable]")
                .Do(async e =>
                {
                    try
                    {
                        var state  = PermissionHelper.ValidateBool(e.GetArg("bool"));
                        var module = PermissionHelper.ValidateModule(e.GetArg("module"));

                        foreach (var command in WizBot.Client.GetService <CommandService>().AllCommands.Where(c => c.Category == module))
                        {
                            PermissionsHandler.SetServerCommandPermission(e.Server, command.Text, state);
                        }
                        await e.Channel.SendMessage($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false);
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "acm").Alias(Prefix + "allchannelmodules")
                .Parameter("bool", ParameterType.Required)
                .Parameter("channel", ParameterType.Unparsed)
                .Description("Sets permissions for all modules at the channel level.\n**Usage**: ;acm [enable/disable] [channel_name]")
                .Do(async e =>
                {
                    try
                    {
                        var state   = PermissionHelper.ValidateBool(e.GetArg("bool"));
                        var chArg   = e.GetArg("channel");
                        var channel = string.IsNullOrWhiteSpace(chArg) ? e.Channel :PermissionHelper.ValidateChannel(e.Server, chArg);
                        foreach (var module in WizBot.Client.GetService <ModuleService>().Modules)
                        {
                            PermissionsHandler.SetChannelModulePermission(channel, module.Name, state);
                        }

                        await e.Channel.SendMessage($"All modules have been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false);
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "acc").Alias(Prefix + "allchannelcommands")
                .Parameter("module", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Parameter("channel", ParameterType.Unparsed)
                .Description("Sets permissions for all commands from a certain module at the channel level.\n**Usage**: ;acc [module_name] [enable/disable] [channel_name]")
                .Do(async e =>
                {
                    try
                    {
                        var state   = PermissionHelper.ValidateBool(e.GetArg("bool"));
                        var module  = PermissionHelper.ValidateModule(e.GetArg("module"));
                        var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));
                        foreach (var command in WizBot.Client.GetService <CommandService>().AllCommands.Where(c => c.Category == module))
                        {
                            PermissionsHandler.SetChannelCommandPermission(channel, command.Text, state);
                        }
                        await e.Channel.SendMessage($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false);
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "arm").Alias(Prefix + "allrolemodules")
                .Parameter("bool", ParameterType.Required)
                .Parameter("role", ParameterType.Unparsed)
                .Description("Sets permissions for all modules at the role level.\n**Usage**: ;arm [enable/disable] [role_name]")
                .Do(async e =>
                {
                    try
                    {
                        var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
                        var role  = PermissionHelper.ValidateRole(e.Server, e.GetArg("role"));
                        foreach (var module in WizBot.Client.GetService <ModuleService>().Modules)
                        {
                            PermissionsHandler.SetRoleModulePermission(role, module.Name, state);
                        }

                        await e.Channel.SendMessage($"All modules have been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false);
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "arc").Alias(Prefix + "allrolecommands")
                .Parameter("module", ParameterType.Required)
                .Parameter("bool", ParameterType.Required)
                .Parameter("channel", ParameterType.Unparsed)
                .Description("Sets permissions for all commands from a certain module at the role level.\n**Usage**: ;arc [module_name] [enable/disable] [role_name]")
                .Do(async e =>
                {
                    try
                    {
                        var state  = PermissionHelper.ValidateBool(e.GetArg("bool"));
                        var module = PermissionHelper.ValidateModule(e.GetArg("module"));
                        var role   = PermissionHelper.ValidateRole(e.Server, e.GetArg("channel"));
                        foreach (var command in WizBot.Client.GetService <CommandService>().AllCommands.Where(c => c.Category == module))
                        {
                            PermissionsHandler.SetRoleCommandPermission(role, command.Text, state);
                        }
                        await e.Channel.SendMessage($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false);
                    }
                    catch (ArgumentException exArg)
                    {
                        await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "ubl")
                .Description("Blacklists a mentioned user.\n**Usage**: ;ubl [user_mention]")
                .Parameter("user", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    await Task.Run(async() =>
                    {
                        if (!e.Message.MentionedUsers.Any())
                        {
                            return;
                        }
                        var usr = e.Message.MentionedUsers.First();
                        WizBot.Config.UserBlacklist.Add(usr.Id);
                        ConfigHandler.SaveConfig();
                        await e.Channel.SendMessage($"`Sucessfully blacklisted user {usr.Name}`").ConfigureAwait(false);
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "uubl")
                .Description($"Unblacklists a mentioned user.\n**Usage**: {Prefix}uubl [user_mention]")
                .Parameter("user", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    await Task.Run(async() =>
                    {
                        if (!e.Message.MentionedUsers.Any())
                        {
                            return;
                        }
                        var usr = e.Message.MentionedUsers.First();
                        if (WizBot.Config.UserBlacklist.Contains(usr.Id))
                        {
                            WizBot.Config.UserBlacklist.Remove(usr.Id);
                            ConfigHandler.SaveConfig();
                            await e.Channel.SendMessage($"`Sucessfully unblacklisted user {usr.Name}`").ConfigureAwait(false);
                        }
                        else
                        {
                            await e.Channel.SendMessage($"`{usr.Name} was not in blacklist`").ConfigureAwait(false);
                        }
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "cbl")
                .Description("Blacklists a mentioned channel (#general for example).\n**Usage**: ;cbl [channel_mention]")
                .Parameter("channel", ParameterType.Unparsed)
                .Do(async e =>
                {
                    await Task.Run(async() =>
                    {
                        if (!e.Message.MentionedChannels.Any())
                        {
                            return;
                        }
                        var ch = e.Message.MentionedChannels.First();
                        WizBot.Config.UserBlacklist.Add(ch.Id);
                        ConfigHandler.SaveConfig();
                        await e.Channel.SendMessage($"`Sucessfully blacklisted channel {ch.Name}`").ConfigureAwait(false);
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "cubl")
                .Description("Unblacklists a mentioned channel (#general for example).\n**Usage**: ;cubl [channel_mention]")
                .Parameter("channel", ParameterType.Unparsed)
                .Do(async e =>
                {
                    await Task.Run(async() =>
                    {
                        if (!e.Message.MentionedChannels.Any())
                        {
                            return;
                        }
                        var ch = e.Message.MentionedChannels.First();
                        WizBot.Config.UserBlacklist.Remove(ch.Id);
                        ConfigHandler.SaveConfig();
                        await e.Channel.SendMessage($"`Sucessfully blacklisted channel {ch.Name}`").ConfigureAwait(false);
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "sbl")
                .Description("Blacklists a server by a name or id (#general for example). **BOT OWNER ONLY**\n**Usage**: ;sbl [servername/serverid]")
                .Parameter("server", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    await Task.Run(async() =>
                    {
                        var arg = e.GetArg("server")?.Trim();
                        if (string.IsNullOrWhiteSpace(arg))
                        {
                            return;
                        }
                        var server = WizBot.Client.Servers.FirstOrDefault(s => s.Id.ToString() == arg) ??
                                     WizBot.Client.FindServers(arg.Trim()).FirstOrDefault();
                        if (server == null)
                        {
                            await e.Channel.SendMessage("Cannot find that server").ConfigureAwait(false);
                            return;
                        }
                        var serverId = server.Id;
                        WizBot.Config.ServerBlacklist.Add(serverId);
                        ConfigHandler.SaveConfig();
                        //cleanup trivias and typeracing
                        Modules.Games.Commands.Trivia.TriviaGame trivia;
                        TriviaCommands.RunningTrivias.TryRemove(serverId, out trivia);
                        TypingGame typeracer;
                        SpeedTyping.RunningContests.TryRemove(serverId, out typeracer);

                        await e.Channel.SendMessage($"`Sucessfully blacklisted server {server.Name}`").ConfigureAwait(false);
                    }).ConfigureAwait(false);
                });
            });
        }
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                var client = manager.Client;

                commands.ForEach(cmd => cmd.Init(cgb));

                cgb.CreateCommand(Prefix + "delmsgoncmd")
                .Description($"Toggles the automatic deletion of user's successful command message to prevent chat flood. **Server Manager Only.** | `{Prefix}delmsgoncmd`")
                .AddCheck(SimpleCheckers.ManageServer())
                .Do(async e =>
                {
                    var conf = SpecificConfigurations.Default.Of(e.Server.Id);
                    conf.AutoDeleteMessagesOnCommand = !conf.AutoDeleteMessagesOnCommand;
                    await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false);
                    if (conf.AutoDeleteMessagesOnCommand)
                    {
                        await e.Channel.SendMessage("❗`Now automatically deleting successfull command invokations.`");
                    }
                    else
                    {
                        await e.Channel.SendMessage("❗`Stopped automatic deletion of successfull command invokations.`");
                    }
                });

                cgb.CreateCommand(Prefix + "restart")
                .Description($"Restarts the bot. Might not work. **Bot Owner Only** | `{Prefix}restart`")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    await e.Channel.SendMessage("`Restarting in 2 seconds...`");
                    await Task.Delay(2000);
                    System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);
                    Environment.Exit(0);
                });

                cgb.CreateCommand(Prefix + "setrole").Alias(Prefix + "sr")
                .Description($"Sets a role for a given user. **Needs Manage Roles Permissions.**| `{Prefix}sr @User Guest`")
                .Parameter("user_name", ParameterType.Required)
                .Parameter("role_name", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.CanManageRoles)
                .Do(async e =>
                {
                    var userName = e.GetArg("user_name");
                    var roleName = e.GetArg("role_name");

                    if (string.IsNullOrWhiteSpace(roleName))
                    {
                        return;
                    }

                    if (!e.User.ServerPermissions.ManageRoles)
                    {
                        await e.Channel.SendMessage("You have insufficient permissions.").ConfigureAwait(false);
                    }

                    var usr = e.Server.FindUsers(userName).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("You failed to supply a valid username").ConfigureAwait(false);
                        return;
                    }

                    var role = e.Server.FindRoles(roleName).FirstOrDefault();
                    if (role == null)
                    {
                        await e.Channel.SendMessage("You failed to supply a valid role").ConfigureAwait(false);
                        return;
                    }

                    try
                    {
                        await usr.AddRoles(role).ConfigureAwait(false);
                        await e.Channel.SendMessage($"Successfully added role **{role.Name}** to user **{usr.Name}**").ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage("Failed to add roles. Bot has insufficient permissions.\n").ConfigureAwait(false);
                        Console.WriteLine(ex.ToString());
                    }
                });

                cgb.CreateCommand(Prefix + "removerole").Alias(Prefix + "rr")
                .Description($"Removes a role from a given user. **Needs Manage Roles Permissions.**| `{Prefix}rr @User Admin`")
                .Parameter("user_name", ParameterType.Required)
                .Parameter("role_name", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.CanManageRoles)
                .Do(async e =>
                {
                    var userName = e.GetArg("user_name");
                    var roleName = e.GetArg("role_name");

                    if (string.IsNullOrWhiteSpace(roleName))
                    {
                        return;
                    }

                    var usr = e.Server.FindUsers(userName).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("You failed to supply a valid username").ConfigureAwait(false);
                        return;
                    }

                    var role = e.Server.FindRoles(roleName).FirstOrDefault();
                    if (role == null)
                    {
                        await e.Channel.SendMessage("You failed to supply a valid role").ConfigureAwait(false);
                        return;
                    }

                    try
                    {
                        await usr.RemoveRoles(role).ConfigureAwait(false);
                        await e.Channel.SendMessage($"Successfully removed role **{role.Name}** from user **{usr.Name}**").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "renamerole")
                .Alias(Prefix + "renr")
                .Description($"Renames a role. Roles you are renaming must be lower than bot's highest role. **Manage Roles Permissions.** | `{Prefix}renr \"First role\" SecondRole`")
                .Parameter("r1", ParameterType.Required)
                .Parameter("r2", ParameterType.Required)
                .AddCheck(new SimpleCheckers.ManageRoles())
                .Do(async e =>
                {
                    var r1 = e.GetArg("r1").Trim();
                    var r2 = e.GetArg("r2").Trim();

                    var roleToEdit = e.Server.FindRoles(r1).FirstOrDefault();
                    if (roleToEdit == null)
                    {
                        await e.Channel.SendMessage("Can't find that role.").ConfigureAwait(false);
                        return;
                    }

                    try
                    {
                        if (roleToEdit.Position > e.Server.CurrentUser.Roles.Max(r => r.Position))
                        {
                            await e.Channel.SendMessage("I can't edit roles higher than my highest role.").ConfigureAwait(false);
                            return;
                        }
                        await roleToEdit.Edit(r2);
                        await e.Channel.SendMessage("Role renamed.").ConfigureAwait(false);
                    }
                    catch (Exception)
                    {
                        await e.Channel.SendMessage("Failed to rename role. Probably insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "removeallroles").Alias(Prefix + "rar")
                .Description($"Removes all roles from a mentioned user. **Needs Manage Roles Permissions.**| `{Prefix}rar @User`")
                .Parameter("user_name", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.CanManageRoles)
                .Do(async e =>
                {
                    var userName = e.GetArg("user_name");

                    var usr = e.Server.FindUsers(userName).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("You failed to supply a valid username").ConfigureAwait(false);
                        return;
                    }

                    try
                    {
                        await usr.RemoveRoles(usr.Roles.ToArray()).ConfigureAwait(false);
                        await e.Channel.SendMessage($"Successfully removed **all** roles from user **{usr.Name}**").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "createrole").Alias(Prefix + "cr")
                .Description($"Creates a role with a given name. **Needs Manage Roles Permissions.**| `{Prefix}cr Awesome Role`")
                .Parameter("role_name", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.CanManageRoles)
                .Do(async e =>
                {
                    if (string.IsNullOrWhiteSpace(e.GetArg("role_name")))
                    {
                        return;
                    }
                    try
                    {
                        var r = await e.Server.CreateRole(e.GetArg("role_name")).ConfigureAwait(false);
                        await e.Channel.SendMessage($"Successfully created role **{r.Name}**.").ConfigureAwait(false);
                    }
                    catch (Exception)
                    {
                        await e.Channel.SendMessage(":warning: Unspecified error.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "rolecolor").Alias(Prefix + "rc")
                .Parameter("role_name", ParameterType.Required)
                .Parameter("r", ParameterType.Optional)
                .Parameter("g", ParameterType.Optional)
                .Parameter("b", ParameterType.Optional)
                .Description($"Set a role's color to the hex or 0-255 rgb color value provided. **Needs Manage Roles Permissions.** | `{Prefix}rc Admin 255 200 100` or `{Prefix}rc Admin ffba55`")
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.ManageRoles)
                    {
                        await e.Channel.SendMessage("You don't have permission to use this!").ConfigureAwait(false);
                        return;
                    }

                    var args = e.Args.Where(s => s != string.Empty);

                    if (args.Count() != 2 && args.Count() != 4)
                    {
                        await e.Channel.SendMessage("The parameters are invalid.").ConfigureAwait(false);
                        return;
                    }

                    var role = e.Server.FindRoles(e.Args[0]).FirstOrDefault();

                    if (role == null)
                    {
                        await e.Channel.SendMessage("That role does not exist.").ConfigureAwait(false);
                        return;
                    }
                    try
                    {
                        var rgb  = args.Count() == 4;
                        var arg1 = e.Args[1].Replace("#", "");

                        var red   = Convert.ToByte(rgb ? int.Parse(arg1) : Convert.ToInt32(arg1.Substring(0, 2), 16));
                        var green = Convert.ToByte(rgb ? int.Parse(e.Args[2]) : Convert.ToInt32(arg1.Substring(2, 2), 16));
                        var blue  = Convert.ToByte(rgb ? int.Parse(e.Args[3]) : Convert.ToInt32(arg1.Substring(4, 2), 16));

                        await role.Edit(color: new Color(red, green, blue)).ConfigureAwait(false);
                        await e.Channel.SendMessage($"Role {role.Name}'s color has been changed.").ConfigureAwait(false);
                    }
                    catch (Exception)
                    {
                        await e.Channel.SendMessage("Error occured, most likely invalid parameters or insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "ban").Alias(Prefix + "b")
                .Parameter("user", ParameterType.Required)
                .Parameter("msg", ParameterType.Unparsed)
                .Description($"Bans a user by id or name with an optional message. **Needs Ban Permissions.**| `{Prefix}b \"@some Guy\" Your behaviour is toxic.`")
                .Do(async e =>
                {
                    var msg  = e.GetArg("msg");
                    var user = e.GetArg("user");
                    if (e.User.ServerPermissions.BanMembers)
                    {
                        var usr = e.Server.FindUsers(user).FirstOrDefault();
                        if (usr == null)
                        {
                            await e.Channel.SendMessage("User not found.").ConfigureAwait(false);
                            return;
                        }
                        if (!string.IsNullOrWhiteSpace(msg))
                        {
                            await usr.SendMessage($"**You have been BANNED from `{e.Server.Name}` server.**\n" +
                                                  $"Reason: {msg}").ConfigureAwait(false);
                            await Task.Delay(2000).ConfigureAwait(false);         // temp solution; give time for a message to be send, fu volt
                        }
                        try
                        {
                            await e.Server.Ban(usr, 7).ConfigureAwait(false);

                            await e.Channel.SendMessage("Banned user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false);
                        }
                        catch
                        {
                            await e.Channel.SendMessage("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false);
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "softban").Alias(Prefix + "sb")
                .Parameter("user", ParameterType.Required)
                .Parameter("msg", ParameterType.Unparsed)
                .Description($"Bans and then unbans a user by id or name with an optional message. **Needs Ban Permissions.**| `{Prefix}sb \"@some Guy\" Your behaviour is toxic.`")
                .Do(async e =>
                {
                    var msg  = e.GetArg("msg");
                    var user = e.GetArg("user");
                    if (e.User.ServerPermissions.BanMembers)
                    {
                        var usr = e.Server.FindUsers(user).FirstOrDefault();
                        if (usr == null)
                        {
                            await e.Channel.SendMessage("User not found.").ConfigureAwait(false);
                            return;
                        }
                        if (!string.IsNullOrWhiteSpace(msg))
                        {
                            await usr.SendMessage($"**You have been SOFT-BANNED from `{e.Server.Name}` server.**\n" +
                                                  $"Reason: {msg}").ConfigureAwait(false);
                            await Task.Delay(2000).ConfigureAwait(false);         // temp solution; give time for a message to be send, fu volt
                        }
                        try
                        {
                            await e.Server.Ban(usr, 7).ConfigureAwait(false);
                            await e.Server.Unban(usr).ConfigureAwait(false);

                            await e.Channel.SendMessage("Soft-Banned user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false);
                        }
                        catch
                        {
                            await e.Channel.SendMessage("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false);
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "kick").Alias(Prefix + "k")
                .Parameter("user")
                .Parameter("msg", ParameterType.Unparsed)
                .Description($"Kicks a mentioned user. **Needs Kick Permissions.**| `{Prefix}k \"@some Guy\" Your behaviour is toxic.`")
                .Do(async e =>
                {
                    var msg  = e.GetArg("msg");
                    var user = e.GetArg("user");
                    if (e.User.ServerPermissions.KickMembers)
                    {
                        var usr = e.Server.FindUsers(user).FirstOrDefault();
                        if (usr == null)
                        {
                            await e.Channel.SendMessage("User not found.").ConfigureAwait(false);
                            return;
                        }
                        if (!string.IsNullOrWhiteSpace(msg))
                        {
                            await usr.SendMessage($"**You have been KICKED from `{e.Server.Name}` server.**\n" +
                                                  $"Reason: {msg}").ConfigureAwait(false);
                            await Task.Delay(2000).ConfigureAwait(false);     // temp solution; give time for a message to be send, fu volt
                        }
                        try
                        {
                            await usr.Kick().ConfigureAwait(false);
                            await e.Channel.SendMessage("Kicked user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false);
                        }
                        catch
                        {
                            await e.Channel.SendMessage("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false);
                        }
                    }
                });
                cgb.CreateCommand(Prefix + "mute")
                .Description($"Mutes mentioned user or users. **Needs Mute Permissions.**| `{Prefix}mute \"@Someguy\"` or `{Prefix}mute \"@Someguy\" \"@Someguy\"`")
                .Parameter("throwaway", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.MuteMembers)
                    {
                        await e.Channel.SendMessage("I most likely don't have the permission necessary for that.").ConfigureAwait(false);
                        return;
                    }
                    if (!e.Message.MentionedUsers.Any())
                    {
                        return;
                    }
                    try
                    {
                        foreach (var u in e.Message.MentionedUsers)
                        {
                            await u.Edit(isMuted: true).ConfigureAwait(false);
                        }
                        await e.Channel.SendMessage("Mute successful").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("I most likely don't have the permission necessary for that.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "unmute")
                .Description($"Unmutes mentioned user or users. **Needs Mute Permissions.**| `{Prefix}unmute \"@Someguy\"` or `{Prefix}unmute \"@Someguy\" \"@Someguy\"`")
                .Parameter("throwaway", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.MuteMembers)
                    {
                        await e.Channel.SendMessage("You do not have permission to do that.").ConfigureAwait(false);
                        return;
                    }
                    if (!e.Message.MentionedUsers.Any())
                    {
                        return;
                    }
                    try
                    {
                        foreach (var u in e.Message.MentionedUsers)
                        {
                            await u.Edit(isMuted: false).ConfigureAwait(false);
                        }
                        await e.Channel.SendMessage("Unmute successful").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("I most likely don't have the permission necessary for that.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "deafen")
                .Alias(Prefix + "deaf")
                .Description($"Deafens mentioned user or users. **Needs Deafen Permissions.**| `{Prefix}deaf \"@Someguy\"` or `{Prefix}deaf \"@Someguy\" \"@Someguy\"`")
                .Parameter("throwaway", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.DeafenMembers)
                    {
                        await e.Channel.SendMessage("You do not have permission to do that.").ConfigureAwait(false);
                        return;
                    }
                    if (!e.Message.MentionedUsers.Any())
                    {
                        return;
                    }
                    try
                    {
                        foreach (var u in e.Message.MentionedUsers)
                        {
                            await u.Edit(isDeafened: true).ConfigureAwait(false);
                        }
                        await e.Channel.SendMessage("Deafen successful").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("I most likely don't have the permission necessary for that.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "undeafen")
                .Alias(Prefix + "undef")
                .Description($"Undeafens mentioned user or users. **Needs Deafen Permissions.** | `{Prefix}undef \"@Someguy\"` or `{Prefix}undef \"@Someguy\" \"@Someguy\"`")
                .Parameter("throwaway", ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!e.User.ServerPermissions.DeafenMembers)
                    {
                        await e.Channel.SendMessage("You do not have permission to do that.").ConfigureAwait(false);
                        return;
                    }
                    if (!e.Message.MentionedUsers.Any())
                    {
                        return;
                    }
                    try
                    {
                        foreach (var u in e.Message.MentionedUsers)
                        {
                            await u.Edit(isDeafened: false).ConfigureAwait(false);
                        }
                        await e.Channel.SendMessage("Undeafen successful").ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("I most likely don't have the permission necessary for that.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "delvoichanl")
                .Alias(Prefix + "dvch")
                .Description($"Deletes a voice channel with a given name. **Needs Manage Channel Permissions.**| `{Prefix}dvch VoiceChannelName`")
                .Parameter("channel_name", ParameterType.Required)
                .Do(async e =>
                {
                    try
                    {
                        if (e.User.ServerPermissions.ManageChannels)
                        {
                            var ch = e.Server.FindChannels(e.GetArg("channel_name"), ChannelType.Voice).FirstOrDefault();
                            if (ch == null)
                            {
                                return;
                            }
                            await ch.Delete().ConfigureAwait(false);
                            await e.Channel.SendMessage($"Removed channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
                        }
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Insufficient permissions.");
                    }
                });

                cgb.CreateCommand(Prefix + "creatvoichanl")
                .Alias(Prefix + "cvch")
                .Description($"Creates a new voice channel with a given name. **Needs Manage Channel Permissions.** | `{Prefix}cvch VoiceChannelName`")
                .Parameter("channel_name", ParameterType.Required)
                .Do(async e =>
                {
                    try
                    {
                        if (e.User.ServerPermissions.ManageChannels)
                        {
                            await e.Server.CreateChannel(e.GetArg("channel_name"), ChannelType.Voice).ConfigureAwait(false);
                            await e.Channel.SendMessage($"Created voice channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
                        }
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "deltxtchanl")
                .Alias(Prefix + "dtch")
                .Description($"Deletes a text channel with a given name. **Needs Manage Channel Permissions.** | `{Prefix}dtch TextChannelName`")
                .Parameter("channel_name", ParameterType.Required)
                .Do(async e =>
                {
                    try
                    {
                        if (e.User.ServerPermissions.ManageChannels)
                        {
                            var channel = e.Server.FindChannels(e.GetArg("channel_name"), ChannelType.Text).FirstOrDefault();
                            if (channel == null)
                            {
                                return;
                            }
                            await channel.Delete().ConfigureAwait(false);
                            await e.Channel.SendMessage($"Removed text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
                        }
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "creatxtchanl")
                .Alias(Prefix + "ctch")
                .Description($"Creates a new text channel with a given name. **Needs Manage Channel Permissions.** | `{Prefix}ctch TextChannelName`")
                .Parameter("channel_name", ParameterType.Required)
                .Do(async e =>
                {
                    try
                    {
                        if (e.User.ServerPermissions.ManageChannels)
                        {
                            await e.Server.CreateChannel(e.GetArg("channel_name"), ChannelType.Text).ConfigureAwait(false);
                            await e.Channel.SendMessage($"Added text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false);
                        }
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Insufficient permissions.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "settopic")
                .Alias(Prefix + "st")
                .Description($"Sets a topic on the current channel. **Needs Manage Channel Permissions.** | `{Prefix}st My new topic`")
                .AddCheck(SimpleCheckers.ManageChannels())
                .Parameter("topic", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var topic = e.GetArg("topic")?.Trim() ?? "";
                    await e.Channel.Edit(topic: topic).ConfigureAwait(false);
                    await e.Channel.SendMessage(":ok: **New channel topic set.**").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "setchanlname")
                .Alias(Prefix + "schn")
                .Description($"Changed the name of the current channel. **Needs Manage Channel Permissions.**| `{Prefix}schn NewName`")
                .AddCheck(SimpleCheckers.ManageChannels())
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var name = e.GetArg("name");
                    if (string.IsNullOrWhiteSpace(name))
                    {
                        return;
                    }
                    await e.Channel.Edit(name: name).ConfigureAwait(false);
                    await e.Channel.SendMessage(":ok: **New channel name set.**").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "heap")
                .Description($"Shows allocated memory - **Bot Owner Only!** | `{Prefix}heap`")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    var heap = await Task.Run(() => NadekoStats.Instance.Heap()).ConfigureAwait(false);
                    await e.Channel.SendMessage($"`Heap Size:` {heap}").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "prune")
                .Alias(Prefix + "clr")
                .Description(
                    "`.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. " +
                    $"| `{Prefix}prune` or `{Prefix}prune 5` or `{Prefix}prune @Someone` or `{Prefix}prune @Someone X`")
                .Parameter("user_or_num", ParameterType.Optional)
                .Parameter("num", ParameterType.Optional)
                .Do(async e =>
                {
                    if (string.IsNullOrWhiteSpace(e.GetArg("user_or_num")))     // if nothing is set, clear nadeko's messages, no permissions required
                    {
                        var msgs = (await e.Channel.DownloadMessages(100).ConfigureAwait(false)).Where(m => m.User?.Id == e.Server.CurrentUser.Id)?.ToArray();
                        if (msgs == null || !msgs.Any())
                        {
                            return;
                        }
                        var toDelete = msgs as Message[] ?? msgs.ToArray();
                        await e.Channel.DeleteMessages(toDelete).ConfigureAwait(false);
                        return;
                    }
                    if (!e.User.GetPermissions(e.Channel).ManageMessages)
                    {
                        return;
                    }
                    else if (!e.Server.CurrentUser.GetPermissions(e.Channel).ManageMessages)
                    {
                        await e.Channel.SendMessage("💢I don't have the permission to manage messages.");
                        return;
                    }
                    int val;
                    if (int.TryParse(e.GetArg("user_or_num"), out val))     // if num is set in the first argument,
                                                                            //delete that number of messages.
                    {
                        if (val <= 0)
                        {
                            return;
                        }
                        val++;
                        await e.Channel.DeleteMessages((await e.Channel.DownloadMessages(val).ConfigureAwait(false)).ToArray()).ConfigureAwait(false);
                        return;
                    }
                    //else if first argument is user
                    var usr = e.Server.FindUsers(e.GetArg("user_or_num")).FirstOrDefault();
                    if (usr == null)
                    {
                        return;
                    }
                    val = 100;
                    if (!int.TryParse(e.GetArg("num"), out val))
                    {
                        val = 100;
                    }
                    var mesgs = (await e.Channel.DownloadMessages(100).ConfigureAwait(false)).Where(m => m.User?.Id == usr.Id).Take(val);
                    if (mesgs == null || !mesgs.Any())
                    {
                        return;
                    }
                    await e.Channel.DeleteMessages(mesgs as Message[] ?? mesgs.ToArray()).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "die")
                .Description($"Shuts the bot down and notifies users about the restart. **Bot Owner Only!** | `{Prefix}die`")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    await e.Channel.SendMessage("`Shutting down.`").ConfigureAwait(false);
                    await Task.Delay(2000).ConfigureAwait(false);
                    Environment.Exit(0);
                });

                cgb.CreateCommand(Prefix + "setname")
                .Alias(Prefix + "newnm")
                .Description($"Give the bot a new name. **Bot Owner Only!** | {Prefix}newnm BotName")
                .Parameter("new_name", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    if (e.GetArg("new_name") == null)
                    {
                        return;
                    }

                    await client.CurrentUser.Edit("", e.GetArg("new_name")).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "newavatar")
                .Alias(Prefix + "setavatar")
                .Description($"Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot Owner Only!** | `{Prefix}setavatar https://i.ytimg.com/vi/WDudkR1eTMM/maxresdefault.jpg`")
                .Parameter("img", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    if (string.IsNullOrWhiteSpace(e.GetArg("img")))
                    {
                        return;
                    }
                    // Gather user provided URL.
                    var avatarAddress = e.GetArg("img");
                    var imageStream   = await SearchHelper.GetResponseStreamAsync(avatarAddress).ConfigureAwait(false);
                    var image         = System.Drawing.Image.FromStream(imageStream);
                    await client.CurrentUser.Edit("", avatar: image.ToStream()).ConfigureAwait(false);

                    // Send confirm.
                    await e.Channel.SendMessage("New avatar set.").ConfigureAwait(false);

                    // Save the image to disk.
                    image.Save("data/avatar.png", System.Drawing.Imaging.ImageFormat.Png);
                });

                cgb.CreateCommand(Prefix + "setgame")
                .Description($"Sets the bots game. **Bot Owner Only!** | `{Prefix}setgame Playing with kwoth`")
                .Parameter("set_game", ParameterType.Unparsed)
                .Do(e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id) || e.GetArg("set_game") == null)
                    {
                        return;
                    }

                    client.SetGame(e.GetArg("set_game"));
                });

                cgb.CreateCommand(Prefix + "send")
                .Description($"Send a message to someone on a different server through the bot. **Bot Owner Only!** | `{Prefix}send serverid|u:user_id Send this to a user!` or `{Prefix}send serverid|c:channel_id Send this to a channel!`")
                .Parameter("ids", ParameterType.Required)
                .Parameter("msg", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    var msg = e.GetArg("msg")?.Trim();

                    if (string.IsNullOrWhiteSpace(msg))
                    {
                        return;
                    }

                    var ids = e.GetArg("ids").Split('|');
                    if (ids.Length != 2)
                    {
                        return;
                    }
                    var sid    = ulong.Parse(ids[0]);
                    var server = NadekoBot.Client.Servers.Where(s => s.Id == sid).FirstOrDefault();

                    if (server == null)
                    {
                        return;
                    }

                    if (ids[1].ToUpperInvariant().StartsWith("C:"))
                    {
                        var cid     = ulong.Parse(ids[1].Substring(2));
                        var channel = server.TextChannels.Where(c => c.Id == cid).FirstOrDefault();
                        if (channel == null)
                        {
                            return;
                        }
                        await channel.SendMessage(msg);
                    }
                    else if (ids[1].ToUpperInvariant().StartsWith("U:"))
                    {
                        var uid  = ulong.Parse(ids[1].Substring(2));
                        var user = server.Users.Where(u => u.Id == uid).FirstOrDefault();
                        if (user == null)
                        {
                            return;
                        }
                        await user.SendMessage(msg);
                    }
                    else
                    {
                        await e.Channel.SendMessage("`Invalid format.`");
                    }
                });

                cgb.CreateCommand(Prefix + "mentionrole")
                .Alias(Prefix + "menro")
                .Description($"Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission. | `{Prefix}menro RoleName`")
                .Parameter("roles", ParameterType.Unparsed)
                .Do(async e =>
                {
                    await Task.Run(async() =>
                    {
                        if (!e.User.ServerPermissions.MentionEveryone)
                        {
                            return;
                        }
                        var arg     = e.GetArg("roles").Split(',').Select(r => r.Trim());
                        string send = $"--{e.User.Mention} has invoked a mention on the following roles--";
                        foreach (var roleStr in arg.Where(str => !string.IsNullOrWhiteSpace(str)))
                        {
                            var role = e.Server.FindRoles(roleStr).FirstOrDefault();
                            if (role == null)
                            {
                                continue;
                            }
                            send += $"\n`{role.Name}`\n";
                            send += string.Join(", ", role.Members.Select(r => r.Mention));
                        }

                        while (send.Length > 2000)
                        {
                            var curstr = send.Substring(0, 2000);
                            await
                            e.Channel.Send(curstr.Substring(0,
                                                            curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1)).ConfigureAwait(false);
                            send = curstr.Substring(curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1) +
                                   send.Substring(2000);
                        }
                        await e.Channel.Send(send).ConfigureAwait(false);
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "unstuck")
                .Description($"Clears the message queue. **Bot Owner Only!** | `{Prefix}unstuck`")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(e =>
                {
                    NadekoBot.Client.MessageQueue.Clear();
                });

                cgb.CreateCommand(Prefix + "donators")
                .Description($"List of lovely people who donated to keep this project alive. | `{Prefix}donators`")
                .Do(async e =>
                {
                    await Task.Run(async() =>
                    {
                        var rows            = DbHandler.Instance.GetAllRows <Donator>();
                        var donatorsOrdered = rows.OrderByDescending(d => d.Amount);
                        string str          = $"**Thanks to the people listed below for making this project happen!**\n";

                        await e.Channel.SendMessage(str + string.Join("⭐", donatorsOrdered.Select(d => d.UserName))).ConfigureAwait(false);
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "donadd")
                .Description($"Add a donator to the database. **Kwoth Only** | `{Prefix}donadd Donate Amount`")
                .Parameter("donator")
                .Parameter("amount")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    await Task.Run(() =>
                    {
                        var donator = e.Server.FindUsers(e.GetArg("donator")).FirstOrDefault();
                        var amount  = int.Parse(e.GetArg("amount"));
                        if (donator == null)
                        {
                            return;
                        }
                        try
                        {
                            DbHandler.Instance.Connection.Insert(new Donator
                            {
                                Amount   = amount,
                                UserName = donator.Name,
                                UserId   = (long)donator.Id
                            });
                            e.Channel.SendMessage("Successfuly added a new donator. 👑").ConfigureAwait(false);
                        }
                        catch { }
                    }).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "announce")
                .Description($"Sends a message to all servers' general channel bot is connected to.**Bot Owner Only!** | `{Prefix}announce Useless spam`")
                .Parameter("msg", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    foreach (var ch in NadekoBot.Client.Servers.Select(s => s.DefaultChannel))
                    {
                        await ch.SendMessage(e.GetArg("msg")).ConfigureAwait(false);
                    }

                    await e.Channel.SendMessage(":ok:").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "savechat")
                .Description($"Saves a number of messages to a text file and sends it to you. **Bot Owner Only** | `{Prefix}savechat 150`")
                .Parameter("cnt", ParameterType.Required)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    var cntstr = e.GetArg("cnt")?.Trim();
                    int cnt;
                    if (!int.TryParse(cntstr, out cnt))
                    {
                        return;
                    }
                    ulong?lastmsgId = null;
                    var sb          = new StringBuilder();
                    var msgs        = new List <Message>(cnt);
                    while (cnt > 0)
                    {
                        var dlcnt = cnt < 100 ? cnt : 100;

                        var dledMsgs = await e.Channel.DownloadMessages(dlcnt, lastmsgId);
                        if (!dledMsgs.Any())
                        {
                            break;
                        }
                        msgs.AddRange(dledMsgs);
                        lastmsgId = msgs[msgs.Count - 1].Id;
                        cnt      -= 100;
                    }
                    await e.User.SendFile($"Chatlog-{e.Server.Name}/#{e.Channel.Name}-{DateTime.Now}.txt", JsonConvert.SerializeObject(new { Messages = msgs.Select(s => s.ToString()) }, Formatting.Indented).ToStream()).ConfigureAwait(false);
                });
            });
        }
Beispiel #29
0
        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.")
            .AddCheck(SimpleCheckers.ManageServer())
            .Do(async e =>
            {
                var specificConfig = SpecificConfigurations.Default.Of(e.Server.Id);
                specificConfig.SendPrivateMessageOnMention =
                    !specificConfig.SendPrivateMessageOnMention;
                if (specificConfig.SendPrivateMessageOnMention)
                {
                    await e.Channel.SendMessage(":ok: I will send private messages " +
                                                "to mentioned offline users.");
                }
                else
                {
                    await e.Channel.SendMessage(":ok: I won't send private messages " +
                                                "to mentioned offline users anymore.");
                }
            });

            cgb.CreateCommand(Module.Prefix + "logserver")
            .Description("Toggles logging in this channel. Logs every message sent/deleted/edited on the server. **Owner Only!**")
            .AddCheck(SimpleCheckers.OwnerOnly())
            .AddCheck(SimpleCheckers.ManageServer())
            .Do(DoFunc());

            cgb.CreateCommand(Module.Prefix + "userpresence")
            .Description("Starts logging to this channel when someone from the server goes online/offline/idle. **Owner Only!**")
            .AddCheck(SimpleCheckers.OwnerOnly())
            .AddCheck(SimpleCheckers.ManageServer())
            .Do(async e =>
            {
                Channel ch;
                if (!loggingPresences.TryRemove(e.Server, out ch))
                {
                    loggingPresences.TryAdd(e.Server, e.Channel);
                    await e.Channel.SendMessage($"**User presence notifications enabled.**");
                    return;
                }

                await e.Channel.SendMessage($"**User presence notifications disabled.**");
            });

            cgb.CreateCommand(Module.Prefix + "voicepresence")
            .Description("Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. **Owner Only!**")
            .Parameter("all", ParameterType.Optional)
            .AddCheck(SimpleCheckers.OwnerOnly())
            .AddCheck(SimpleCheckers.ManageServer())
            .Do(async e =>
            {
                if (e.GetArg("all")?.ToLower() == "all")
                {
                    foreach (var voiceChannel in e.Server.VoiceChannels)
                    {
                        voiceChannelLog.TryAdd(voiceChannel, e.Channel);
                    }
                    await e.Channel.SendMessage("Started logging user presence for **ALL** voice channels!");
                    return;
                }

                if (e.User.VoiceChannel == null)
                {
                    await e.Channel.SendMessage("💢 You are not in a voice channel right now. If you are, please rejoin it.");
                    return;
                }
                Channel throwaway;
                if (!voiceChannelLog.TryRemove(e.User.VoiceChannel, out throwaway))
                {
                    voiceChannelLog.TryAdd(e.User.VoiceChannel, e.Channel);
                    await e.Channel.SendMessage($"`Logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`");
                }
                else
                {
                    await e.Channel.SendMessage($"`Stopped logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`");
                }
            });
        }
Beispiel #30
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                commands.ForEach(com => com.Init(cgb));

                cgb.CreateCommand(Prefix + "raffle")
                .Description("Prints a name and ID of a random user from the online list from the (optional) role.")
                .Parameter("role", ParameterType.Optional)
                .Do(async e =>
                {
                    var arg  = string.IsNullOrWhiteSpace(e.GetArg("role")) ? "@everyone" : e.GetArg("role");
                    var role = e.Server.FindRoles(arg).FirstOrDefault();
                    if (role == null)
                    {
                        await e.Channel.SendMessage("💢 Role not found.").ConfigureAwait(false);
                        return;
                    }
                    var members      = role.Members.Where(u => u.Status == UserStatus.Online); // only online
                    var membersArray = members as User[] ?? members.ToArray();
                    var usr          = membersArray[new Random().Next(0, membersArray.Length)];
                    await e.Channel.SendMessage($"**Raffled user:** {usr.Name} (id: {usr.Id})").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "$$")
                .Description(string.Format("Check how much {0}s a person has. (Defaults to yourself)\n**Usage**:`{1}$$` or `{1}$$ @Someone`",
                                           NadekoBot.Config.CurrencyName, Prefix))
                .Parameter("all", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var usr = e.Message.MentionedUsers.FirstOrDefault() ?? e.User;
                    var pts = GetUserFlowers(usr.Id);
                    var str = $"{usr.Name} has {pts} {NadekoBot.Config.CurrencySign}";
                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "give")
                .Description(string.Format("Give someone a certain amount of {0}s", NadekoBot.Config.CurrencyName))
                .Parameter("amount", ParameterType.Required)
                .Parameter("receiver", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != NadekoBot.Client.CurrentUser.Id &&
                                                                                u.Id != e.User.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    var userFlowers = GetUserFlowers(e.User.Id);

                    if (userFlowers < amount)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You have only {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false);
                        return;
                    }

                    FlowersHandler.RemoveFlowers(e.User, "Gift", (int)amount);
                    await FlowersHandler.AddFlowersAsync(mentionedUser, "Gift", (int)amount).ConfigureAwait(false);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully sent {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "award")
                .Description("Gives someone a certain amount of flowers. **Bot Owner Only!**\n**Usage**: `$award 100 @person`")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Parameter("amount", ParameterType.Required)
                .Parameter("receiver", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != NadekoBot.Client.CurrentUser.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    await FlowersHandler.AddFlowersAsync(mentionedUser, $"Awarded by bot owner. ({e.User.Name}/{e.User.Id})", (int)amount).ConfigureAwait(false);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully awarded {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "take")
                .Description("Takes a certain amount of flowers from someone. **Bot Owner Only!**")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Parameter("amount", ParameterType.Required)
                .Parameter("rektperson", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != NadekoBot.Client.CurrentUser.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    FlowersHandler.RemoveFlowers(mentionedUser, $"Taken by bot owner.({e.User.Name}/{e.User.Id})", (int)amount);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully took {amount} {NadekoBot.Config.CurrencyName}s from {mentionedUser.Mention}!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "leaderboard")
                .Alias(Prefix + "lb")
                .Do(async e =>
                {
                    var richestTemp = DbHandler.Instance.GetTopRichest();
                    var richest     = richestTemp as CurrencyState[] ?? richestTemp.ToArray();
                    if (richest.Length == 0)
                    {
                        return;
                    }
                    await e.Channel.SendMessage(
                        richest.Aggregate(new StringBuilder(
                                              $@"```xl
┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓
┃        Id         ┃  $$$  ┃
"),
                                          (cur, cs) => cur.AppendLine(
                                              $@"┣━━━━━━━━━━━━━━━━━━━╋━━━━━━━┫
┃{cs.UserId,-18} ┃ {cs.Value,5} ┃")
                                          ).ToString() + "┗━━━━━━━━━━━━━━━━━━━┻━━━━━━━┛```");
                });
            });
        }