Exemple #1
0
        private void OnClientChanged(IClient oldClient, IClient newClient)
        {
            // Remove old handlers
            if (oldClient != null)
            {
                oldClient.GameStarted -= OnGameStarted;

                _controller?.UnsubscribeFromClientEvents();
                Bot?.UnsubscribeFromClientEvents();
            }

            // Add new handlers
            if (newClient != null)
            {
                newClient.GameStarted += OnGameStarted;
                // And create controller + bot
                _controller = new GameController.GameController(newClient);
                //Bot = new GenericBot(newClient, new LuckyToiletOnePiece(), null);
                Bot = new GenericBot(newClient, new AdvancedPierreDellacherieOnePiece(), new SinaCSpecials());
                //Bot = new GenericBot(newClient, new ColinFaheyTwoPiece(), new SinaCSpecials());
            }
            else
            {
                _controller = null;
                Bot         = null;
            }
        }
Exemple #2
0
        public List <Command> GetSocialCommands()
        {
            List <Command> SocialCommands = new List <Command>();

            Command time = new Command("time");

            time.Description = "Get the current time with different timezone support";
            time.ToExecute  += async(client, msg, parameters) =>
            {
                if (parameters.Empty())
                {
                    var currTime = DateTimeOffset.UtcNow.TimeOfDay;

                    bool pm = currTime.Hours >= 12;

                    int    hour    = currTime.Hours;
                    string minutes = "00" + currTime.Minutes;
                    if (pm)
                    {
                        hour = currTime.Hours - 12;
                    }

                    while (minutes.Length > 2)
                    {
                        minutes = minutes.Substring(1, 3);
                    }


                    string sTime = $"{hour}:{("00" + currTime.Minutes)} ";
                    if (pm)
                    {
                        sTime += "PM";
                    }
                    else
                    {
                        sTime += "AM";
                    }
                    await msg.ReplyAsync($"Current GMT time is `{sTime}`");

                    return;
                }
                try
                {
                    Dictionary <string, string> _timeZones = new Dictionary <string, string>()
                    {
                        { "ACDT", "+10:30" }, { "ACST", "+09:30" }, { "ADT", "-03:00" }, { "AEDT", "+11:00" }, { "AEST", "+10:00" }, { "AHDT", "-09:00" }, { "AHST", "-10:00" }, { "AST", "-04:00" }, { "AT", "-02:00" }, { "AWDT", "+09:00" }, { "AWST", "+08:00" }, { "BAT", "+03:00" }, { "BDST", "+02:00" }, { "BET", "-11:00" }, { "BST", "01:00" }, { "BT", "+03:00" }, { "BZT2", "-03:00" }, { "CADT", "+10:30" }, { "CAST", "+09:30" }, { "CAT", "-10:00" }, { "CCT", "+08:00" }, { "CDT", "-05:00" }, { "CED", "+02:00" }, { "CET", "+01:00" }, { "CEST", "+02:00" }, { "CST", "-06:00" }, { "EAST", "+10:00" }, { "EDT", "-04:00" }, { "EED", "+03:00" }, { "EET", "+02:00" }, { "EEST", "+03:00" }, { "EST", "-05:00" }, { "FST", "+02:00" }, { "FWT", "+01:00" }, { "GMT", "+00:00" }, { "GST", "+10:00" }, { "HDT", "-09:00" }, { "HST", "-10:00" }, { "IDLE", "+12:00" }, { "IDLW", "-12:00" }, { "IST", "+05:30" }, { "IT", "+03:30" }, { "JST", "+09:00" }, { "JT", "+07:00" }, { "MDT", "-06:00" }, { "MED", "+02:00" }, { "MET", "+01:00" }, { "MEST", "+02:00" }, { "MEWT", "+01:00" }, { "MST", "-07:00" }, { "MT", "+08:00" }, { "NDT", "-02:30" }, { "NFT", "-03:30" }, { "NT", "-11:00" }, { "NST", "+06:30" }, { "NZ", "+11:00" }, { "NZST", "+12:00" }, { "NZDT", "+13:00" }, { "NZT", "+12:00" }, { "PDT", "-07:00" }, { "PST", "-08:00" }, { "ROK", "+09:00" }, { "SAD", "+10:00" }, { "SAST", "+09:00" }, { "SAT", "+09:00" }, { "SDT", "+10:00" }, { "SST", "+02:00" }, { "SWT", "+01:00" }, { "USZ3", "+04:00" }, { "USZ4", "+05:00" }, { "USZ5", "+06:00" }, { "USZ6", "+07:00" }, { "UT", "-00:00" }, { "UTC", "-00:00" }, { "UZ10", "+11:00" }, { "WAT", "-01:00" }, { "WET", "-00:00" }, { "WST", "+08:00" }, { "YDT", "-08:00" }, { "YST", "-09:00" }, { "ZP4", "+04:00" }, { "ZP5", "+05:00" }, { "ZP6", "+06:00" }
                    };
                    var currTime = DateTimeOffset.UtcNow.TimeOfDay + TimeSpan.Parse(_timeZones[parameters[0].ToUpper()]);

                    bool pm = currTime.Hours >= 12;

                    int hour = currTime.Hours;
                    if (pm)
                    {
                        hour = currTime.Hours - 12;
                    }

                    string sTime = $"{hour}:{currTime.Minutes} ";
                    if (pm)
                    {
                        sTime += "PM";
                    }
                    else
                    {
                        sTime += "AM";
                    }

                    await msg.ReplyAsync($"Current {parameters[0].ToUpper()} time is `{sTime}`");
                }
                catch (Exception ex)
                {
                    await msg.ReplyAsync($"An error occured: `{ex.Message}`");

                    if (msg.Author.Id == 169918990313848832)
                    {
                        await msg.ReplyAsync($"```\n{ex.StackTrace}\n```");
                    }
                }
            };

            SocialCommands.Add(time);

            Command jeff = new Command("jeff");

            jeff.ToExecute += async(client, msg, parameters) =>
            {
                string filename = "";
                if (parameters.Empty())
                {
                    var user = msg.Author;
                    using (WebClient webClient = new WebClient())
                    {
                        await webClient.DownloadFileTaskAsync(new Uri(user.GetAvatarUrl().Replace("size=128", "size=512")),
                                                              $"files/img/{user.AvatarId}.png");
                    }
                    filename = $"files/img/{user.AvatarId}.png";
                }
                else if (Uri.IsWellFormedUriString(parameters[0], UriKind.RelativeOrAbsolute) &&
                         (parameters[0].EndsWith(".png") || parameters[0].EndsWith(".jpg") ||
                          parameters[0].EndsWith("jpeg") || parameters[0].EndsWith(".gif")))
                {
                    filename = $"files/img/{msg.Id}.{parameters.reJoin().Split('.').Last()}";
                    using (WebClient webclient = new WebClient())
                    {
                        await webclient.DownloadFileTaskAsync(new Uri(parameters.reJoin()), filename);
                    }
                }
                else if (msg.GetMentionedUsers().Any())
                {
                    var user = msg.GetMentionedUsers().First();
                    using (WebClient webClient = new WebClient())
                    {
                        await webClient.DownloadFileTaskAsync(new Uri(user.GetAvatarUrl().Replace("size=128", "size=512")),
                                                              $"files/img/{user.AvatarId}.png");
                    }
                    filename = $"files/img/{user.AvatarId}.png";
                }

                {
                    int   targetWidth  = 1278;
                    int   targetHeight = 717; //height and width of the finished image
                    Image baseImage    = Image.FromFile("files/img/jeff.png");
                    Image avatar       = Image.FromFile(filename);

                    //be sure to use a pixelformat that supports transparency
                    using (var bitmap = new Bitmap(targetWidth, targetHeight, PixelFormat.Format32bppArgb))
                    {
                        using (var canvas = Graphics.FromImage(bitmap))
                        {
                            //this ensures that the backgroundcolor is transparent
                            canvas.Clear(Color.White);

                            //this paints the frontimage with a offset at the given coordinates
                            canvas.DrawImage(avatar, 523, 92, 269, 269);

                            //this selects the entire backimage and and paints
                            //it on the new image in the same size, so its not distorted.
                            canvas.DrawImage(baseImage, 0, 0, targetWidth, targetHeight);
                            canvas.Save();
                        }

                        bitmap.Save($"files/img/jeff_{msg.Id}.png", System.Drawing.Imaging.ImageFormat.Png);
                    }
                    await Task.Delay(100);

                    await msg.Channel.SendFileAsync($"files/img/jeff_{msg.Id}.png");

                    baseImage.Dispose();
                    avatar.Dispose();
                    File.Delete(filename);
                    File.Delete($"files/img/jeff_{msg.Id}.png");
                }
            };

            SocialCommands.Add(jeff);

            Command giveaway = new Command("giveaway");

            giveaway.Usage              = "giveaway <start|close|roll>";
            giveaway.Description        = "Start or end a giveaway";
            giveaway.RequiredPermission = Command.PermissionLevels.Moderator;
            giveaway.ToExecute         += async(client, msg, parameters) =>
            {
                if (parameters.Empty())
                {
                    await msg.ReplyAsync(
                        $"You have to tell me to do something. _\\*(Try `{GenericBot.GuildConfigs[msg.GetGuild().Id].Prefix}help giveaway)*_ for some options");

                    return;
                }
                string op          = parameters[0].ToLower();
                var    guildConfig = GenericBot.GuildConfigs[msg.GetGuild().Id];
                if (op.Equals("start"))
                {
                    if (guildConfig.Giveaway == null || !guildConfig.Giveaway.Open)
                    {
                        guildConfig.Giveaway = new Giveaway();
                        await msg.ReplyAsync($"A new giveaway has been created!");
                    }
                    else
                    {
                        await msg.ReplyAsync(
                            $"There is already an open giveaway! You have to close it before you can open a new one.");
                    }
                }
                else if (op.Equals("close"))
                {
                    if (guildConfig.Giveaway == null || !guildConfig.Giveaway.Open)
                    {
                        await msg.ReplyAsync($"There's no open giveaway.");
                    }
                    else
                    {
                        guildConfig.Giveaway.Open = false;
                        await msg.ReplyAsync($"Giveaway closed! {guildConfig.Giveaway.Hopefuls.Count} people entered.");
                    }
                }
                else if (op.Equals("roll"))
                {
                    if (guildConfig.Giveaway == null)
                    {
                        await msg.ReplyAsync($"There's no existing giveaway.");
                    }
                    else if (guildConfig.Giveaway.Open)
                    {
                        await msg.ReplyAsync("You have to close the giveaway first!");
                    }
                    else
                    {
                        await msg.ReplyAsync(
                            $"<@{guildConfig.Giveaway.Hopefuls.GetRandomItem()}> has won... something!");
                    }
                }
                else
                {
                    await msg.ReplyAsync($"That's not a valid option");
                }
                guildConfig.Save();
            };

            SocialCommands.Add(giveaway);

            Command g = new Command("g");

            g.Description = "Enter into the active giveaway";
            g.ToExecute  += async(client, msg, parameters) =>
            {
                var guildConfig = GenericBot.GuildConfigs[msg.GetGuild().Id];
                {
                    RestUserMessage resMessge;
                    if (guildConfig.Giveaway == null || !guildConfig.Giveaway.Open)
                    {
                        resMessge = msg.ReplyAsync($"There's no open giveaway.").Result;
                    }
                    else
                    {
                        var guildConfigGiveaway = guildConfig.Giveaway;
                        if (guildConfigGiveaway.Hopefuls.Contains(msg.Author.Id))
                        {
                            resMessge = msg.ReplyAsync($"You're already in this giveaway.").Result;
                        }
                        else
                        {
                            guildConfigGiveaway.Hopefuls.Add(msg.Author.Id);
                            resMessge = msg.ReplyAsync($"You're in, {msg.Author.Mention}. Good luck!").Result;
                        }
                    }
                    GenericBot.QueueMessagesForDelete(new List <IMessage> {
                        msg, resMessge
                    });
                }
                guildConfig.Save();
            };

            SocialCommands.Add(g);

            Command checkinvite = new Command("checkinvite");

            checkinvite.Description = "Check the information of a discord invite";
            checkinvite.Usage       = "checkinvite <code>";
            checkinvite.ToExecute  += async(client, msg, parameters) =>
            {
                if (parameters.Empty())
                {
                    await msg.ReplyAsync($"You need to give me a code to look at!");

                    return;
                }
                var inviteCode = parameters.Last().Split("/").Last();
                try
                {
                    var invite = client.GetInviteAsync(inviteCode).Result;
                    if (invite.Equals(null))
                    {
                        await msg.Channel.SendMessageAsync("", embed : new EmbedBuilder()
                                                           .WithColor(255, 0, 0)
                                                           .WithDescription("Invalid invite").Build());
                    }

                    var embedBuilder = new EmbedBuilder()
                                       .WithColor(0, 255, 0)
                                       .WithTitle("Valid Invite")
                                       .WithUrl($"https://discord.gg/{invite.Code}")
                                       .AddField(new EmbedFieldBuilder().WithName("Guild Name").WithValue(invite.GuildName)
                                                 .WithIsInline(true))
                                       .AddField(new EmbedFieldBuilder().WithName("_ _").WithValue("_ _").WithIsInline(true))
                                       .AddField(new EmbedFieldBuilder().WithName("Channel Name").WithValue(invite.ChannelName)
                                                 .WithIsInline(true))
                                       .AddField(new EmbedFieldBuilder().WithName("Guild Id").WithValue(invite.GuildId)
                                                 .WithIsInline(true))
                                       .AddField(new EmbedFieldBuilder().WithName("_ _").WithValue("_ _").WithIsInline(true))
                                       .AddField(new EmbedFieldBuilder().WithName("Channel Id").WithValue(invite.ChannelId)
                                                 .WithIsInline(true))
                                       .WithCurrentTimestamp();

                    await msg.Channel.SendMessageAsync("", embed : embedBuilder.Build());
                }
                catch (Exception e)
                {
                    await msg.Channel.SendMessageAsync("", embed : new EmbedBuilder()
                                                       .WithColor(255, 0, 0)
                                                       .WithDescription("Invalid invite").Build());
                }
            };

            SocialCommands.Add(checkinvite);

            Command hug = new Command("hug");

            hug.Delete     = true;
            hug.Usage      = "hug <?user>";
            hug.ToExecute += async(client, msg, parameters) =>
            {
                if (msg.MentionedUsers.Any())
                {
                    await msg.ReplyAsync($"_\\*{msg.Author.Mention} hugs {msg.MentionedUsers.Select(u => u.Mention).ToList().SumAnd()}*_");
                }
                else
                {
                    await msg.ReplyAsync($"_\\*hugs {msg.Author.Mention}*_");
                }
            };

            SocialCommands.Add(hug);

            return(SocialCommands);
        }
Exemple #3
0
        public List <Command> GetRoleCommands()
        {
            List <Command> RoleCommands = new List <Command>();

            Command mentionRole = new Command(nameof(mentionRole));

            mentionRole.RequiredPermission = Command.PermissionLevels.Moderator;
            mentionRole.Description        = "Mention a role that's not normally mentionable";
            mentionRole.ToExecute         += async(client, msg, parameters) =>
            {
                if (msg.GetGuild().Roles.HasElement(r => r.Name.ToLower().Contains(parameters[0].ToLower()), out SocketRole role))
                {
                    var state = role.IsMentionable;
                    if (!state)
                    {
                        await role.ModifyAsync(r => r.Mentionable = true);
                    }
                    parameters.RemoveAt(0);
                    await msg.ReplyAsync(role.Mention + " " + parameters.reJoin());

                    await msg.DeleteAsync();

                    if (!state)
                    {
                        await role.ModifyAsync(r => r.Mentionable = state);
                    }
                }
                else
                {
                    await msg.ReplyAsync("Couldn't find that role!");
                }
            };

            RoleCommands.Add(mentionRole);

            Command UserRoles = new Command("userroles");

            UserRoles.Description = $"Show all user roles on this server";
            UserRoles.Usage       = "userroles";
            UserRoles.ToExecute  += async(client, msg, paramList) =>
            {
                string prefix = (!String.IsNullOrEmpty(GenericBot.GuildConfigs[(msg.Channel as SocketGuildChannel).Guild.Id].Prefix))
                ? GenericBot.GuildConfigs[(msg.Channel as SocketGuildChannel).Guild.Id].Prefix : GenericBot.GlobalConfiguration.DefaultPrefix;
                string message = $"You can use `{prefix}iam` and `{prefix}iamnot` with any of these roles:\n";
                foreach (var role in msg.GetGuild().Roles
                         .Where(r => GenericBot.GuildConfigs[msg.GetGuild().Id].UserRoleIds.Contains(r.Id))
                         .OrderBy(r => r.Name))
                {
                    if ((msg.Author as SocketGuildUser).Roles.Contains(role))
                    {
                        message += "\\✔ ";
                    }
                    else
                    {
                        message += "✘";
                    }
                    message += $"`{role.Name}`, ";
                }
                message = message.Trim(' ', ',');

                foreach (var str in message.SplitSafe())
                {
                    await msg.ReplyAsync(str);
                }
            };

            RoleCommands.Add(UserRoles);

            Command iam = new Command("iam");

            iam.Description = "Join a User Role";
            iam.Usage       = "iam <role name>";
            iam.Aliases     = new List <string> {
                "join"
            };
            iam.ToExecute += async(client, msg, paramList) =>
            {
                IMessage rep;
                if (paramList.Empty())
                {
                    rep = msg.ReplyAsync($"Please select a role to join").Result;
                    GenericBot.QueueMessagesForDelete(new List <IMessage> {
                        msg, rep
                    });
                }
                string input = paramList.Aggregate((i, j) => i + " " + j);

                var roles = msg.GetGuild().Roles.Where(r => r.Name.ToLower().Contains(input.ToLower()))
                            .Where(r => GenericBot.GuildConfigs[msg.GetGuild().Id].UserRoleIds.Contains(r.Id));

                if (!roles.Any())
                {
                    rep = msg.ReplyAsync($"Could not find any user roles matching `{input}`").Result;
                    GenericBot.QueueMessagesForDelete(new List <IMessage> {
                        msg, rep
                    });
                }
                else if (roles.Count() == 1)
                {
                    try
                    {
                        RestUserMessage message;
                        if (msg.GetGuild().GetUser(msg.Author.Id).Roles.Any(r => r.Id == roles.First().Id))
                        {
                            message = await msg.ReplyAsync("You already have that role!");
                        }
                        else
                        {
                            await msg.GetGuild().GetUser(msg.Author.Id).AddRoleAsync(roles.First());

                            message = await msg.ReplyAsync("Done!");
                        }

                        await Task.Delay(5000);

                        await msg.DeleteAsync();

                        await message.DeleteAsync();
                    }
                    catch (Exception e)
                    {
                        await GenericBot.Logger.LogErrorMessage(e.Message);

                        await msg.ReplyAsync($"I may not have permissions to do that!");
                    }
                }
                else if (roles.Count() > 1)
                {
                    try
                    {
                        var role = roles.Any(r => r.Name.ToLower() == input.ToLower())
                            ? roles.First(r => r.Name.ToLower() == input.ToLower())
                            : roles.First();
                        RestUserMessage message;
                        if (msg.GetGuild().GetUser(msg.Author.Id).Roles.Any(r => r.Id == roles.First().Id))
                        {
                            message = await msg.ReplyAsync("You already have that role!");
                        }
                        else
                        {
                            await msg.GetGuild().GetUser(msg.Author.Id).AddRoleAsync(role);

                            message = await msg.ReplyAsync($"I've assigned you `{role.Name}`");
                        }

                        await Task.Delay(5000);

                        await msg.DeleteAsync();

                        await message.DeleteAsync();
                    }
                    catch (Exception e)
                    {
                        await GenericBot.Logger.LogErrorMessage(e.Message);

                        await msg.ReplyAsync($"I may not have permissions to do that!");
                    }
                }
            };

            RoleCommands.Add(iam);

            Command iamnot = new Command("iamnot");

            iamnot.Description = "Leave a User Role";
            iamnot.Usage       = "iamnot <role name>";
            iamnot.Aliases     = new List <string> {
                "leave"
            };
            iamnot.ToExecute += async(client, msg, paramList) =>
            {
                IMessage rep;
                if (paramList.Empty())
                {
                    rep = msg.ReplyAsync($"Please select a role to leave").Result;
                    GenericBot.QueueMessagesForDelete(new List <IMessage> {
                        msg, rep
                    });
                }
                string input = paramList.Aggregate((i, j) => i + " " + j);

                var roles = msg.GetGuild().Roles.Where(r => r.Name.ToLower().Contains(input.ToLower()))
                            .Where(r => GenericBot.GuildConfigs[msg.GetGuild().Id].UserRoleIds.Contains(r.Id));

                if (!roles.Any())
                {
                    rep = msg.ReplyAsync($"Could not find any user roles matching `{input}`").Result;
                    GenericBot.QueueMessagesForDelete(new List <IMessage> {
                        msg, rep
                    });
                }
                else if (roles.Count() == 1)
                {
                    try
                    {
                        RestUserMessage message;
                        if (!msg.GetGuild().GetUser(msg.Author.Id).Roles.Any(r => r.Id == roles.First().Id))
                        {
                            message = await msg.ReplyAsync("You don't have that role!");
                        }
                        else
                        {
                            await msg.GetGuild().GetUser(msg.Author.Id).RemoveRoleAsync(roles.First());

                            message = await msg.ReplyAsync("Done!");
                        }

                        await Task.Delay(5000);

                        await msg.DeleteAsync();

                        await message.DeleteAsync();
                    }
                    catch (Exception e)
                    {
                        await GenericBot.Logger.LogErrorMessage(e.Message);

                        await msg.ReplyAsync($"I may not have permissions to do that!");
                    }
                }
                else if (roles.Count() > 1)
                {
                    try
                    {
                        RestUserMessage message;
                        if (!msg.GetGuild().GetUser(msg.Author.Id).Roles.Any(r => r.Id == roles.First().Id))
                        {
                            message = await msg.ReplyAsync("You don't have that role!");
                        }
                        else
                        {
                            await msg.GetGuild().GetUser(msg.Author.Id).RemoveRoleAsync(roles.First());

                            message = await msg.ReplyAsync($"Removed `{roles.First()}`");
                        }

                        await Task.Delay(5000);

                        await msg.DeleteAsync();

                        await message.DeleteAsync();
                    }
                    catch (Exception e)
                    {
                        await GenericBot.Logger.LogErrorMessage(e.Message);

                        await msg.ReplyAsync($"I may not have permissions to do that!");
                    }
                }
            };

            RoleCommands.Add(iamnot);

            Command getrole = new Command("getrole");

            getrole.Description        = "Get the ID of a role";
            getrole.Usage              = "getrole <role name>";
            getrole.RequiredPermission = Command.PermissionLevels.Moderator;
            getrole.ToExecute         += async(client, msg, paramList) =>
            {
                string message = $"Roles matching `{paramList.reJoin()}`:\n";
                foreach (var role in msg.GetGuild().Roles.Where(r => r.Name.ToLower().Contains(paramList.reJoin())))
                {
                    message += $"{role.Name} (`{role.Id}`)\n";
                }

                foreach (var str in message.SplitSafe())
                {
                    msg.ReplyAsync(str);
                }
            };

            RoleCommands.Add(getrole);

            Command membersOf = new Command("membersof");

            membersOf.Description        = "List all members of a role";
            membersOf.Usage              = "membersof <rolename>";
            membersOf.RequiredPermission = Command.PermissionLevels.Moderator;
            membersOf.ToExecute         += async(client, msg, parameters) =>
            {
                if (parameters.Empty())
                {
                    await msg.ReplyAsync($"You need to specify a role");

                    return;
                }
                string result = "";
                foreach (var role in msg.GetGuild().Roles.OrderByDescending(r => r.Position).Where(r => new Regex(parameters.reJoin(), RegexOptions.IgnoreCase).IsMatch(r.Name) && r.Name != "@everyone"))
                {
                    result += $"\n**`{role.Name}` ({role.Members.Count()} Members)**\n";
                    foreach (var user in role.Members.OrderBy(u => u.Username))
                    {
                        if (!string.IsNullOrEmpty(user.Nickname))
                        {
                            result += $"{user.Nickname.Replace('`', '\'').Replace("_", "\\_")} ";
                        }
                        else
                        {
                            result += $"{user.Username.Replace('`', '\'').Replace("_", "\\_")} ";
                        }
                        result += $"(`{user.ToString().Replace('`', '\'')}`)\n";
                    }
                }

                foreach (var str in result.SplitSafe('\n'))
                {
                    await msg.ReplyAsync(str);
                }
            };

            RoleCommands.Add(membersOf);

            Command createRole = new Command("createRole");

            createRole.Description        = "Create a new role with default permissions";
            createRole.Usage              = "createRole <name>";
            createRole.RequiredPermission = Command.PermissionLevels.Admin;
            createRole.ToExecute         += async(client, msg, parameters) =>
            {
                RestRole role;
                bool     makeMentionable = false;
                if (parameters[0].ToLower().Equals("+m"))
                {
                    parameters.RemoveAt(0);
                    makeMentionable = true;
                }

                role = msg.GetGuild().CreateRoleAsync(parameters.reJoin(), GuildPermissions.None).Result;
                if (makeMentionable)
                {
                    await role.ModifyAsync(r => r.Mentionable = true);
                }
                await msg.ReplyAsync($"Created new role `{role.Name}` with ID `{role.Id}`");
            };

            RoleCommands.Add(createRole);

            Command createUserRole = new Command("createUserRole");

            createUserRole.Description        = "Create a new role with default permissions and add it to the public role list";
            createUserRole.Usage              = "createUserRole <name>";
            createUserRole.RequiredPermission = Command.PermissionLevels.Admin;
            createUserRole.ToExecute         += async(client, msg, parameters) =>
            {
                RestRole role;
                bool     makeMentionable = false;
                if (parameters[0].ToLower().Equals("+m"))
                {
                    parameters.RemoveAt(0);
                    makeMentionable = true;
                }

                role = msg.GetGuild().CreateRoleAsync(parameters.reJoin(), GuildPermissions.None).Result;
                var gc = GenericBot.GuildConfigs[msg.GetGuild().Id];
                gc.UserRoleIds.Add(role.Id);
                gc.Save();
                if (makeMentionable)
                {
                    await role.ModifyAsync(r => r.Mentionable = true);
                }
                await msg.ReplyAsync($"Created new role `{role.Name}` with ID `{role.Id}` and added it to the user roles");
            };

            RoleCommands.Add(createUserRole);

            Command roleeveryone = new Command("roleeveryone");

            roleeveryone.Aliases = new List <string> {
                "roleveryone"
            };
            roleeveryone.Description        = "Give or remove a role from everyone";
            roleeveryone.Usage              = "roleveryone [+-] <roleID>";
            roleeveryone.RequiredPermission = Command.PermissionLevels.Admin;
            roleeveryone.ToExecute         += async(client, msg, parameters) =>
            {
                if (!(parameters[0].Contains("+") || parameters[0].Contains("-")))
                {
                    await msg.ReplyAsync($"Invalid option `{parameters[0]}`");
                }
                ulong id;
                if (ulong.TryParse(parameters[1], out id) && msg.GetGuild().Roles.Any(r => r.Id == id))
                {
                    int i = 0;
                    await msg.GetGuild().DownloadUsersAsync();

                    var role = msg.GetGuild().GetRole(id);
                    foreach (var u in msg.GetGuild().Users)
                    {
                        if (parameters[0].Contains("-") && u.Roles.Any(r => r.Id == id))
                        {
                            await u.RemoveRoleAsync(role);

                            i++;
                        }
                        if (parameters[0].Contains("+") && !u.Roles.Any(r => r.Id == id))
                        {
                            await u.AddRoleAsync(role);

                            i++;
                        }
                    }
                    string addrem = parameters[0].Contains("+") ? "Added" : "Removed";
                    string tofrom = parameters[0].Contains("+") ? "to" : "from";
                    await msg.ReplyAsync($"{addrem} `{role.Name}` {tofrom} `{i}` users.");
                }
                else
                {
                    await msg.ReplyAsync("Invalid Role Id");
                }
            };

            RoleCommands.Add(roleeveryone);

            Command roleStore = new Command("roleStore");

            roleStore.Description = "Store your roles so you can restore them later";
            roleStore.Usage       = "rolestore [save|restore]";
            roleStore.ToExecute  += async(client, msg, parameters) =>
            {
                if (parameters[0].ToLower().Equals("save"))
                {
                    var          guildDb = new DBGuild(msg.GetGuild().Id);
                    var          dbUser  = guildDb.Users.First(u => u.ID.Equals(msg.Author.Id));
                    List <ulong> roles   = new List <ulong>();
                    foreach (var role in (msg.Author as SocketGuildUser).Roles)
                    {
                        roles.Add(role.Id);
                    }

                    dbUser.SavedRoles = roles;

                    await msg.ReplyAsync($"I've saved `{dbUser.SavedRoles.Count}` roles for you!");

                    guildDb.Save();
                }
                else if (parameters[0].ToLower().Equals("restore"))
                {
                    var guildDb = new DBGuild(msg.GetGuild().Id);
                    if (guildDb.Users.Any(u => u.ID.Equals(msg.Author.Id))) // if already exists
                    {
                        var dbUser = guildDb.Users.First(u => u.ID.Equals(msg.Author.Id));
                        if (dbUser.SavedRoles == null || !dbUser.SavedRoles.Any())
                        {
                            await msg.ReplyAsync("No roles saved. Try using `rolestore save` first!");

                            return;
                        }

                        int success = 0;
                        int fails   = 0;
                        foreach (var id in dbUser.SavedRoles.Where(id =>
                                                                   !(msg.Author as IGuildUser).RoleIds.Contains(id)))
                        {
                            try
                            {
                                await(msg.Author as SocketGuildUser).AddRoleAsync(
                                    msg.GetGuild().Roles.First(r => r.Id.Equals(id)));
                                success++;
                            }
                            catch (Exception e)
                            {
                                fails++;
                            }
                        }

                        await msg.ReplyAsync($"`{success}` roles restored, `{fails}` failed");
                    }
                    else
                    {
                        await msg.ReplyAsync("I don't have any saved roles for you");

                        return;
                    }
                }
                else
                {
                    await msg.ReplyAsync("Invalid option");
                }
            };

            RoleCommands.Add(roleStore);

            return(RoleCommands);
        }