Example #1
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "typestart")
            .Description("Starts a typing contest.")
            .Do(DoFunc());

            cgb.CreateCommand(Module.Prefix + "typestop")
            .Description("Stops a typing contest on the current channel.")
            .Do(QuitFunc());

            cgb.CreateCommand(Module.Prefix + "typeadd")
            .Description("Adds a new article to the typing contest. Owner only.")
            .Parameter("text", ParameterType.Unparsed)
            .Do(async e => {
                if (!NadekoBot.IsOwner(e.User.Id) || string.IsNullOrWhiteSpace(e.GetArg("text")))
                {
                    return;
                }

                DbHandler.Instance.InsertData(new TypingArticle {
                    Text      = e.GetArg("text"),
                    DateAdded = DateTime.Now
                });

                await e.Channel.SendMessage("Added new article for typing game.");
            });

            //todo add user submissions
        }
Example #2
0
        public FilterWords(DiscordModule module) : base(module)
        {
            NadekoBot.OnReady += () => NadekoBot.Client.MessageReceived += async(sender, args) =>
            {
                if (args.Channel.IsPrivate || args.User.Id == NadekoBot.Client.CurrentUser.Id)
                {
                    return;
                }
                if (NadekoBot.IsOwner(args.User.Id))
                {
                    return;
                }
                try
                {
                    var role_devs   = args.Server.FindRoles("Developers").FirstOrDefault();
                    var role_admins = args.Server.FindRoles("Administrators").FirstOrDefault();
                    var role_mods   = args.Server.FindRoles("Moderators").FirstOrDefault();
                    var role_custom = args.Server.FindRoles("Discord").FirstOrDefault();
                    if (args.User.HasRole(role_devs) || args.User.HasRole(role_admins) || args.User.HasRole(role_mods) || args.User.HasRole(role_custom))
                    {
                        return;
                    }
                } catch { }
                try
                {
                    Classes.ServerPermissions serverPerms;
                    if (!IsChannelOrServerFiltering(args.Channel, out serverPerms))
                    {
                        return;
                    }

                    var wordsInMessage = args.Message.RawText.ToLowerInvariant().Split(' ');
                    if (serverPerms.Words.Any(w => wordsInMessage.Contains(w)))
                    {
                        await args.Message.Delete().ConfigureAwait(false);

                        IncidentsHandler.Add(args.Server.Id, args.Channel.Id, $"User [{args.User.Name}/{args.User.Id}] posted " +
                                             $"BANNED WORD in [{args.Channel.Name}/{args.Channel.Id}] channel.\n" +
                                             $"`Full message:` {args.Message.Text}");
                        if (serverPerms.Verbose)
                        {
                            await args.Channel.GetUser(args.User.Id).SendMessage($"{args.User.Mention} One or more of the words you used " +
                                                                                 $"in that sentence are not allowed here.")
                            .ConfigureAwait(false);
                        }
                    }
                }
                catch { }
            };
        }
Example #3
0
        public Func <CommandEventArgs, Task> DoFunc() => async e => {
            if (!NadekoBot.IsOwner(e.User.Id) ||
                !e.User.ServerPermissions.ManageServer)
            {
                return;
            }
            Channel ch;
            if (!logs.TryRemove(e.Server, out ch))
            {
                logs.TryAdd(e.Server, e.Channel);
                await e.Channel.SendMessage($"**I WILL BEGIN LOGGING SERVER ACTIVITY IN THIS CHANNEL**");

                return;
            }

            await e.Channel.SendMessage($"**NO LONGER LOGGING IN {ch.Mention} CHANNEL**");
        };
Example #4
0
 public RatelimitCommand(DiscordModule module) : base(module)
 {
     NadekoBot.OnReady += () => NadekoBot.Client.MessageReceived += async(s, e) =>
     {
         if (e.Channel.IsPrivate || e.User.Id == NadekoBot.Client.CurrentUser.Id)
         {
             return;
         }
         if (NadekoBot.IsOwner(e.User.Id))
         {
             return;
         }
         try {
             var role_devs   = e.Server.FindRoles("Developers").FirstOrDefault();
             var role_admins = e.Server.FindRoles("Administrators").FirstOrDefault();
             var role_mods   = e.Server.FindRoles("Moderators").FirstOrDefault();
             var role_custom = e.Server.FindRoles("Discord").FirstOrDefault();
             if (e.User.HasRole(role_devs) || e.User.HasRole(role_admins) || e.User.HasRole(role_mods) || e.User.HasRole(role_custom))
             {
                 return;
             }
         }
         catch { }
         ConcurrentDictionary <ulong, DateTime> userTimePair;
         if (!RatelimitingChannels.TryGetValue(e.Channel.Id, out userTimePair))
         {
             return;
         }
         DateTime lastMessageTime;
         if (userTimePair.TryGetValue(e.User.Id, out lastMessageTime))
         {
             TimeSpan ratelimitTime = new TimeSpan(0, 0, 0, slowtime);
             if (DateTime.Now - lastMessageTime < ratelimitTime)
             {
                 try
                 {
                     await e.Message.Delete().ConfigureAwait(false);
                 }
                 catch { }
                 return;
             }
         }
         userTimePair.AddOrUpdate(e.User.Id, id => DateTime.Now, (id, dt) => DateTime.Now);
     };
 }
Example #5
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:");
                });
            });
        }
Example #6
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand("req")
            .Alias("request")
            .Description("Requests a feature for nadeko.\n**Usage**: @NadekoBot req new_feature")
            .Parameter("all", ParameterType.Unparsed)
            .Do(async e => {
                var str = e.Args[0];

                try {
                    SaveRequest(e, str);
                } catch  {
                    await e.Channel.SendMessage("Something went wrong.");
                    return;
                }
                await e.Channel.SendMessage("Thank you for your request.");
            });

            cgb.CreateCommand("lr")
            .Description("PMs the user all current nadeko requests.")
            .Do(async e => {
                var str = await Task.Run(() => GetRequests());
                if (str.Trim().Length > 110)
                {
                    await e.User.Send(str);
                }
                else
                {
                    await e.User.Send("No requests atm.");
                }
            });

            cgb.CreateCommand("dr")
            .Description("Deletes a request. Only owner is able to do this.")
            .Parameter("reqNumber", ParameterType.Required)
            .Do(async e => {
                if (NadekoBot.IsOwner(e.User.Id))
                {
                    try {
                        if (DeleteRequest(int.Parse(e.Args[0])))
                        {
                            await e.Channel.SendMessage(e.User.Mention + " Request deleted.");
                        }
                        else
                        {
                            await e.Channel.SendMessage("No request on that number.");
                        }
                    } catch {
                        await e.Channel.SendMessage("Error deleting request, probably NaN error.");
                    }
                }
                else
                {
                    await e.Channel.SendMessage("You don't have permission to do that.");
                }
            });

            cgb.CreateCommand("rr")
            .Description("Resolves a request. Only owner is able to do this.")
            .Parameter("reqNumber", ParameterType.Required)
            .Do(async e => {
                if (NadekoBot.IsOwner(e.User.Id))
                {
                    try {
                        var sc = ResolveRequest(int.Parse(e.Args[0]));
                        if (sc != null)
                        {
                            await e.Channel.SendMessage(e.User.Mention + " Request resolved, notice sent.");
                            await NadekoBot.Client.GetServer((ulong)sc.ServerId).GetUser((ulong)sc.UserId).Send("**This request of yours has been resolved:**\n" + sc.RequestText);
                        }
                        else
                        {
                            await e.Channel.SendMessage("No request on that number.");
                        }
                    } catch {
                        await e.Channel.SendMessage("Error resolving request, probably NaN error.");
                    }
                }
                else
                {
                    await e.Channel.SendMessage("You don't have permission to do that.");
                }
            });
        }
Example #7
0
        public override void Install(ModuleManager manager)
        {
            var rng = new Random();

            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                cgb.CreateCommand("..")
                .Description("Adds a new quote with the specified name (single word) and message (no limit). | `.. abc My message`")
                .Parameter("keyword", ParameterType.Required)
                .Parameter("text", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var text = e.GetArg("text");
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return;
                    }
                    await Task.Run(() =>
                                   Classes.DbHandler.Instance.Connection.Insert(new DataModels.UserQuote()
                    {
                        DateAdded = DateTime.Now,
                        Keyword   = e.GetArg("keyword").ToLowerInvariant(),
                        Text      = text,
                        UserName  = e.User.Name,
                    })).ConfigureAwait(false);

                    await e.Channel.SendMessage("`New quote added.`").ConfigureAwait(false);
                });

                cgb.CreateCommand("...")
                .Description("Shows a random quote with a specified name. | `... abc`")
                .Parameter("keyword", ParameterType.Required)
                .Do(async e =>
                {
                    var keyword = e.GetArg("keyword")?.ToLowerInvariant();
                    if (string.IsNullOrWhiteSpace(keyword))
                    {
                        return;
                    }

                    var quote =
                        Classes.DbHandler.Instance.GetRandom <DataModels.UserQuote>(
                            uqm => uqm.Keyword == keyword);

                    if (quote != null)
                    {
                        await e.Channel.SendMessage($"📣 {quote.Text}").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("💢`No quote found.`").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("..qdel")
                .Alias("..quotedelete")
                .Description("Deletes all quotes with the specified keyword. You have to either be bot owner or the creator of the quote to delete it. | `..qdel abc`")
                .Parameter("quote", ParameterType.Required)
                .Do(async e =>
                {
                    var text = e.GetArg("quote")?.Trim();
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return;
                    }
                    await Task.Run(() =>
                    {
                        if (NadekoBot.IsOwner(e.User.Id))
                        {
                            Classes.DbHandler.Instance.DeleteWhere <UserQuote>(uq => uq.Keyword == text);
                        }
                        else
                        {
                            Classes.DbHandler.Instance.DeleteWhere <UserQuote>(uq => uq.Keyword == text && uq.UserName == e.User.Name);
                        }
                    }).ConfigureAwait(false);

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

            manager.CreateCommands(NadekoBot.BotMention, cgb =>
            {
                var client = manager.Client;

                cgb.AddCheck(PermissionChecker.Instance);

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

                cgb.CreateCommand("die")
                .Description("Works only for the owner. Shuts the bot down. | `@NadekoBot die`")
                .Do(async e =>
                {
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Yes, my love.").ConfigureAwait(false);
                        await Task.Delay(5000).ConfigureAwait(false);
                        Environment.Exit(0);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", No.").ConfigureAwait(false);
                    }
                });

                var randServerSw = new Stopwatch();
                randServerSw.Start();

                cgb.CreateCommand("do you love me")
                .Description("Replies with positive answer only to the bot owner. | `@NadekoBot do you love me`")
                .Do(async e =>
                {
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Of course I do, my Master.").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Don't be silly.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("how are you")
                .Alias("how are you?")
                .Description("Replies positive only if bot owner is online. | `@NadekoBot how are you`")
                .Do(async e =>
                {
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + " I am great as long as you are here.").ConfigureAwait(false);
                        return;
                    }
                    var kw = e.Server.GetUser(NadekoBot.Creds.OwnerIds[0]);
                    if (kw != null && kw.Status == UserStatus.Online)
                    {
                        await e.Channel.SendMessage(e.User.Mention + " I am great as long as " + kw.Mention + " is with me.").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + " I am sad. My Master is not with me.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("fire")
                .Description("Shows a unicode fire message. Optional parameter [x] tells her how many times to repeat the fire. | `@NadekoBot fire [x]`")
                .Parameter("times", ParameterType.Optional)
                .Do(async e =>
                {
                    int count;
                    if (string.IsNullOrWhiteSpace(e.Args[0]))
                    {
                        count = 1;
                    }
                    else
                    {
                        int.TryParse(e.Args[0], out count);
                    }
                    if (count < 1 || count > 12)
                    {
                        await e.Channel.SendMessage("Number must be between 1 and 12").ConfigureAwait(false);
                        return;
                    }

                    var str = new StringBuilder();
                    for (var i = 0; i < count; i++)
                    {
                        str.Append(firestr);
                    }
                    await e.Channel.SendMessage(str.ToString()).ConfigureAwait(false);
                });

                cgb.CreateCommand("dump")
                .Description("Dumps all of the invites it can to dump.txt.** Owner Only.** | `@NadekoBot dump`")
                .Do(async e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    var i       = 0;
                    var j       = 0;
                    var invites = "";
                    foreach (var s in client.Servers)
                    {
                        try
                        {
                            var invite = await s.CreateInvite(0).ConfigureAwait(false);
                            invites   += invite.Url + "\n";
                            i++;
                        }
                        catch
                        {
                            j++;
                            continue;
                        }
                    }
                    File.WriteAllText("dump.txt", invites);
                    await e.Channel.SendMessage($"Got invites for {i} servers and failed to get invites for {j} servers")
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand("ab")
                .Description("Try to get 'abalabahaha'| `@NadekoBot ab`")
                .Do(async e =>
                {
                    string[] strings = { "ba", "la", "ha" };
                    var construct    = "@a";
                    var cnt          = rng.Next(4, 7);
                    while (cnt-- > 0)
                    {
                        construct += strings[rng.Next(0, strings.Length)];
                    }
                    await e.Channel.SendMessage(construct).ConfigureAwait(false);
                });
            });
        }
Example #8
0
        public override void Install(ModuleManager manager)
        {
            var rng = new Random();

            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                cgb.CreateCommand("e")
                .Description("You did it. Or someone else!")
                .Parameter("other", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var other = e.GetArg("other");
                    if (string.IsNullOrWhiteSpace(other))
                    {
                        await e.Channel.SendMessage($"{e.User.Name} did it. рЯШТ рЯФЂ").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage($"{other} did it. рЯШТ рЯФЂ").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("comeatmebro")
                .Description("Come at me bro (аЄЗвАЩћА-вАШћБ)аЄЗ \n**Usage**: comeatmebro {target}")
                .Parameter("target", ParameterType.Optional)
                .Do(async e =>
                {
                    var usr = e.Server.FindUsers(e.GetArg("target")).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("(аЄЗвАЩћА-вАШћБ)аЄЗ").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage($"{usr.Mention} (аЄЗвАЩћА-вАШћБ)аЄЗ").ConfigureAwait(false);
                });


                cgb.CreateCommand("\\o\\")
                .Description("Nadeko replies with /o/")
                .Do(async e => await e.Channel.SendMessage(e.User.Mention + "/o/").ConfigureAwait(false));

                cgb.CreateCommand("/o/")
                .Description("Nadeko replies with \\o\\")
                .Do(async e => await e.Channel.SendMessage(e.User.Mention + "\\o\\").ConfigureAwait(false));

                cgb.CreateCommand("moveto")
                .Description("Suggests moving the conversation.\n**Usage**: moveto #spam")
                .Parameter("target", ParameterType.Unparsed)
                .Do(async e => await e.Channel.SendMessage($"(рЯСЙ Ќ°¬∞ ЌЬ Ц Ќ°¬∞)рЯСЙ {e.GetArg("target")}"));


                cgb.CreateCommand("..")
                .Description("Adds a new quote with the specified name (single word) and message (no limit).\n**Usage**: .. abc My message")
                .Parameter("keyword", ParameterType.Required)
                .Parameter("text", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var text = e.GetArg("text");
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return;
                    }
                    await Task.Run(() =>
                                   Classes.DbHandler.Instance.InsertData(new DataModels.UserQuote()
                    {
                        DateAdded = DateTime.Now,
                        Keyword   = e.GetArg("keyword").ToLowerInvariant(),
                        Text      = text,
                        UserName  = e.User.Name,
                    })).ConfigureAwait(false);

                    await e.Channel.SendMessage("`New quote added.`").ConfigureAwait(false);
                });

                cgb.CreateCommand("...")
                .Description("Shows a random quote with a specified name.\n**Usage**: .. abc")
                .Parameter("keyword", ParameterType.Required)
                .Do(async e =>
                {
                    var keyword = e.GetArg("keyword")?.ToLowerInvariant();
                    if (string.IsNullOrWhiteSpace(keyword))
                    {
                        return;
                    }

                    var quote =
                        Classes.DbHandler.Instance.GetRandom <DataModels.UserQuote>(
                            uqm => uqm.Keyword == keyword);

                    if (quote != null)
                    {
                        await e.Channel.SendMessage($"рЯУ£ {quote.Text}").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("рЯТ¢`No quote found.`").ConfigureAwait(false);
                    }
                });
            });

            manager.CreateCommands(NadekoBot.BotMention, cgb =>
            {
                var client = manager.Client;

                cgb.AddCheck(PermissionChecker.Instance);

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

                cgb.CreateCommand("uptime")
                .Description("Shows how long Nadeko has been running for.")
                .Do(async e =>
                {
                    var time = (DateTime.Now - Process.GetCurrentProcess().StartTime);
                    var str  = string.Format("I have been running for {0} days, {1} hours, and {2} minutes.", time.Days, time.Hours, time.Minutes);
                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand("die")
                .Description("Works only for the owner. Shuts the bot down.")
                .Do(async e =>
                {
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Yes, my love.").ConfigureAwait(false);
                        await Task.Delay(5000).ConfigureAwait(false);
                        Environment.Exit(0);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", No.").ConfigureAwait(false);
                    }
                });

                var randServerSw = new Stopwatch();
                randServerSw.Start();

                cgb.CreateCommand("do you love me")
                .Description("Replies with positive answer only to the bot owner.")
                .Do(async e =>
                {
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Of course I do, my Master.").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Don't be silly.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("how are you")
                .Alias("how are you?")
                .Description("Replies positive only if bot owner is online.")
                .Do(async e =>
                {
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + " I am great as long as you are here.").ConfigureAwait(false);
                        return;
                    }
                    var kw = e.Server.GetUser(NadekoBot.Creds.OwnerIds[0]);
                    if (kw != null && kw.Status == UserStatus.Online)
                    {
                        await e.Channel.SendMessage(e.User.Mention + " I am great as long as " + kw.Mention + " is with me.").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + " I am sad. My Master is not with me.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("insult")
                .Parameter("mention", ParameterType.Required)
                .Description("Insults @X person.\n**Usage**: @NadekoBot insult @X.")
                .Do(async e =>
                {
                    var u = e.Channel.FindUsers(e.GetArg("mention")).FirstOrDefault();
                    if (u == null)
                    {
                        await e.Channel.SendMessage("Invalid user specified.").ConfigureAwait(false);
                        return;
                    }

                    if (NadekoBot.IsOwner(u.Id))
                    {
                        await e.Channel.SendMessage("I would never insult my master <3").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(u.Mention + NadekoBot.Locale.Insults[rng.Next(0, NadekoBot.Locale.Insults.Length)]).ConfigureAwait(false);
                });

                cgb.CreateCommand("praise")
                .Description("Praises @X person.\n**Usage**: @NadekoBot praise @X.")
                .Parameter("mention", ParameterType.Required)
                .Do(async e =>
                {
                    var u = e.Channel.FindUsers(e.GetArg("mention")).FirstOrDefault();

                    if (u == null)
                    {
                        await e.Channel.SendMessage("Invalid user specified.").ConfigureAwait(false);
                        return;
                    }

                    if (NadekoBot.IsOwner(u.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + " I don't need your permission to praise my beloved Master <3").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(u.Mention + NadekoBot.Locale.Praises[rng.Next(0, NadekoBot.Locale.Praises.Length)]).ConfigureAwait(false);
                });

                cgb.CreateCommand("pat")
                .Description("Pat someone ^_^")
                .Parameter("user", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var userStr = e.GetArg("user");
                    if (string.IsNullOrWhiteSpace(userStr) || !e.Message.MentionedUsers.Any())
                    {
                        return;
                    }
                    var user = e.Server.FindUsers(userStr).FirstOrDefault();
                    if (user == null)
                    {
                        return;
                    }
                    try
                    {
                        await e.Channel.SendMessage(
                            $"{user.Mention} " +
                            $"{NadekoBot.Config.PatResponses[rng.Next(0, NadekoBot.Config.PatResponses.Length)]}")
                        .ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Error while handling PatResponses check your data/config.json").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("cry")
                .Description("Tell Nadeko to cry. You are a heartless monster if you use this command.")
                .Do(async e =>
                {
                    try
                    {
                        await
                        e.Channel.SendMessage(
                            $"(вА¢ћ•ћБ _вА¢аЂЕпљ°)\n{NadekoBot.Config.CryResponses[rng.Next(0, NadekoBot.Config.CryResponses.Length)]}")
                        .ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Error while handling CryResponses check your data/config.json").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("disguise")
                .Description("Tell Nadeko to disguise herself.")
                .Do(async e =>
                {
                    try
                    {
                        await
                        e.Channel.SendMessage(
                            $"{NadekoBot.Config.DisguiseResponses[rng.Next(0, NadekoBot.Config.DisguiseResponses.Length)]}")
                        .ConfigureAwait(false);
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Error while handling DisguiseResponses check your data/config.json")
                        .ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("are you real")
                .Description("Useless.")
                .Do(async e =>
                {
                    await e.Channel.SendMessage(e.User.Mention + " I will be soon.").ConfigureAwait(false);
                });

                cgb.CreateCommand("are you there")
                .Description("Checks if Nadeko is operational.")
                .Alias("!", "?")
                .Do(SayYes());

                cgb.CreateCommand("draw")
                .Description("Nadeko instructs you to type $draw. Gambling functions start with $")
                .Do(async e =>
                {
                    await e.Channel.SendMessage("Sorry, I don't gamble, type $draw for that function.").ConfigureAwait(false);
                });
                cgb.CreateCommand("fire")
                .Description("Shows a unicode fire message. Optional parameter [x] tells her how many times to repeat the fire.\n**Usage**: @NadekoBot fire [x]")
                .Parameter("times", ParameterType.Optional)
                .Do(async e =>
                {
                    var count = 1;
                    int.TryParse(e.Args[0], out count);
                    if (count == 0)
                    {
                        count = 1;
                    }
                    if (count < 1 || count > 12)
                    {
                        await e.Channel.SendMessage("Number must be between 0 and 12").ConfigureAwait(false);
                        return;
                    }

                    var str = "";
                    for (var i = 0; i < count; i++)
                    {
                        str += firestr;
                    }
                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand("rip")
                .Description("Shows a grave image of someone with a start year\n**Usage**: @NadekoBot rip @Someone 2000")
                .Parameter("user", ParameterType.Required)
                .Parameter("year", ParameterType.Optional)
                .Do(async e =>
                {
                    if (string.IsNullOrWhiteSpace(e.GetArg("user")))
                    {
                        return;
                    }
                    var usr  = e.Channel.FindUsers(e.GetArg("user")).FirstOrDefault();
                    var text = "";
                    text     = usr?.Name ?? e.GetArg("user");
                    await e.Channel.SendFile("ripzor_m8.png",
                                             RipName(text, string.IsNullOrWhiteSpace(e.GetArg("year"))
                                ? null
                                : e.GetArg("year")))
                    .ConfigureAwait(false);
                });
                if (!NadekoBot.Config.DontJoinServers)
                {
                    cgb.CreateCommand("j")
                    .Description("Joins a server using a code.")
                    .Parameter("id", ParameterType.Required)
                    .Do(async e =>
                    {
                        var invite = await client.GetInvite(e.Args[0]).ConfigureAwait(false);
                        if (invite != null)
                        {
                            try
                            {
                                await invite.Accept().ConfigureAwait(false);
                            }
                            catch
                            {
                                await e.Channel.SendMessage("Failed to accept invite.").ConfigureAwait(false);
                            }
                            await e.Channel.SendMessage("I got in!").ConfigureAwait(false);
                            return;
                        }
                        await e.Channel.SendMessage("Invalid code.").ConfigureAwait(false);
                    });
                }

                cgb.CreateCommand("slm")
                .Description("Shows the message where you were last mentioned in this channel (checks last 10k messages)")
                .Do(async e =>
                {
                    Message msg = null;
                    var msgs    = (await e.Channel.DownloadMessages(100).ConfigureAwait(false))
                                  .Where(m => m.MentionedUsers.Contains(e.User))
                                  .OrderByDescending(m => m.Timestamp);
                    if (msgs.Any())
                    {
                        msg = msgs.First();
                    }
                    else
                    {
                        var attempt         = 0;
                        Message lastMessage = null;
                        while (msg == null && attempt++ < 5)
                        {
                            var msgsarr = await e.Channel.DownloadMessages(100, lastMessage?.Id).ConfigureAwait(false);
                            msg         = msgsarr
                                          .Where(m => m.MentionedUsers.Contains(e.User))
                                          .OrderByDescending(m => m.Timestamp)
                                          .FirstOrDefault();
                            lastMessage = msgsarr.OrderBy(m => m.Timestamp).First();
                        }
                    }
                    if (msg != null)
                    {
                        await e.Channel.SendMessage($"Last message mentioning you was at {msg.Timestamp}\n**Message from {msg.User.Name}:** {msg.RawText}")
                        .ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("I can't find a message mentioning you.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("bb")
                .Description("Says bye to someone.\n**Usage**: @NadekoBot bb @X")
                .Parameter("ppl", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var str = "Bye";
                    foreach (var u in e.Message.MentionedUsers)
                    {
                        if (u.Id != NadekoBot.Client.CurrentUser.Id)
                        {
                            str += " " + u.Mention;
                        }
                    }
                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand("call")
                .Description("Useless. Writes calling @X to chat.\n**Usage**: @NadekoBot call @X ")
                .Parameter("who", ParameterType.Required)
                .Do(async e =>
                {
                    await e.Channel.SendMessage("Calling " + e.Args[0] + "...").ConfigureAwait(false);
                });
                cgb.CreateCommand("hide")
                .Description("Hides Nadeko in plain sight!11!!")
                .Do(async e =>
                {
                    using (var ms = Resources.hidden.ToStream(ImageFormat.Png))
                    {
                        await client.CurrentUser.Edit(NadekoBot.Creds.Password, avatar: ms).ConfigureAwait(false);
                    }
                    await e.Channel.SendMessage("*hides*").ConfigureAwait(false);
                });

                cgb.CreateCommand("unhide")
                .Description("Unhides Nadeko in plain sight!1!!1")
                .Do(async e =>
                {
                    using (var fs = new FileStream("data/avatar.png", FileMode.Open))
                    {
                        await client.CurrentUser.Edit(NadekoBot.Creds.Password, avatar: fs).ConfigureAwait(false);
                    }
                    await e.Channel.SendMessage("*unhides*").ConfigureAwait(false);
                });

                cgb.CreateCommand("dump")
                .Description("Dumps all of the invites it can to dump.txt.** Owner Only.**")
                .Do(async e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    var i       = 0;
                    var j       = 0;
                    var invites = "";
                    foreach (var s in client.Servers)
                    {
                        try
                        {
                            var invite = await s.CreateInvite(0).ConfigureAwait(false);
                            invites   += invite.Url + "\n";
                            i++;
                        }
                        catch
                        {
                            j++;
                            continue;
                        }
                    }
                    File.WriteAllText("dump.txt", invites);
                    await e.Channel.SendMessage($"Got invites for {i} servers and failed to get invites for {j} servers")
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand("ab")
                .Description("Try to get 'abalabahaha'")
                .Do(async e =>
                {
                    string[] strings = { "ba", "la", "ha" };
                    var construct    = "@a";
                    var cnt          = rng.Next(4, 7);
                    while (cnt-- > 0)
                    {
                        construct += strings[rng.Next(0, strings.Length)];
                    }
                    await e.Channel.SendMessage(construct).ConfigureAwait(false);
                });

                cgb.CreateCommand("av").Alias("avatar")
                .Parameter("mention", ParameterType.Required)
                .Description("Shows a mentioned person's avatar.\n**Usage**: ~av @X")
                .Do(async e =>
                {
                    var usr = e.Channel.FindUsers(e.GetArg("mention")).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("Invalid user specified.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(await usr.AvatarUrl.ShortenUrl()).ConfigureAwait(false);
                });
            });
        }
Example #9
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 + "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);
                });
            });
        }
Example #10
0
        public override void Install(ModuleManager manager)
        {
            var client = manager.Client;

            var serializer = new ManateeSerializer();

            TrelloConfiguration.Serializer         = serializer;
            TrelloConfiguration.Deserializer       = serializer;
            TrelloConfiguration.JsonFactory        = new ManateeFactory();
            TrelloConfiguration.RestClientProvider = new Manatee.Trello.WebApi.WebApiClientProvider();
            TrelloAuthorization.Default.AppKey     = NadekoBot.Creds.TrelloAppKey;
            //TrelloAuthorization.Default.UserToken = "[your user token]";

            Discord.Channel bound = null;
            Board           board = null;

            List <string> last5ActionIDs = null;

            t.Elapsed += async(s, e) => {
                try {
                    if (board == null || bound == null)
                    {
                        return; //do nothing if there is no bound board
                    }
                    board.Refresh();
                    var cur5Actions      = board.Actions.Take(board.Actions.Count() < 5 ? board.Actions.Count() : 5);
                    var cur5ActionsArray = cur5Actions as Action[] ?? cur5Actions.ToArray();

                    if (last5ActionIDs == null)
                    {
                        last5ActionIDs = cur5ActionsArray.Select(a => a.Id).ToList();
                        return;
                    }

                    foreach (var a in cur5ActionsArray.Where(ca => !last5ActionIDs.Contains(ca.Id)))
                    {
                        await bound.Send("**--TRELLO NOTIFICATION--**\n" + a.ToString());
                    }
                    last5ActionIDs.Clear();
                    last5ActionIDs.AddRange(cur5ActionsArray.Select(a => a.Id));
                } catch (Exception ex) {
                    Console.WriteLine("Timer failed " + ex.ToString());
                }
            };

            manager.CreateCommands("trello ", cgb => {
                cgb.AddCheck(Classes.Permissions.PermissionChecker.Instance);

                cgb.CreateCommand("join")
                .Alias("j")
                .Description("Joins a server")
                .Parameter("code", Discord.Commands.ParameterType.Required)
                .Do(async e => {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    try {
                        await(await client.GetInvite(e.GetArg("code"))).Accept();
                    } catch (Exception ex) {
                        Console.WriteLine(ex.ToString());
                    }
                });

                cgb.CreateCommand("bind")
                .Description("Bind a trello bot to a single channel. " +
                             "You will receive notifications from your board when something is added or edited." +
                             "\n**Usage**: bind [board_id]")
                .Parameter("board_id", Discord.Commands.ParameterType.Required)
                .Do(async e => {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    if (bound != null)
                    {
                        return;
                    }
                    try {
                        bound = e.Channel;
                        board = new Board(e.GetArg("board_id").Trim());
                        board.Refresh();
                        await e.Channel.SendMessage("Successfully bound to this channel and board " + board.Name);
                        t.Start();
                    } catch (Exception ex) {
                        Console.WriteLine("Failed to join the board. " + ex.ToString());
                    }
                });

                cgb.CreateCommand("unbind")
                .Description("Unbinds a bot from the channel and board.")
                .Do(async e => {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    if (bound == null || bound != e.Channel)
                    {
                        return;
                    }
                    t.Stop();
                    bound = null;
                    board = null;
                    await e.Channel.SendMessage("Successfully unbound trello from this channel.");
                });

                cgb.CreateCommand("lists")
                .Alias("list")
                .Description("Lists all lists yo ;)")
                .Do(async e => {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    if (bound == null || board == null || bound != e.Channel)
                    {
                        return;
                    }
                    await e.Channel.SendMessage("Lists for a board '" + board.Name + "'\n" + string.Join("\n", board.Lists.Select(l => "**• " + l.ToString() + "**")));
                });

                cgb.CreateCommand("cards")
                .Description("Lists all cards from the supplied list. You can supply either a name or an index.")
                .Parameter("list_name", Discord.Commands.ParameterType.Unparsed)
                .Do(async e => {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    if (bound == null || board == null || bound != e.Channel || e.GetArg("list_name") == null)
                    {
                        return;
                    }

                    int num;
                    var success = int.TryParse(e.GetArg("list_name"), out num);
                    List list   = null;
                    if (success && num <= board.Lists.Count() && num > 0)
                    {
                        list = board.Lists[num - 1];
                    }
                    else
                    {
                        list = board.Lists.FirstOrDefault(l => l.Name == e.GetArg("list_name"));
                    }


                    if (list != null)
                    {
                        await e.Channel.SendMessage("There are " + list.Cards.Count() + " cards in a **" + list.Name + "** list\n" + string.Join("\n", list.Cards.Select(c => "**• " + c.ToString() + "**")));
                    }
                    else
                    {
                        await e.Channel.SendMessage("No such list.");
                    }
                });
            });
        }
Example #11
0
        public override void Install(ModuleManager manager)
        {
            var rng = new Random();

            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                cgb.CreateCommand("..")
                .Description("Adds a new quote with the specified name (single word) and message (no limit).\n**Usage**: .. abc My message")
                .Parameter("keyword", ParameterType.Required)
                .Parameter("text", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var text = e.GetArg("text");
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return;
                    }
                    await Task.Run(() =>
                                   Classes.DbHandler.Instance.InsertData(new DataModels.UserQuote()
                    {
                        DateAdded = DateTime.Now,
                        Keyword   = e.GetArg("keyword").ToLowerInvariant(),
                        Text      = text,
                        UserName  = e.User.Name,
                    })).ConfigureAwait(false);

                    await e.Channel.SendMessage("`New quote added.`").ConfigureAwait(false);
                });

                cgb.CreateCommand("...")
                .Description("Shows a random quote with a specified name.\n**Usage**: .. abc")
                .Parameter("keyword", ParameterType.Required)
                .Do(async e =>
                {
                    var keyword = e.GetArg("keyword")?.ToLowerInvariant();
                    if (string.IsNullOrWhiteSpace(keyword))
                    {
                        return;
                    }

                    var quote =
                        Classes.DbHandler.Instance.GetRandom <DataModels.UserQuote>(
                            uqm => uqm.Keyword == keyword);

                    if (quote != null)
                    {
                        await e.Channel.SendMessage($"📣 {quote.Text}").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("💢`No quote found.`").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("..qdel")
                .Alias("..quotedelete")
                .Description("Deletes all quotes with the specified keyword. You have to either be bot owner or the creator of the quote to delete it.\n**Usage**: `..qdel abc`")
                .Parameter("quote", ParameterType.Required)
                .Do(async e =>
                {
                    var text = e.GetArg("quote")?.Trim();
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return;
                    }
                    await Task.Run(() =>
                    {
                        if (NadekoBot.IsOwner(e.User.Id))
                        {
                            Classes.DbHandler.Instance.DeleteWhere <UserQuote>(uq => uq.Keyword == text);
                        }
                        else
                        {
                            Classes.DbHandler.Instance.DeleteWhere <UserQuote>(uq => uq.Keyword == text && uq.UserName == e.User.Name);
                        }
                    }).ConfigureAwait(false);

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

            manager.CreateCommands(NadekoBot.BotMention, cgb =>
            {
                var client = manager.Client;

                cgb.AddCheck(PermissionChecker.Instance);

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

                cgb.CreateCommand("uptime")
                .Description("Shows how long Nadeko has been running for.")
                .Do(async e =>
                {
                    var time = (DateTime.Now - Process.GetCurrentProcess().StartTime);
                    var str  = string.Format("I have been running for {0} days, {1} hours, and {2} minutes.", time.Days, time.Hours, time.Minutes);
                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand("die")
                .Description("Works only for the owner. Shuts the bot down.")
                .Do(async e =>
                {
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Yes, my love.").ConfigureAwait(false);
                        await Task.Delay(5000).ConfigureAwait(false);
                        Environment.Exit(0);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", No.").ConfigureAwait(false);
                    }
                });

                var randServerSw = new Stopwatch();
                randServerSw.Start();

                cgb.CreateCommand("do you love me")
                .Description("Replies with positive answer only to the bot owner.")
                .Do(async e =>
                {
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Of course I do, my Master.").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Don't be silly.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("how are you")
                .Alias("how are you?")
                .Description("Replies positive only if bot owner is online.")
                .Do(async e =>
                {
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + " I am great as long as you are here.").ConfigureAwait(false);
                        return;
                    }
                    var kw = e.Server.GetUser(NadekoBot.Creds.OwnerIds[0]);
                    if (kw != null && kw.Status == UserStatus.Online)
                    {
                        await e.Channel.SendMessage(e.User.Mention + " I am great as long as " + kw.Mention + " is with me.").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + " I am sad. My Master is not with me.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("fire")
                .Description("Shows a unicode fire message. Optional parameter [x] tells her how many times to repeat the fire.\n**Usage**: @NadekoBot fire [x]")
                .Parameter("times", ParameterType.Optional)
                .Do(async e =>
                {
                    var count = 1;
                    int.TryParse(e.Args[0], out count);
                    if (count == 0)
                    {
                        count = 1;
                    }
                    if (count < 1 || count > 12)
                    {
                        await e.Channel.SendMessage("Number must be between 0 and 12").ConfigureAwait(false);
                        return;
                    }

                    var str = "";
                    for (var i = 0; i < count; i++)
                    {
                        str += firestr;
                    }
                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand("slm")
                .Description("Shows the message where you were last mentioned in this channel (checks last 10k messages)")
                .Do(async e =>
                {
                    Message msg = null;
                    var msgs    = (await e.Channel.DownloadMessages(100).ConfigureAwait(false))
                                  .Where(m => m.MentionedUsers.Contains(e.User))
                                  .OrderByDescending(m => m.Timestamp);
                    if (msgs.Any())
                    {
                        msg = msgs.First();
                    }
                    else
                    {
                        var attempt         = 0;
                        Message lastMessage = null;
                        while (msg == null && attempt++ < 5)
                        {
                            var msgsarr = await e.Channel.DownloadMessages(100, lastMessage?.Id).ConfigureAwait(false);
                            msg         = msgsarr
                                          .Where(m => m.MentionedUsers.Contains(e.User))
                                          .OrderByDescending(m => m.Timestamp)
                                          .FirstOrDefault();
                            lastMessage = msgsarr.OrderBy(m => m.Timestamp).First();
                        }
                    }
                    if (msg != null)
                    {
                        await e.Channel.SendMessage($"Last message mentioning you was at {msg.Timestamp}\n**Message from {msg.User.Name}:** {msg.RawText}")
                        .ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("I can't find a message mentioning you.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("dump")
                .Description("Dumps all of the invites it can to dump.txt.** Owner Only.**")
                .Do(async e =>
                {
                    if (!NadekoBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    var i       = 0;
                    var j       = 0;
                    var invites = "";
                    foreach (var s in client.Servers)
                    {
                        try
                        {
                            var invite = await s.CreateInvite(0).ConfigureAwait(false);
                            invites   += invite.Url + "\n";
                            i++;
                        }
                        catch
                        {
                            j++;
                            continue;
                        }
                    }
                    File.WriteAllText("dump.txt", invites);
                    await e.Channel.SendMessage($"Got invites for {i} servers and failed to get invites for {j} servers")
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand("ab")
                .Description("Try to get 'abalabahaha'")
                .Do(async e =>
                {
                    string[] strings = { "ba", "la", "ha" };
                    var construct    = "@a";
                    var cnt          = rng.Next(4, 7);
                    while (cnt-- > 0)
                    {
                        construct += strings[rng.Next(0, strings.Length)];
                    }
                    await e.Channel.SendMessage(construct).ConfigureAwait(false);
                });

                cgb.CreateCommand("av")
                .Alias("avatar")
                .Parameter("mention", ParameterType.Required)
                .Description("Shows a mentioned person's avatar.\n**Usage**: ~av @X")
                .Do(async e =>
                {
                    var usr = e.Channel.FindUsers(e.GetArg("mention")).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("Invalid user specified.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(await usr.AvatarUrl.ShortenUrl()).ConfigureAwait(false);
                });
            });
        }
Example #12
0
        public override void Install(ModuleManager manager)
        {
            var client = NadekoBot.Client;

            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

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

                cgb.CreateCommand(Prefix + "next")
                .Alias(Prefix + "n")
                .Alias(Prefix + "skip")
                .Description($"Goes to the next song in the queue. You have to be in the same voice channel as the bot. | `{Prefix}n`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (musicPlayer.PlaybackVoiceChannel == e.User.VoiceChannel)
                    {
                        musicPlayer.Next();
                    }
                });

                cgb.CreateCommand(Prefix + "stop")
                .Alias(Prefix + "s")
                .Description($"Stops the music and clears the playlist. Stays in the channel. | `{Prefix}s`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel == musicPlayer.PlaybackVoiceChannel)
                    {
                        musicPlayer.Autoplay = false;
                        musicPlayer.Stop();
                    }
                });

                cgb.CreateCommand(Prefix + "destroy")
                .Alias(Prefix + "d")
                .Description("Completely stops the music and unbinds the bot from the channel. " +
                             $"(may cause weird behaviour) | `{Prefix}d`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryRemove(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel == musicPlayer.PlaybackVoiceChannel)
                    {
                        musicPlayer.Destroy();
                    }
                });

                cgb.CreateCommand(Prefix + "pause")
                .Alias(Prefix + "p")
                .Description($"Pauses or Unpauses the song. | `{Prefix}p`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    musicPlayer.TogglePause();
                    if (musicPlayer.Paused)
                    {
                        await e.Channel.SendMessage("🎵`Music Player paused.`").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("🎵`Music Player unpaused.`").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "queue")
                .Alias(Prefix + "q")
                .Alias(Prefix + "yq")
                .Description("Queue a song using keywords or a link. Bot will join your voice channel." +
                             $"**You must be in a voice channel**. | `{Prefix}q Dream Of Venice`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    await QueueSong(e.User, e.Channel, e.User.VoiceChannel, e.GetArg("query")).ConfigureAwait(false);
                    if (e.Server.CurrentUser.GetPermissions(e.Channel).ManageMessages)
                    {
                        await Task.Delay(10000).ConfigureAwait(false);
                        await e.Message.Delete().ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "soundcloudqueue")
                .Alias(Prefix + "sq")
                .Description("Queue a soundcloud song using keywords. Bot will join your voice channel." +
                             $"**You must be in a voice channel**. | `{Prefix}sq Dream Of Venice`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    await QueueSong(e.User, e.Channel, e.User.VoiceChannel, e.GetArg("query"), musicType: MusicType.Soundcloud).ConfigureAwait(false);
                    if (e.Server.CurrentUser.GetPermissions(e.Channel).ManageMessages)
                    {
                        await Task.Delay(10000).ConfigureAwait(false);
                        await e.Message.Delete().ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "listqueue")
                .Alias(Prefix + "lq")
                .Description($"Lists 15 currently queued songs per page. Default page is 1. | `{Prefix}lq` or `{Prefix}lq 2`")
                .Parameter("page", ParameterType.Optional)
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        await e.Channel.SendMessage("🎵 No active music player.").ConfigureAwait(false);
                        return;
                    }

                    int page;
                    if (!int.TryParse(e.GetArg("page"), out page) || page <= 0)
                    {
                        page = 1;
                    }

                    var currentSong = musicPlayer.CurrentSong;
                    if (currentSong == null)
                    {
                        return;
                    }
                    var toSend = $"🎵`Now Playing` {currentSong.PrettyName} " + $"{currentSong.PrettyCurrentTime()}\n";
                    if (musicPlayer.RepeatSong)
                    {
                        toSend += "🔂";
                    }
                    else if (musicPlayer.RepeatPlaylist)
                    {
                        toSend += "🔁";
                    }
                    toSend += $" **{musicPlayer.Playlist.Count}** `tracks currently queued. Showing page {page}` ";
                    if (musicPlayer.MaxQueueSize != 0 && musicPlayer.Playlist.Count >= musicPlayer.MaxQueueSize)
                    {
                        toSend += "**Song queue is full!**\n";
                    }
                    else
                    {
                        toSend += "\n";
                    }
                    const int itemsPerPage = 15;
                    int startAt            = itemsPerPage * (page - 1);
                    var number             = 1 + startAt;
                    await e.Channel.SendMessage(toSend + string.Join("\n", musicPlayer.Playlist.Skip(startAt).Take(15).Select(v => $"`{number++}.` {v.PrettyName}"))).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "nowplaying")
                .Alias(Prefix + "np")
                .Description($"Shows the song currently playing. | `{Prefix}np`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    var currentSong = musicPlayer.CurrentSong;
                    if (currentSong == null)
                    {
                        return;
                    }
                    await e.Channel.SendMessage($"🎵`Now Playing` {currentSong.PrettyName} " +
                                                $"{currentSong.PrettyCurrentTime()}").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "volume")
                .Alias(Prefix + "vol")
                .Description($"Sets the music volume 0-100% | `{Prefix}vol 50`")
                .Parameter("val", ParameterType.Required)
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    var arg = e.GetArg("val");
                    int volume;
                    if (!int.TryParse(arg, out volume))
                    {
                        await e.Channel.SendMessage("Volume number invalid.").ConfigureAwait(false);
                        return;
                    }
                    volume = musicPlayer.SetVolume(volume);
                    await e.Channel.SendMessage($"🎵 `Volume set to {volume}%`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "defvol")
                .Alias(Prefix + "dv")
                .Description("Sets the default music volume when music playback is started (0-100)." +
                             $" Persists through restarts. | `{Prefix}dv 80`")
                .Parameter("val", ParameterType.Required)
                .Do(async e =>
                {
                    var arg = e.GetArg("val");
                    float volume;
                    if (!float.TryParse(arg, out volume) || volume < 0 || volume > 100)
                    {
                        await e.Channel.SendMessage("Volume number invalid.").ConfigureAwait(false);
                        return;
                    }
                    var conf = SpecificConfigurations.Default.Of(e.Server.Id);
                    conf.DefaultMusicVolume = volume / 100;
                    await e.Channel.SendMessage($"🎵 `Default volume set to {volume}%`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "mute")
                .Alias(Prefix + "min")
                .Description($"Sets the music volume to 0% | `{Prefix}min`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    musicPlayer.SetVolume(0);
                });

                cgb.CreateCommand(Prefix + "max")
                .Description($"Sets the music volume to 100%. | `{Prefix}max`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    musicPlayer.SetVolume(100);
                });

                cgb.CreateCommand(Prefix + "half")
                .Description($"Sets the music volume to 50%. | `{Prefix}half`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    musicPlayer.SetVolume(50);
                });

                cgb.CreateCommand(Prefix + "shuffle")
                .Alias(Prefix + "sh")
                .Description($"Shuffles the current playlist. | `{Prefix}sh`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    if (musicPlayer.Playlist.Count < 2)
                    {
                        await e.Channel.SendMessage("💢 Not enough songs in order to perform the shuffle.").ConfigureAwait(false);
                        return;
                    }

                    musicPlayer.Shuffle();
                    await e.Channel.SendMessage("🎵 `Songs shuffled.`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "playlist")
                .Alias(Prefix + "pl")
                .Description($"Queues up to 500 songs from a youtube playlist specified by a link, or keywords. | `{Prefix}pl playlist link or name`")
                .Parameter("playlist", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("playlist");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel?.Server != e.Server)
                    {
                        await e.Channel.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining it.").ConfigureAwait(false);
                        return;
                    }
                    var plId = await SearchHelper.GetPlaylistIdByKeyword(arg).ConfigureAwait(false);
                    if (plId == null)
                    {
                        await e.Channel.SendMessage("No search results for that query.");
                        return;
                    }
                    var ids = await SearchHelper.GetVideoIDs(plId, 500).ConfigureAwait(false);
                    if (ids == null || ids.Count == 0)
                    {
                        await e.Channel.SendMessage($"🎵 `Failed to find any songs.`").ConfigureAwait(false);
                        return;
                    }
                    var idArray = ids as string[] ?? ids.ToArray();
                    var count   = idArray.Length;
                    var msg     =
                        await e.Channel.SendMessage($"🎵 `Attempting to queue {count} songs".SnPl(count) + "...`").ConfigureAwait(false);
                    foreach (var id in idArray)
                    {
                        try
                        {
                            await QueueSong(e.User, e.Channel, e.User.VoiceChannel, id, true).ConfigureAwait(false);
                        }
                        catch (PlaylistFullException)
                        { break; }
                        catch { }
                    }
                    await msg.Edit("🎵 `Playlist queue complete.`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "soundcloudpl")
                .Alias(Prefix + "scpl")
                .Description($"Queue a soundcloud playlist using a link. | `{Prefix}scpl soundcloudseturl`")
                .Parameter("pl", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var pl = e.GetArg("pl")?.Trim();

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

                    var scvids = JObject.Parse(await SearchHelper.GetResponseStringAsync($"http://api.soundcloud.com/resolve?url={pl}&client_id={NadekoBot.Creds.SoundCloudClientID}").ConfigureAwait(false))["tracks"].ToObject <SoundCloudVideo[]>();
                    await QueueSong(e.User, e.Channel, e.User.VoiceChannel, scvids[0].TrackLink).ConfigureAwait(false);

                    MusicPlayer mp;
                    if (!MusicPlayers.TryGetValue(e.Server, out mp))
                    {
                        return;
                    }

                    foreach (var svideo in scvids.Skip(1))
                    {
                        try
                        {
                            mp.AddSong(new Song(new Classes.SongInfo
                            {
                                Title        = svideo.FullName,
                                Provider     = "SoundCloud",
                                Uri          = svideo.StreamLink,
                                ProviderType = MusicType.Normal,
                                Query        = svideo.TrackLink,
                            }), e.User.Name);
                        }
                        catch (PlaylistFullException) { break; }
                    }
                });

                cgb.CreateCommand(Prefix + "localplaylst")
                .Alias(Prefix + "lopl")
                .Description($"Queues all songs from a directory. **Bot Owner Only!** | `{Prefix}lopl C:/music/classical`")
                .Parameter("directory", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    var arg = e.GetArg("directory");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        return;
                    }
                    try
                    {
                        var fileEnum = new DirectoryInfo(arg).GetFiles()
                                       .Where(x => !x.Attributes.HasFlag(FileAttributes.Hidden | FileAttributes.System));
                        foreach (var file in fileEnum)
                        {
                            try
                            {
                                await QueueSong(e.User, e.Channel, e.User.VoiceChannel, file.FullName, true, MusicType.Local).ConfigureAwait(false);
                            }
                            catch (PlaylistFullException)
                            {
                                break;
                            }
                            catch { }
                        }
                        await e.Channel.SendMessage("🎵 `Directory queue complete.`").ConfigureAwait(false);
                    }
                    catch { }
                });

                cgb.CreateCommand(Prefix + "radio").Alias(Prefix + "ra")
                .Description($"Queues a radio stream from a link. It can be a direct mp3 radio stream, .m3u, .pls .asx or .xspf (Usage Video: <https://streamable.com/al54>) | `{Prefix}ra radio link here`")
                .Parameter("radio_link", ParameterType.Required)
                .Do(async e =>
                {
                    if (e.User.VoiceChannel?.Server != e.Server)
                    {
                        await e.Channel.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining it.").ConfigureAwait(false);
                        return;
                    }
                    await QueueSong(e.User, e.Channel, e.User.VoiceChannel, e.GetArg("radio_link"), musicType: MusicType.Radio).ConfigureAwait(false);
                    if (e.Server.CurrentUser.GetPermissions(e.Channel).ManageMessages)
                    {
                        await Task.Delay(10000).ConfigureAwait(false);
                        await e.Message.Delete().ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "local")
                .Alias(Prefix + "lo")
                .Description($"Queues a local file by specifying a full path. **Bot Owner Only!** | `{Prefix}lo C:/music/mysong.mp3`")
                .Parameter("path", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    var arg = e.GetArg("path");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        return;
                    }
                    await QueueSong(e.User, e.Channel, e.User.VoiceChannel, e.GetArg("path"), musicType: MusicType.Local).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "move")
                .Alias(Prefix + "mv")
                .Description($"Moves the bot to your voice channel. (works only if music is already playing) | `{Prefix}mv`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    var voiceChannel = e.User.VoiceChannel;
                    if (voiceChannel == null || voiceChannel.Server != e.Server || !MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    musicPlayer.MoveToVoiceChannel(voiceChannel);
                });

                cgb.CreateCommand(Prefix + "remove")
                .Alias(Prefix + "rm")
                .Description($"Remove a song by its # in the queue, or 'all' to remove whole queue. | `{Prefix}rm 5`")
                .Parameter("num", ParameterType.Required)
                .Do(async e =>
                {
                    var arg = e.GetArg("num");
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    if (arg?.ToLower() == "all")
                    {
                        musicPlayer.ClearQueue();
                        await e.Channel.SendMessage($"🎵`Queue cleared!`").ConfigureAwait(false);
                        return;
                    }
                    int num;
                    if (!int.TryParse(arg, out num))
                    {
                        return;
                    }
                    if (num <= 0 || num > musicPlayer.Playlist.Count)
                    {
                        return;
                    }
                    var song = (musicPlayer.Playlist as List <Song>)?[num - 1];
                    musicPlayer.RemoveSongAt(num - 1);
                    await e.Channel.SendMessage($"🎵**Track {song.PrettyName} at position `#{num}` has been removed.**").ConfigureAwait(false);
                });

                //var msRegex = new Regex(@"(?<n1>\d+)>(?<n2>\d+)", RegexOptions.Compiled);
                cgb.CreateCommand(Prefix + "movesong")
                .Alias(Prefix + "ms")
                .Description($"Moves a song from one position to another. | `{Prefix} ms 5>3`")
                .Parameter("fromto")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    var fromto    = e.GetArg("fromto").Trim();
                    var fromtoArr = fromto.Split('>');

                    int n1;
                    int n2;

                    var playlist = musicPlayer.Playlist as List <Song> ?? musicPlayer.Playlist.ToList();

                    if (fromtoArr.Length != 2 || !int.TryParse(fromtoArr[0], out n1) ||
                        !int.TryParse(fromtoArr[1], out n2) || n1 <1 || n2 <1 || n1 == n2 ||
                                                                            n1> playlist.Count || n2> playlist.Count)
                    {
                        await e.Channel.SendMessage("`Invalid input.`").ConfigureAwait(false);
                        return;
                    }

                    var s = playlist[n1 - 1];
                    playlist.Insert(n2 - 1, s);
                    var nn1 = n2 < n1 ? n1 : n1 - 1;
                    playlist.RemoveAt(nn1);

                    await e.Channel.SendMessage($"🎵`Moved` {s.PrettyName} `from #{n1} to #{n2}`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "setmaxqueue")
                .Alias(Prefix + "smq")
                .Description($"Sets a maximum queue size. Supply 0 or no argument to have no limit.  | `{Prefix}smq 50` or `{Prefix}smq`")
                .Parameter("size", ParameterType.Unparsed)
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }

                    var sizeStr = e.GetArg("size")?.Trim();
                    uint size   = 0;
                    if (string.IsNullOrWhiteSpace(sizeStr) || !uint.TryParse(sizeStr, out size))
                    {
                        size = 0;
                    }

                    musicPlayer.MaxQueueSize = size;
                    await e.Channel.SendMessage($"🎵 `Max queue set to {(size == 0 ? ("unlimited") : size + " tracks")}`");
                });

                cgb.CreateCommand(Prefix + "cleanup")
                .Description($"Cleans up hanging voice connections. **Bot Owner Only!** | `{Prefix}cleanup`")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(e =>
                {
                    foreach (var kvp in MusicPlayers)
                    {
                        var songs       = kvp.Value.Playlist;
                        var currentSong = kvp.Value.CurrentSong;
                        if (songs.Count == 0 && currentSong == null)
                        {
                            MusicPlayer throwaway;
                            MusicPlayers.TryRemove(kvp.Key, out throwaway);
                            throwaway.Destroy();
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "reptcursong")
                .Alias(Prefix + "rcs")
                .Description($"Toggles repeat of current song. | `{Prefix}rcs`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    var currentSong = musicPlayer.CurrentSong;
                    if (currentSong == null)
                    {
                        return;
                    }
                    var currentValue = musicPlayer.ToggleRepeatSong();
                    await e.Channel.SendMessage(currentValue ?
                                                $"🎵🔂`Repeating track:`{currentSong.PrettyName}" :
                                                $"🎵🔂`Current track repeat stopped.`")
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "rpeatplaylst")
                .Alias(Prefix + "rpl")
                .Description($"Toggles repeat of all songs in the queue (every song that finishes is added to the end of the queue). | `{Prefix}rpl`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    var currentValue = musicPlayer.ToggleRepeatPlaylist();
                    await e.Channel.SendMessage($"🎵🔁`Repeat playlist {(currentValue ? "enabled" : "disabled")}`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "save")
                .Description($"Saves a playlist under a certain name. Name must be no longer than 20 characters and mustn't contain dashes. | `{Prefix}save classical1`")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var name = e.GetArg("name")?.Trim();

                    if (string.IsNullOrWhiteSpace(name) ||
                        name.Length > 20 ||
                        name.Contains("-"))
                    {
                        return;
                    }

                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }

                    //to avoid concurrency issues
                    var currentPlaylist = new List <Song>(musicPlayer.Playlist);
                    var curSong         = musicPlayer.CurrentSong;
                    if (curSong != null)
                    {
                        currentPlaylist.Insert(0, curSong);
                    }

                    if (!currentPlaylist.Any())
                    {
                        return;
                    }


                    var songInfos = currentPlaylist.Select(s => new DataModels.SongInfo
                    {
                        Provider     = s.SongInfo.Provider,
                        ProviderType = (int)s.SongInfo.ProviderType,
                        Title        = s.SongInfo.Title,
                        Uri          = s.SongInfo.Uri,
                        Query        = s.SongInfo.Query,
                    }).ToList();

                    var playlist = new MusicPlaylist
                    {
                        CreatorId   = (long)e.User.Id,
                        CreatorName = e.User.Name,
                        Name        = name.ToLowerInvariant(),
                    };
                    DbHandler.Instance.SaveAll(songInfos);
                    DbHandler.Instance.Save(playlist);
                    DbHandler.Instance.Connection.InsertAll(songInfos.Select(s => new PlaylistSongInfo
                    {
                        PlaylistId = playlist.Id.Value,
                        SongInfoId = s.Id.Value
                    }), typeof(PlaylistSongInfo));

                    await e.Channel.SendMessage($"🎵 `Saved playlist as {name}-{playlist.Id}`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "load")
                .Description($"Loads a playlist under a certain name.  | `{Prefix}load classical-1`")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var voiceCh = e.User.VoiceChannel;
                    var textCh  = e.Channel;
                    if (voiceCh == null || voiceCh.Server != textCh.Server)
                    {
                        await textCh.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining.").ConfigureAwait(false);
                        return;
                    }
                    var name = e.GetArg("name")?.Trim().ToLowerInvariant();

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

                    var parts = name.Split('-');
                    if (parts.Length != 2)
                    {
                        return;
                    }
                    var playlistName = parts[0];

                    int playlistNumber;
                    if (!int.TryParse(parts[1], out playlistNumber))
                    {
                        return;
                    }

                    var playlist = DbHandler.Instance.FindOne <MusicPlaylist>(
                        p => p.Id == playlistNumber);

                    if (playlist == null)
                    {
                        await e.Channel.SendMessage("Can't find playlist under that name.").ConfigureAwait(false);
                        return;
                    }

                    var psis = DbHandler.Instance.FindAll <PlaylistSongInfo>(psi =>
                                                                             psi.PlaylistId == playlist.Id);

                    var songInfos = psis.Select(psi => DbHandler.Instance
                                                .FindOne <DataModels.SongInfo>(si => si.Id == psi.SongInfoId));

                    await e.Channel.SendMessage($"`Attempting to load {songInfos.Count()} songs`").ConfigureAwait(false);
                    foreach (var si in songInfos)
                    {
                        try
                        {
                            await QueueSong(e.User, textCh, voiceCh, si.Query, true, (MusicType)si.ProviderType).ConfigureAwait(false);
                        }
                        catch (PlaylistFullException)
                        {
                            break;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine($"Failed QueueSong in load playlist. {ex}");
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "playlists")
                .Alias(Prefix + "pls")
                .Description($"Lists all playlists. Paginated. 20 per page. Default page is 0. |`{Prefix}pls 1`")
                .Parameter("num", ParameterType.Optional)
                .Do(e =>
                {
                    int num = 0;
                    int.TryParse(e.GetArg("num"), out num);
                    if (num < 0)
                    {
                        return;
                    }
                    var result = DbHandler.Instance.GetPlaylistData(num);
                    if (result.Count == 0)
                    {
                        e.Channel.SendMessage($"`No saved playlists found on page {num}`").ConfigureAwait(false);
                    }
                    else
                    {
                        e.Channel.SendMessage($"```js\n--- List of saved playlists ---\n\n" + string.Join("\n", result.Select(r => $"'{r.Name}-{r.Id}' by {r.Creator} ({r.SongCnt} songs)")) + $"\n\n        --- Page {num} ---```").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "deleteplaylist")
                .Alias(Prefix + "delpls")
                .Description($"Deletes a saved playlist. Only if you made it or if you are the bot owner. | `{Prefix}delpls animu-5`")
                .Parameter("pl", ParameterType.Required)
                .Do(async e =>
                {
                    var pl = e.GetArg("pl").Trim().Split('-')[1];
                    if (string.IsNullOrWhiteSpace(pl))
                    {
                        return;
                    }
                    var plnum = int.Parse(pl);
                    if (NadekoBot.IsOwner(e.User.Id))
                    {
                        DbHandler.Instance.Delete <MusicPlaylist>(plnum);
                    }
                    else
                    {
                        DbHandler.Instance.DeleteWhere <MusicPlaylist>(mp => mp.Id == plnum && (long)e.User.Id == mp.CreatorId);
                    }
                    await e.Channel.SendMessage("`Ok.` :ok:").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "goto")
                .Description($"Goes to a specific time in seconds in a song. | `{Prefix}goto 30`")
                .Parameter("time")
                .Do(async e =>
                {
                    var skipToStr = e.GetArg("time")?.Trim();
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    int skipTo;
                    if (!int.TryParse(skipToStr, out skipTo) || skipTo < 0)
                    {
                        return;
                    }

                    var currentSong = musicPlayer.CurrentSong;

                    if (currentSong == null)
                    {
                        return;
                    }

                    //currentSong.PrintStatusMessage = false;
                    var gotoSong    = currentSong.Clone();
                    gotoSong.SkipTo = skipTo;
                    musicPlayer.AddSong(gotoSong, 0);
                    musicPlayer.Next();

                    var minutes = (skipTo / 60).ToString();
                    var seconds = (skipTo % 60).ToString();

                    if (minutes.Length == 1)
                    {
                        minutes = "0" + minutes;
                    }
                    if (seconds.Length == 1)
                    {
                        seconds = "0" + seconds;
                    }

                    await e.Channel.SendMessage($"`Skipped to {minutes}:{seconds}`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "getlink")
                .Alias(Prefix + "gl")
                .Description($"Shows a link to the song in the queue by index, or the currently playing song by default. | `{Prefix}gl`")
                .Parameter("index", ParameterType.Optional)
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    int index;
                    string arg = e.GetArg("index")?.Trim();
                    if (!string.IsNullOrEmpty(arg) && int.TryParse(arg, out index))
                    {
                        var selSong = musicPlayer.Playlist.DefaultIfEmpty(null).ElementAtOrDefault(index - 1);
                        if (selSong == null)
                        {
                            await e.Channel.SendMessage("Could not select song, likely wrong index");
                        }
                        else
                        {
                            await e.Channel.SendMessage($"🎶`Selected song {selSong.SongInfo.Title}:` <{selSong.SongInfo.Query}>").ConfigureAwait(false);
                        }
                    }
                    else
                    {
                        var curSong = musicPlayer.CurrentSong;
                        if (curSong == null)
                        {
                            return;
                        }
                        await e.Channel.SendMessage($"🎶`Current song:` <{curSong.SongInfo.Query}>").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "autoplay")
                .Alias(Prefix + "ap")
                .Description($"Toggles autoplay - When the song is finished, automatically queue a related youtube song. (Works only for youtube songs and when queue is empty) | `{Prefix}ap`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }

                    if (!musicPlayer.ToggleAutoplay())
                    {
                        await e.Channel.SendMessage("🎶`Autoplay disabled.`").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("🎶`Autoplay enabled.`").ConfigureAwait(false);
                    }
                });
            });
        }
Example #13
0
 public static Func <Command, User, Channel, bool> OwnerOnly() =>
 (com, user, ch) => NadekoBot.IsOwner(user.Id);
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "cah")
            .Description($"Starts a game of cards against humanity.\nuser is added to players list; other players must use {Module.Prefix}cahjoin to join the game")
            .Parameter("players", ParameterType.Unparsed)
            .Do(async e =>
            {
                CardsAgainstHumanityGame cah;
                if (!RunningCAHs.TryGetValue(e.Server.Id, out cah))
                {
                    var cahGame = new CardsAgainstHumanityGame(e);
                    if (RunningCAHs.TryAdd(e.Server.Id, cahGame))
                    {
                        await e.Channel.SendMessage("**Cards Against Humanity started**");
                    }
                    else
                    {
                        await cahGame.StopGame();
                    }
                }
                else
                {
                    await e.Channel.SendMessage("CAH game is already running on this server");
                }
            });

            cgb.CreateCommand(Module.Prefix + "cahjoin")
            .Description("Join the active game of CAH")
            .Do(async e =>
            {
                CardsAgainstHumanityGame cah;
                if (!RunningCAHs.TryGetValue(e.Server.Id, out cah))
                {
                    await e.Channel.SendMessage("No active game on this server");
                    return;
                }
                if (!await cah.JoinGame(e.User))
                {
                    await e.Channel.SendMessage("Could not add Player to list.\n" +
                                                "Possible explanations:\n" +
                                                "Player already joined.\n" +
                                                "Czar being chosen, try in a few seconds");
                }
                else
                {
                    await e.Channel.SendMessage($"{e.User.Mention} successfully joined CAH");
                }
            });

            cgb.CreateCommand(Module.Prefix + "cahleave")
            .Description("Leaves the current game. **Bot owner can set target**")
            .Parameter("target", ParameterType.Optional)
            .Do(async e =>
            {
                CardsAgainstHumanityGame cah;
                if (!RunningCAHs.TryGetValue(e.Server.Id, out cah))
                {
                    await e.Channel.SendMessage("No active game on this server");
                    return;
                }
                var usr = e.GetArg("target") ?? "";
                if (NadekoBot.IsOwner(e.User.Id))
                {
                    Discord.User target = e.Server.FindUsers(usr).FirstOrDefault() ?? e.User;
                    var left            = cah.LeaveGame(target);
                    if (!cah.LeaveGame(target))
                    {
                        await e.Channel.SendMessage($"Could not let {target.Mention} leave game");
                    }
                    else
                    {
                        await e.Channel.SendMessage($"{target.Mention} successfully left game");
                    }
                }
                else
                {
                    if (!cah.LeaveGame(e.User))
                    {
                        await e.Channel.SendMessage($"Could not get {e.User.Mention} to leave game");
                    }
                    else
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} successfully left game");
                    }
                }
            });

            cgb.CreateCommand(Module.Prefix + "cahstart")
            .Description("Starts game of Cards Against Humanity")
            .Do(async e =>
            {
                CardsAgainstHumanityGame cah;
                if (!RunningCAHs.TryGetValue(e.Server.Id, out cah))
                {
                    await e.Channel.SendMessage("No active game on this server");
                    return;
                }
                if (cah.Players.Count < 2)
                {
                    await e.Channel.SendMessage("Can't start without more than one player");
                }
                cah.StartUp = false;
            });

            cgb.CreateCommand(Module.Prefix + "cahnext")
            .Description("Skips to the next phase of the round.")
            .Do(async e =>
            {
                CardsAgainstHumanityGame cah;
                if (!RunningCAHs.TryGetValue(e.Server.Id, out cah))
                {
                    await e.Channel.SendMessage("No active game on this server");
                    return;
                }
                if (cah.SkipToNext())
                {
                    await e.Channel.SendMessage("skipped succesfully");
                }
                else
                {
                    await e.Channel.SendMessage($"Could not skip. try `{Module.Prefix}cahstart");
                }
            });

            cgb.CreateCommand(Module.Prefix + "cahq")
            .Description("Quits current CAH game after current round")
            .Do(async e =>
            {
                CardsAgainstHumanityGame cah;
                if (RunningCAHs.TryGetValue(e.Server.Id, out cah))
                {
                    await cah.StopGame();
                }
                else
                {
                    await e.Channel.SendMessage("NO CAH is running on this server");
                }
            });
        }
Example #15
0
        public void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(".repeat")
            .Description("Repeat a message every X minutes. If no parameters are specified, repeat is disabled. Requires manage messages.")
            .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");
                    Repeater rep;
                    if (repeaters.TryGetValue(e.Server, out rep))
                    {
                        rep.MessageTimer.Stop();
                    }
                    return;
                }
                int minutes;
                if (!int.TryParse(minutesStr, out minutes) || minutes < 1 || minutes > 720)
                {
                    await e.Channel.SendMessage("Invalid value");
                    return;
                }

                var repeater = repeaters.GetOrAdd(e.Server, s => new Repeater());

                repeater.ReChannel             = e.Channel;
                repeater.MessageTimer.Interval = minutes * 60 * 1000;

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

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

                await e.Channel.SendMessage(String.Format("👌 Repeating `{0}` every " +
                                                          "**{1}** minutes on {2} channel.",
                                                          repeater.ReMessage, minutes, repeater.ReChannel));
            });

            cgb.CreateCommand(".logserver")
            .Description("Toggles logging in this channel. Logs every message sent/deleted/edited on the server. BOT OWNER ONLY. SERVER OWNER ONLY.")
            .Do(DoFunc());

            cgb.CreateCommand(".userpresence")
            .Description("Starts logging to this channel when someone from the server goes online/offline/idle. BOT OWNER ONLY. SERVER OWNER ONLY.")
            .Do(async e => {
                if (!NadekoBot.IsOwner(e.User.Id) ||
                    !e.User.ServerPermissions.ManageServer)
                {
                    return;
                }
                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(".voicepresence")
            .Description("Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. BOT OWNER ONLY. SERVER OWNER ONLY.")
            .Parameter("all", ParameterType.Optional)
            .Do(async e => {
                if (!NadekoBot.IsOwner(e.User.Id) ||
                    !e.User.ServerPermissions.ManageServer)
                {
                    return;
                }

                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.`");
                }
            });
        }
Example #16
0
 public static Func <Command, User, Channel, bool> ManageMessages() =>
 (com, user, ch) => NadekoBot.IsOwner(user.Id);