Пример #1
0
        /// <inheritdoc />
        public async Task <GuildPermission> GetPermissionsAsync(IDiscordGuildUser user)
        {
            if (user.Id == OwnerId)
            {
                return(GuildPermission.All);
            }

            GuildPermission permissions = Permissions;

            if (permissions.HasFlag(GuildPermission.Administrator))
            {
                return(GuildPermission.All);
            }

            IDiscordRole everyoneRole = await GetRoleAsync(Id);

            permissions = everyoneRole.Permissions;

            if (user.RoleIds != null)
            {
                var roles = await GetRolesAsync();

                foreach (IDiscordRole role in roles.Where(x => user.RoleIds.Contains(x.Id)))
                {
                    permissions |= role.Permissions;
                }
            }

            if (permissions.HasFlag(GuildPermission.Administrator))
            {
                return(GuildPermission.All);
            }
            return(permissions);
        }
Пример #2
0
        public async Task IAmNotAsync(EventContext e)
        {
            IDiscordRole role = GetRoleByName(e.Guild, e.arguments);

            if (role == null)
            {
                await e.ErrorEmbed(e.Channel.GetLocale().GetString("error_role_null"))
                .SendToChannel(e.Channel);

                return;
            }

            if (!e.Author.RoleIds.Contains(role.Id))
            {
                await e.ErrorEmbed(e.Channel.GetLocale().GetString("error_role_forbidden"))
                .SendToChannel(e.Channel);

                return;
            }

            using (var context = new MikiContext())
            {
                LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                User user = await context.Users.FindAsync(e.Author.Id.ToDbLong());

                await e.Author.RemoveRoleAsync(newRole.Role);

                Utils.Embed.SetTitle("I AM NOT")
                .SetColor(255, 128, 128)
                .SetDescription($"You're no longer a(n) {role.Name}!")
                .QueueToChannel(e.Channel);
            }
        }
Пример #3
0
        public async Task IAmNotAsync(EventContext e)
        {
            string roleName = e.Arguments.ToString();

            using (var context = new MikiContext())
            {
                List <IDiscordRole> roles = await GetRolesByName(e.Guild, roleName);

                IDiscordRole role = null;

                if (roles.Count > 1)
                {
                    List <LevelRole> levelRoles = await context.LevelRoles.Where(x => x.GuildId == (long)e.Guild.Id).ToListAsync();

                    if (levelRoles.Where(x => x.Role.Name.ToLower() == roleName.ToLower()).Count() > 1)
                    {
                        e.ErrorEmbed("two roles configured have the same name.")
                        .ToEmbed().QueueToChannel(e.Channel);
                        return;
                    }
                    else
                    {
                        role = levelRoles.Where(x => x.Role.Name.ToLower() == roleName.ToLower()).FirstOrDefault().Role;
                    }
                }
                else
                {
                    role = roles.FirstOrDefault();
                }

                if (role == null)
                {
                    await e.ErrorEmbed(e.GetResource("error_role_null"))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                IDiscordGuildUser author = await e.Guild.GetUserAsync(e.Author.Id);

                if (!author.RoleIds.Contains(role.Id))
                {
                    await e.ErrorEmbed(e.GetResource("error_role_forbidden"))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                User user = await context.Users.FindAsync(e.Author.Id.ToDbLong());

                await author.RemoveRoleAsync(newRole.Role);

                Utils.Embed.SetTitle("I AM NOT")
                .SetColor(255, 128, 128)
                .SetDescription($"You're no longer a(n) {role.Name}!")
                .ToEmbed().QueueToChannel(e.Channel);
            }
        }
Пример #4
0
        public async Task RemoveRoleAsync(IDiscordRole role)
        {
            if (role == null)
            {
                throw new ArgumentNullException(nameof(role));
            }

            await client.ApiClient.RemoveGuildMemberRoleAsync(GuildId, Id, role.Id);
        }
Пример #5
0
        public async Task RemoveRoleAsync(IDiscordRole role)
        {
            IRole      r = (role as IProxy <IRole>).ToNativeObject();
            IGuildUser u = (user as IGuildUser);

            await u.RemoveRolesAsync(new List <IRole> {
                r
            });
        }
Пример #6
0
        public async Task SetRoleLevelAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                Locale locale = Locale.GetEntity(e.Channel.Id.ToDbLong());

                List <string> allArgs = new List <string>();
                allArgs.AddRange(e.arguments.Split(' '));
                if (allArgs.Count >= 2)
                {
                    int levelrequirement = int.Parse(allArgs[allArgs.Count - 1]);
                    allArgs.RemoveAt(allArgs.Count - 1);
                    IDiscordRole role = e.Guild.Roles.Find(r => r.Name.ToLower() == string.Join(" ", allArgs).TrimEnd(' ').TrimStart(' ').ToLower());

                    if (role == null)
                    {
                        await Utils.ErrorEmbed(locale, "Couldn't find this role. Please try again!").SendToChannel(e.Channel);

                        return;
                    }

                    LevelRole lr = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                    if (lr == null)
                    {
                        lr = context.LevelRoles.Add(new LevelRole()
                        {
                            GuildId = e.Guild.Id.ToDbLong(), RoleId = role.Id.ToDbLong(), RequiredLevel = levelrequirement
                        });

                        IDiscordEmbed embed = Utils.Embed;
                        embed.Title       = "Added Role!";
                        embed.Description = $"I'll give someone the role {role.Name} when he/she reaches level {levelrequirement}!";
                        await embed.SendToChannel(e.Channel);
                    }
                    else
                    {
                        lr.RequiredLevel = levelrequirement;

                        IDiscordEmbed embed = Utils.Embed;
                        embed.Title       = "Updated Role!";
                        embed.Description = $"I'll give someone the role {role.Name} when he/she reaches level {levelrequirement}!";
                        await embed.SendToChannel(e.Channel);
                    }
                    await context.SaveChangesAsync();
                }
                else
                {
                    await Utils.ErrorEmbed(locale, "Make sure to fill out both the role and the level when creating this!").SendToChannel(e.Channel);
                }
            }
        }
Пример #7
0
        public async Task ResetAsync(IDiscordRole role, string permission)
        {
            if (!ValidatePermission(permission))
            {
                return;
            }

            if (!await _permissionManager.ResetRolePermissionAsync(_guild.Id, role.Id, permission))
            {
                Response.AddError(GetString("Command.Reset.Failed", "Role", permission, role));
            }
            else
            {
                Response.AddSuccess(GetString("Command.Reset.Success", "Role", permission, role));
            }
        }
Пример #8
0
 public virtual Task RemoveRoleAsync(IDiscordRole role)
 {
     throw new NotImplementedException();
 }
 public static Task <bool> HasRolePermissionAsync(this IPermissionManager manager, IDiscordRole role, ulong guildId, string permissionName)
 => manager.HasRolePermissionAsync(role.Id, permissionName, guildId);
 public GuildRoleUpdateEvent(ulong guildId, IDiscordRole role)
 {
     Role    = role;
     GuildId = guildId;
 }
Пример #11
0
 public RoleException(IDiscordRole role)
 {
     this.role = role;
 }
Пример #12
0
        public async Task IAmAsync(EventContext e)
        {
            IDiscordRole role = GetRoleByName(e.Guild, e.arguments);

            if (role == null)
            {
                await e.ErrorEmbed(e.Channel.GetLocale().GetString("error_role_null"))
                .SendToChannel(e.Channel);

                return;
            }

            if (e.Author.RoleIds.Contains(role.Id))
            {
                await e.ErrorEmbed(e.Channel.GetLocale().GetString("error_role_already_given"))
                .SendToChannel(e.Channel);

                return;
            }

            using (var context = new MikiContext())
            {
                LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                User user = await context.Users.FindAsync(e.Author.Id.ToDbLong());

                IDiscordUser discordUser = await e.Guild.GetUserAsync(user.Id.FromDbLong());

                if (newRole == null || !newRole.Optable)
                {
                    await e.ErrorEmbed(e.Channel.GetLocale().GetString("error_role_forbidden"))
                    .SendToChannel(e.Channel);

                    return;
                }

                if (newRole.RequiredLevel > user.Level)
                {
                    await e.ErrorEmbed(e.Channel.GetLocale().GetString("error_role_level_low", newRole.RequiredLevel - user.Level))
                    .SendToChannel(e.Channel);

                    return;
                }

                if (newRole.RequiredRole != 0 && !discordUser.RoleIds.Contains(newRole.RequiredRole.FromDbLong()))
                {
                    await e.ErrorEmbed(e.Channel.GetLocale().GetString("error_role_required", $"**{e.Guild.GetRole(newRole.RequiredRole.FromDbLong()).Name}**"))
                    .SendToChannel(e.Channel);

                    return;
                }

                if (newRole.Price > 0)
                {
                    if (user.Currency >= newRole.Price)
                    {
                        await e.Channel.SendMessageAsync($"Getting this role costs you {newRole.Price} mekos! type `yes` to proceed.");

                        IDiscordMessage m = await EventSystem.Instance.ListenNextMessageAsync(e.Channel.Id, e.Author.Id);

                        if (m.Content.ToLower()[0] == 'y')
                        {
                            User serverOwner = await context.Users.FindAsync(e.Guild.OwnerId.ToDbLong());

                            await user.AddCurrencyAsync(-newRole.Price);

                            await serverOwner.AddCurrencyAsync(newRole.Price);

                            await context.SaveChangesAsync();
                        }
                    }
                    else
                    {
                        await e.ErrorEmbed(e.Channel.GetLocale().GetString("user_error_insufficient_mekos"))
                        .SendToChannel(e.Channel);

                        return;
                    }
                }

                await e.Author.AddRoleAsync(newRole.Role);

                Utils.Embed.SetTitle("I AM")
                .SetColor(128, 255, 128)
                .SetDescription($"You're a(n) {role.Name} now!")
                .QueueToChannel(e.Channel);
            }
        }
Пример #13
0
        public async Task SetRoleLevelAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                Locale locale = Locale.GetEntity(e.Channel.Id.ToDbLong());

                List <string> allArgs = new List <string>();
                allArgs.AddRange(e.arguments.Split(' '));
                if (allArgs.Count >= 2)
                {
                    int levelrequirement = int.Parse(allArgs[allArgs.Count - 1]);
                    allArgs.RemoveAt(allArgs.Count - 1);
                    IDiscordRole role = e.Guild.Roles
                                        .Find(r => r.Name.ToLower() == string.Join(" ", allArgs).TrimEnd(' ').TrimStart(' ').ToLower());

                    if (role == null)
                    {
                        await e.ErrorEmbed(e.GetResource("error_role_not_found"))
                        .SendToChannel(e.Channel);

                        return;
                    }

                    LevelRole lr = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                    if (lr == null)
                    {
                        lr = context.LevelRoles.Add(new LevelRole()
                        {
                            GuildId       = e.Guild.Id.ToDbLong(),
                            RoleId        = role.Id.ToDbLong(),
                            RequiredLevel = levelrequirement
                        });

                        IDiscordEmbed embed = Utils.Embed;
                        embed.Title       = "Added Role!";
                        embed.Description = $"I'll give someone the role {role.Name} when he/she reaches level {levelrequirement}!";

                        if (!e.CurrentUser.HasPermissions(e.Channel, DiscordGuildPermission.ManageRoles))
                        {
                            embed.AddInlineField(e.GetResource("miki_warning"), e.GetResource("setrolelevel_error_no_permissions", $"`{e.GetResource("permission_manage_roles")}`"));
                        }

                        await embed.SendToChannel(e.Channel);
                    }
                    else
                    {
                        lr.RequiredLevel = levelrequirement;

                        IDiscordEmbed embed = Utils.Embed;
                        embed.Title       = "Updated Role!";
                        embed.Description = $"I'll give someone the role {role.Name} when he/she reaches level {levelrequirement}!";
                        await embed.SendToChannel(e.Channel);
                    }
                    await context.SaveChangesAsync();
                }
                else
                {
                    await Utils.ErrorEmbed(locale, "Make sure to fill out both the role and the level when creating this!")
                    .SendToChannel(e.Channel);
                }
            }
        }
Пример #14
0
        public async Task ConfigRoleQuickAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                string roleName = e.Arguments.ToString().Split('"')[1];

                IDiscordRole role = null;
                if (ulong.TryParse(roleName, out ulong s))
                {
                    role = await e.Guild.GetRoleAsync(s);
                }
                else
                {
                    role = (await GetRolesByName(e.Guild, roleName)).FirstOrDefault();
                }

                LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                MSLResponse arguments = new MMLParser(e.Arguments.ToString().Substring(roleName.Length + 3))
                                        .Parse();

                if (role.Name.Length > 20)
                {
                    await e.ErrorEmbed("Please keep role names below 20 letters.")
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                if (newRole == null)
                {
                    newRole = context.LevelRoles.Add(new LevelRole()
                    {
                        GuildId = (e.Guild.Id.ToDbLong()),
                        RoleId  = (role.Id.ToDbLong()),
                    }).Entity;
                }

                if (arguments.HasKey("automatic"))
                {
                    newRole.Automatic = arguments.GetBool("automatic");
                }

                if (arguments.HasKey("optable"))
                {
                    newRole.Optable = arguments.GetBool("optable");
                }

                if (arguments.HasKey("level-required"))
                {
                    newRole.RequiredLevel = arguments.GetInt("level-required");
                }

                if (arguments.HasKey("role-required"))
                {
                    long id = 0;
                    if (arguments.TryGet("role-required", out long l))
                    {
                        id = l;
                    }
                    else
                    {
                        var r = (await e.Guild.GetRolesAsync())
                                .Where(x => x.Name.ToLower() == arguments.GetString("role-required").ToLower())
                                .FirstOrDefault();

                        if (r != null)
                        {
                            id = r.Id.ToDbLong();
                        }
                    }

                    if (id != 0)
                    {
                        newRole.RequiredRole = id;
                    }
                }

                await context.SaveChangesAsync();

                Utils.Embed.SetTitle("⚙ Role Config")
                .SetColor(102, 117, 127)
                .SetDescription($"Updated {role.Name}!")
                .ToEmbed().QueueToChannel(e.Channel);
            }
        }
Пример #15
0
        /*public async Task ConfigRoleInteractiveAsync(EventContext e)
         *      {
         *              using (var context = new MikiContext())
         *              {
         *                      EmbedBuilder sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                              .SetDescription("Type out the role name you want to config")
         *                              .SetColor(138, 182, 239);
         *                      IDiscordMessage sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.GetChannel());
         *                      IDiscordMessage msg = null;
         *
         *                      while (true)
         *                      {
         *                              msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *                              if (msg.Content.Length < 20)
         *                              {
         *                                      break;
         *                              }
         *                              else
         *                              {
         *                                      await sourceMessage.EditAsync(new EditMessageArgs
         *                                      {
         *                                              embed = e.ErrorEmbed("That role name is way too long! Try again.")
         *                                                      .ToEmbed()
         *                                      });
         *                              }
         *                      }
         *
         *                      string roleName = msg.Content;
         *
         *                      List<IDiscordRole> rolesFound = await GetRolesByName(e.GetGuild(), roleName.ToLower());
         *                      IDiscordRole role = null;
         *
         *                      if(rolesFound.Count == 0)
         *                      {
         *                              // Hey, I couldn't find this role, Can I make a new one?
         *                              await sourceMessage.EditAsync(new EditMessageArgs
         *                              {
         *                                      embed = e.ErrorEmbed($"There's no role that is named `{roleName}`, Shall I create it? Y/N").ToEmbed()
         *                              });
         *
         *                              msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *                              if (msg.Content.ToLower()[0] != 'y')
         *                              {
         *                                      throw new RoleNullException();
         *                              }
         *
         *                              role = await e.GetGuild().CreateRoleAsync(new CreateRoleArgs
         *                              {
         *                                      Name = roleName,
         *                              });
         *                      }
         *                      else if (rolesFound.Count > 1)
         *                      {
         *                              string roleIds = string.Join("\n", rolesFound.Select(x => $"`{x.Name}`: {x.Id}"));
         *
         *                              if (roleIds.Length > 1024)
         *                              {
         *                                      roleIds = roleIds.Substring(0, 1024);
         *                              }
         *
         *                              sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                                              .SetDescription("I found multiple roles with that name, which one would you like? please enter the ID")
         *                                              .AddInlineField("Roles - Ids", roleIds)
         *                                              .SetColor(138, 182, 239);
         *
         *                              sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.GetChannel());
         *                              while(true)
         *                              {
         *                                      msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *                                      if (ulong.TryParse(msg.Content, out ulong id))
         *                                      {
         *                                              role = rolesFound.Where(x => x.Id == id)
         *                                                      .FirstOrDefault();
         *
         *                                              if (role != null)
         *                                              {
         *                                                      break;
         *                                              }
         *                                              else
         *                                              {
         *                                                      await sourceMessage.EditAsync(new EditMessageArgs {
         *                                                              embed = e.ErrorEmbed("I couldn't find that role id in the list. Try again!")
         *                                                              .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
         *                                                      });
         *                                              }
         *                                      }
         *                                      else
         *                                      {
         *                                              await sourceMessage.EditAsync(new EditMessageArgs
         *                                              {
         *                                                      embed = e.ErrorEmbed("I couldn't find that role. Try again!")
         *                                                      .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
         *                                              });
         *                                      }
         *                              }
         *                      }
         *                      else
         *                      {
         *                              role = rolesFound.FirstOrDefault();
         *                      }
         *
         *                      LevelRole newRole = await context.LevelRoles.FindAsync(e.GetGuild().Id.ToDbLong(), role.Id.ToDbLong());
         *                      if(newRole == null)
         *                      {
         *                              newRole = (await context.LevelRoles.AddAsync(new LevelRole()
         *                              {
         *                                      RoleId = role.Id.ToDbLong(),
         *                                      GuildId = e.GetGuild().Id.ToDbLong()
         *                              })).Entity;
         *                      }
         *
         *                      sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                              .SetDescription("Is there a role that is needed to get this role? Type out the role name, or `-` to skip")
         *                              .SetColor(138, 182, 239);
         *
         *                      sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.GetChannel());
         *
         *                      while (true)
         *                      {
         *                              msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *                              rolesFound = (await GetRolesByName(e.GetGuild(), msg.Content.ToLower()));
         *                              IDiscordRole parentRole = null;
         *
         *                              if (rolesFound.Count > 1)
         *                              {
         *                                      string roleIds = string.Join("\n", rolesFound.Select(x => $"`{x.Name}`: {x.Id}"));
         *
         *                                      if (roleIds.Length > 1024)
         *                                      {
         *                                              roleIds = roleIds.Substring(0, 1024);
         *                                      }
         *
         *                                      sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                                                      .SetDescription("I found multiple roles with that name, which one would you like? please enter the ID")
         *                                                      .AddInlineField("Roles - Ids", roleIds)
         *                                                      .SetColor(138, 182, 239);
         *
         *                                      sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.GetChannel());
         *                                      while (true)
         *                                      {
         *                                              msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *                                              if (ulong.TryParse(msg.Content, out ulong id))
         *                                              {
         *                                                      parentRole = rolesFound.Where(x => x.Id == id)
         *                                                              .FirstOrDefault();
         *
         *                                                      if (parentRole != null)
         *                                                      {
         *                                                              break;
         *                                                      }
         *                                                      else
         *                                                      {
         *                                                              await sourceMessage.EditAsync(new EditMessageArgs {
         *                                                                      embed = e.ErrorEmbed("I couldn't find that role id in the list. Try again!")
         *                                                                      .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
         *                                                              }) ;
         *                                                      }
         *                                              }
         *                                              else
         *                                              {
         *                                                      await sourceMessage.EditAsync(new EditMessageArgs
         *                                                      {
         *                                                              embed = e.ErrorEmbed("I couldn't find that role. Try again!")
         *                                                              .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
         *                                                      });
         *                                              }
         *                                      }
         *                              }
         *                              else
         *                              {
         *                                      parentRole = rolesFound.FirstOrDefault();
         *                              }
         *
         *                              if (parentRole != null || msg.Content == "-")
         *                              {
         *                                      newRole.RequiredRole = (long?)parentRole?.Id ?? 0;
         *                                      break;
         *                              }
         *
         *                              await sourceMessage.EditAsync(new EditMessageArgs
         *                              {
         *                                      embed = e.ErrorEmbed("I couldn't find that role. Try again!").ToEmbed()
         *                              });
         *                      }
         *
         *                      sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                              .SetDescription($"Is there a level requirement? type a number, if there is no requirement type 0")
         *                              .SetColor(138, 182, 239);
         *
         *                      sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.GetChannel());
         *
         *                      while (true)
         *                      {
         *                              msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *                              if (int.TryParse(msg.Content, out int r))
         *                              {
         *                                      if (r >= 0)
         *                                      {
         *                                              newRole.RequiredLevel = r;
         *                                              break;
         *                                      }
         *                                      else
         *                                      {
         *                                              await sourceMessage.EditAsync(new EditMessageArgs
         *                                              {
         *                                                      embed = sourceEmbed.SetDescription($"Please pick a number above 0. Try again")
         *                                                              .ToEmbed()
         *                                              });
         *                                      }
         *                              }
         *                              else
         *                              {
         *                                      await sourceMessage.EditAsync(new EditMessageArgs
         *                                      {
         *                                              embed = sourceEmbed.SetDescription($"Are you sure `{msg.Content}` is a number? Try again").ToEmbed()
         *                                      });
         *                              }
         *                      }
         *
         *                      sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                              .SetDescription($"Should I give them when the user level ups? type `yes`, otherwise it will be considered as no")
         *                              .SetColor(138, 182, 239);
         *
         *                      sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.GetChannel());
         *
         *                      msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *                      if (msg == null)
         *                      {
         *                              return;
         *                      }
         *
         *                      newRole.Automatic = msg.Content.ToLower()[0] == 'y';
         *
         *                      sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                              .SetDescription($"Should users be able to opt in? type `yes`, otherwise it will be considered as no")
         *                              .SetColor(138, 182, 239);
         *
         *                      sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.GetChannel());
         *
         *                      msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *                      newRole.Optable = msg.Content.ToLower()[0] == 'y';
         *
         *                      if (newRole.Optable)
         *                      {
         *                              sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                                      .SetDescription($"Do you want the user to pay mekos for the role? Enter any amount. Enter 0 to keep the role free.")
         *                                      .SetColor(138, 182, 239);
         *
         *                              sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.GetChannel());
         *
         *                              while (true)
         *                              {
         *                                      msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *              if (msg == null)
         *                                      {
         *                                              return;
         *                                      }
         *
         *                                      if (int.TryParse(msg.Content, out int r))
         *                                      {
         *                                              if (r >= 0)
         *                                              {
         *                                                      newRole.Price = r;
         *                                                      break;
         *                                              }
         *                                              else
         *                                              {
         *                                                      await sourceMessage.EditAsync(new EditMessageArgs
         *                                                      {
         *                                                              embed = e.ErrorEmbed($"Please pick a number above 0. Try again").ToEmbed()
         *                                                      });
         *                                              }
         *                                      }
         *                                      else
         *                                      {
         *                                              await sourceMessage.EditAsync(new EditMessageArgs
         *                                              {
         *                                                      embed = e.ErrorEmbed($"Not quite sure if this is a number 🤔").ToEmbed()
         *                                              });
         *                                      }
         *                              }
         *                      }
         *
         *                      await context.SaveChangesAsync();
         *                      Utils.Embed.SetTitle("⚙ Role Config")
         *                              .SetColor(102, 117, 127)
         *                              .SetDescription($"Updated {role.Name}!")
         *                              .ToEmbed().QueueToChannelAsync(e.GetChannel());
         *              }
         *      }*/
        public async Task ConfigRoleQuickAsync(IContext e)
        {
            var context = e.GetService <MikiDbContext>();

            if (!e.GetArgumentPack().Take(out string roleName))
            {
                await e.ErrorEmbed("Expected a role name")
                .ToEmbed().QueueAsync(e, e.GetChannel());

                return;
            }

            IDiscordRole role = null;

            if (ulong.TryParse(roleName, out ulong s))
            {
                role = await e.GetGuild().GetRoleAsync(s);
            }
            else
            {
                role = (await GetRolesByNameAsync(e.GetGuild(), roleName)).FirstOrDefault();
            }

            var newRole = await context.LevelRoles.FindAsync((long)e.GetGuild().Id, (long)role.Id);

            var arguments = new MMLParser(e.GetArgumentPack().Pack.TakeAll()).Parse();

            if (role.Name.Length > 20)
            {
                await e.ErrorEmbed("Please keep role names below 20 letters.")
                .ToEmbed()
                .QueueAsync(e, e.GetChannel());

                return;
            }

            if (newRole == null)
            {
                newRole = context.LevelRoles.Add(new LevelRole()
                {
                    GuildId = (e.GetGuild().Id.ToDbLong()),
                    RoleId  = (role.Id.ToDbLong()),
                }).Entity;
            }

            if (arguments.HasKey("automatic"))
            {
                newRole.Automatic = arguments.GetBool("automatic");
            }

            if (arguments.HasKey("optable"))
            {
                newRole.Optable = arguments.GetBool("optable");
            }

            if (arguments.HasKey("level-required"))
            {
                newRole.RequiredLevel = arguments.GetInt("level-required");
            }

            if (arguments.HasKey("price"))
            {
                newRole.Price = arguments.GetInt("price");
                if (newRole.Price < 0)
                {
                    throw new ArgumentLessThanZeroException();
                }
            }

            if (arguments.HasKey("role-required"))
            {
                long id = 0;
                if (arguments.TryGet("role-required", out long l))
                {
                    id = l;
                }
                else
                {
                    var r = (await e.GetGuild().GetRolesAsync())
                            .Where(x => x.Name.ToLower() == arguments.GetString("role-required").ToLower())
                            .FirstOrDefault();

                    if (r != null)
                    {
                        id = r.Id.ToDbLong();
                    }
                }

                if (id != 0)
                {
                    newRole.RequiredRole = id;
                }
            }

            await context.SaveChangesAsync();

            await new EmbedBuilder()
            .SetTitle("⚙ Role Config")
            .SetColor(102, 117, 127)
            .SetDescription($"Updated {role.Name}!")
            .ToEmbed().QueueAsync(e, e.GetChannel());
        }
Пример #16
0
        public void LoadAchievements()
        {
            AchievementDataContainer AchievementAchievements = new AchievementDataContainer(x =>
            {
                x.Name         = "achievements";
                x.Achievements = new List <BaseAchievement>()
                {
                    new AchievementAchievement()
                    {
                        Name             = "Underachiever",
                        Icon             = "✏️",
                        CheckAchievement = async(p) =>
                        {
                            await Task.Yield();
                            return(p.count > 3);
                        },
                    },
                    new AchievementAchievement()
                    {
                        Name             = "Achiever",
                        Icon             = "🖊️",
                        CheckAchievement = async(p) =>
                        {
                            await Task.Yield();
                            return(p.count > 5);
                        },
                    },
                    new AchievementAchievement()
                    {
                        Name             = "Overachiever",
                        Icon             = "🖋️",
                        CheckAchievement = async(p) =>
                        {
                            return(p.count > 12);
                        },
                    }
                };
            });

            AchievementDataContainer InfoAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "info";
                x.Achievements = new List <BaseAchievement>()
                {
                    new CommandAchievement()
                    {
                        Name = "Informed",
                        Icon = "📚",

                        CheckCommand = async(p) =>
                        {
                            await Task.Yield();
                            return(p.command.Name.ToLower() == "info");
                        },
                        Points = 5
                    }
                };
            });
            AchievementDataContainer LonelyAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "fa";
                x.Achievements = new List <BaseAchievement>()
                {
                    new CommandAchievement()
                    {
                        Name = "Lonely",
                        Icon = "😭",

                        CheckCommand = async(p) =>
                        {
                            await Task.Yield();
                            return(p.command.Name.ToLower() == "marry" && p.message.MentionedUserIds.First() == p.message.Author.Id);
                        },
                        Points = 5,
                    }
                };
            });
            AchievementDataContainer ChefAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "creator";
                x.Achievements = new List <BaseAchievement>()
                {
                    new CommandAchievement()
                    {
                        Name         = "Chef",
                        Icon         = "📝",
                        CheckCommand = async(p) =>
                        {
                            await Task.Yield();
                            return(p.command.Name.ToLower() == "createpasta");
                        },
                        Points = 5,
                    }
                };
            });
            AchievementDataContainer NoPermissionAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "noperms";
                x.Achievements = new List <BaseAchievement>()
                {
                    new CommandAchievement()
                    {
                        Name         = "NO! Don't touch that!",
                        Icon         = "😱",
                        CheckCommand = async(p) =>
                        {
                            await Task.Yield();
                            return(EventSystem.Instance.CommandHandler.GetUserAccessibility(p.message) < p.command.Accessibility);
                        },
                        Points = 0
                    }
                };
            });

            AchievementDataContainer LevelAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "levelachievements";
                x.Achievements = new List <BaseAchievement>()
                {
                    new LevelAchievement()
                    {
                        Name       = "Novice",
                        Icon       = "🎟",
                        CheckLevel = async(p) => p.level >= 3,
                        Points     = 5,
                    },
                    new LevelAchievement()
                    {
                        Name       = "IntermedMiki.Frameworkte",
                        Icon       = "🎫",
                        CheckLevel = async(p) => p.level >= 5,
                        Points     = 5,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Experienced",
                        Icon       = "🏵",
                        CheckLevel = async(p) => p.level >= 10,
                        Points     = 5,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Expert",
                        Icon       = "🎗",
                        CheckLevel = async(p) => p.level >= 20,
                        Points     = 5,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Sage",
                        Icon       = "🎖",
                        CheckLevel = async(p) => p.level >= 30,
                        Points     = 5,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Master",
                        Icon       = "🏅",
                        CheckLevel = async(p) => p.level >= 50,
                        Points     = 5,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Legend",
                        Icon       = "💮",
                        CheckLevel = async(p) => p.level >= 100,
                        Points     = 5,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Epic",
                        Icon       = "🌸",
                        CheckLevel = async(p) => p.level >= 150,
                        Points     = 5,
                    }
                };
            });

            AchievementDataContainer FrogAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "frog";
                x.Achievements = new List <BaseAchievement>()
                {
                    new MessageAchievement()
                    {
                        Name         = "Oh shit! Waddup",
                        Icon         = "🐸",
                        CheckMessage = async(p) => p.message.Content.Contains("dat boi"),
                        Points       = 5
                    }
                };
            });
            AchievementDataContainer LennyAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "lenny";
                x.Achievements = new List <BaseAchievement>()
                {
                    new MessageAchievement()
                    {
                        Name         = "Lenny",
                        Icon         = "😏",
                        CheckMessage = async(p) =>
                        {
                            return(p.message.Content.Contains("( ͡° ͜ʖ ͡°)"));
                        },
                        Points = 5
                    }
                };
            });
            AchievementDataContainer PoiAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "poi";
                x.Achievements = new List <BaseAchievement>
                {
                    new MessageAchievement()
                    {
                        Name         = "Shipgirl",
                        Icon         = "⛵",
                        CheckMessage = async(p) =>
                        {
                            return(p.message.Content.Split(' ').Contains("poi"));
                        },
                        Points = 5,
                    }
                };
            });
            AchievementDataContainer LuckyAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "goodluck";
                x.Achievements = new List <BaseAchievement>()
                {
                    new MessageAchievement()
                    {
                        Name         = "Lucky",
                        Icon         = "🍀",
                        CheckMessage = async(p) =>
                        {
                            return(MikiRandom.Next(0, 10000000) == 5033943);
                        },
                        Points = 25
                    }
                };
            });

            AchievementDataContainer MekosAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "meko";
                x.Achievements = new List <BaseAchievement>()
                {
                    new TransactionAchievement()
                    {
                        Name             = "Loaded",
                        Icon             = "💵",
                        CheckTransaction = async(p) =>
                        {
                            return(p.receiver.Currency > 10000);
                        },
                        Points = 5
                    },
                    new TransactionAchievement()
                    {
                        Name             = "Rich",
                        Icon             = "💸",
                        CheckTransaction = async(p) =>
                        {
                            return(p.receiver.Currency > 50000);
                        },
                        Points = 5
                    },
                    new TransactionAchievement()
                    {
                        Name             = "Minted",
                        Icon             = "💲",
                        CheckTransaction = async(p) =>
                        {
                            return(p.receiver.Currency > 125000);
                        },
                        Points = 10
                    },
                    new TransactionAchievement()
                    {
                        Name             = "Millionaire",
                        Icon             = "🤑",
                        CheckTransaction = async(p) =>
                        {
                            return(p.receiver.Currency > 1000000);
                        },
                        Points = 25
                    }
                };
            });

            AchievementDataContainer DiscordBotsOrgAchievement = new AchievementDataContainer()
            {
                Name         = "supporter",
                Achievements = new List <BaseAchievement>()
                {
                    new BaseAchievement()
                    {
                        Name   = "Supporter",
                        Icon   = "",
                        Points = 10,
                    }
                }
            };

            #region Achievement Achievements

            AchievementManager.Instance.OnAchievementUnlocked += async(pa) =>
            {
                if (await IsEnabled(pa.discordChannel.Id))
                {
                    await AchievementAchievements.CheckAsync(pa);
                }
            };

            #endregion Achievement Achievements

            #region Command Achievements

            AchievementManager.Instance.OnCommandUsed += InfoAchievement.CheckAsync;
            AchievementManager.Instance.OnCommandUsed += LonelyAchievement.CheckAsync;
            AchievementManager.Instance.OnCommandUsed += ChefAchievement.CheckAsync;
            AchievementManager.Instance.OnCommandUsed += NoPermissionAchievement.CheckAsync;
            #endregion Command Achievements

            #region Level Achievements
            AchievementManager.Instance.OnLevelGained += LevelAchievement.CheckAsync;

            #endregion Level Achievements

            #region Misc Achievements

            new AchievementDataContainer(x =>
            {
                x.Name         = "badluck";
                x.Achievements = new List <BaseAchievement>()
                {
                    new BaseAchievement()
                    {
                        Name   = "Unlucky",
                        Icon   = "🎲",
                        Points = 5
                    }
                };
            });

            #endregion Misc Achievements

            #region User Update Achievements (don't disable these)

            new AchievementDataContainer(x =>
            {
                x.Name         = "contributor";
                x.Achievements = new List <BaseAchievement>()
                {
                    new UserUpdateAchievement()
                    {
                        Name = "Contributor",
                        Icon = "⭐",

                        CheckUserUpdate = async(p) =>
                        {
                            if (p.userNew.Guild.Id == 160067691783127041)
                            {
                                IDiscordRole role = p.userNew.Guild.Roles.Find(r => { return(r.Name == "Contributors"); });

                                if (p.userNew.RoleIds.Contains(role.Id))
                                {
                                    return(true);
                                }
                            }
                            return(false);
                        }
                    }
                };
            });
            new AchievementDataContainer(x =>
            {
                x.Name         = "developer";
                x.Achievements = new List <BaseAchievement>()
                {
                    new UserUpdateAchievement()
                    {
                        Name            = "Developer",
                        Icon            = "🌟",
                        CheckUserUpdate = async(p) =>
                        {
                            if (p.userNew.Guild.Id == 160067691783127041)
                            {
                                IDiscordRole role = p.userNew.Guild.Roles.Find(r => { return(r.Name == "Developer"); });

                                if (p.userNew.RoleIds.Contains(role.Id))
                                {
                                    return(true);
                                }
                            }
                            return(false);
                        }
                    }
                };
            });
            new AchievementDataContainer(x =>
            {
                x.Name         = "glitch";
                x.Achievements = new List <BaseAchievement>()
                {
                    new UserUpdateAchievement()
                    {
                        Name            = "Glitch",
                        Icon            = "👾",
                        CheckUserUpdate = async(p) =>
                        {
                            return(false);
                        }
                    }
                };
            });
            new AchievementDataContainer(x =>
            {
                x.Name         = "donator";
                x.Achievements = new List <BaseAchievement>()
                {
                    new UserUpdateAchievement()
                    {
                        Name            = "Donator",
                        Icon            = "💖",
                        CheckUserUpdate = async(p) =>
                        {
                            if (p.discordUser.Guild.Id == 160067691783127041)
                            {
                                IDiscordRole role = p.userNew.Guild.Roles.Find(r => { return(r.Name == "Donators"); });

                                if (p.userNew.RoleIds.Contains(role.Id))
                                {
                                    return(true);
                                }
                            }
                            return(false);
                        },
                        Points = 0,
                    }
                };
            });

            #endregion User Update Achievements (don't disable these)

            #region Transaction Achievements

            AchievementManager.Instance.OnTransaction += MekosAchievement.CheckAsync;

            #endregion Transaction Achievements
        }
Пример #17
0
        public async Task IAmAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                string roleName = e.Arguments.ToString();

                List <IDiscordRole> roles = await GetRolesByName(e.Guild, roleName);

                IDiscordRole role = null;

                if (roles.Count > 1)
                {
                    List <LevelRole> levelRoles = await context.LevelRoles.Where(x => x.GuildId == (long)e.Guild.Id).ToListAsync();

                    if (levelRoles.Where(x => x.Role.Name.ToLower() == roleName.ToLower()).Count() > 1)
                    {
                        e.ErrorEmbed("two roles configured have the same name.")
                        .ToEmbed().QueueToChannel(e.Channel);
                        return;
                    }
                    else
                    {
                        role = levelRoles.Where(x => x.Role.Name.ToLower() == roleName.ToLower()).FirstOrDefault().Role;
                    }
                }
                else
                {
                    role = roles.FirstOrDefault();
                }

                if (role == null)
                {
                    e.ErrorEmbedResource("error_role_null")
                    .ToEmbed().QueueToChannel(e.Channel);
                    return;
                }

                IDiscordGuildUser author = await e.Guild.GetUserAsync(e.Author.Id);

                if (author.RoleIds.Contains(role.Id))
                {
                    e.ErrorEmbed(e.GetResource("error_role_already_given"))
                    .ToEmbed().QueueToChannel(e.Channel);
                    return;
                }

                LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                User user = (await context.Users.FindAsync(e.Author.Id.ToDbLong()));

                IDiscordGuildUser discordUser = await e.Guild.GetUserAsync(user.Id.FromDbLong());

                LocalExperience localUser = await LocalExperience.GetAsync(context, e.Guild.Id.ToDbLong(), discordUser);

                if (!newRole?.Optable ?? false)
                {
                    await e.ErrorEmbed(e.GetResource("error_role_forbidden"))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                int level = User.CalculateLevel(localUser.Experience);

                if (newRole.RequiredLevel > level)
                {
                    await e.ErrorEmbed(e.GetResource("error_role_level_low", newRole.RequiredLevel - level))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                if (newRole.RequiredRole != 0 && !discordUser.RoleIds.Contains(newRole.RequiredRole.FromDbLong()))
                {
                    await e.ErrorEmbed(
                        e.GetResource(
                            "error_role_required",
                            $"**{(await e.Guild.GetRoleAsync(newRole.RequiredRole.FromDbLong())).Name}**"
                            )).ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                if (newRole.Price > 0)
                {
                    if (user.Currency >= newRole.Price)
                    {
                        await e.Channel.SendMessageAsync($"Getting this role costs you {newRole.Price} mekos! type `yes` to proceed.");

                        IDiscordMessage m = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                        if (m.Content.ToLower()[0] == 'y')
                        {
                            await user.AddCurrencyAsync(-newRole.Price);

                            await context.SaveChangesAsync();
                        }
                        else
                        {
                            await e.ErrorEmbed("Purchase Cancelled")
                            .ToEmbed().SendToChannel(e.Channel);

                            return;
                        }
                    }
                    else
                    {
                        await e.ErrorEmbed(e.GetResource("user_error_insufficient_mekos"))
                        .ToEmbed().SendToChannel(e.Channel);

                        return;
                    }
                }

                await author.AddRoleAsync(newRole.Role);

                Utils.Embed.SetTitle("I AM")
                .SetColor(128, 255, 128)
                .SetDescription($"You're a(n) {role.Name} now!")
                .ToEmbed().QueueToChannel(e.Channel);
            }
        }
Пример #18
0
 public async Task AddRoleAsync(IDiscordRole role)
 {
     await client.ApiClient.AddGuildMemberRoleAsync(GuildId, Id, role.Id);
 }
Пример #19
0
 public async Task AddRoleAsync(IDiscordRole role)
 {
     await(user as IGuildUser).AddRolesAsync(new List <IRole> {
         (role as IProxy <IRole>).ToNativeObject()
     });
 }
Пример #20
0
        public IDiscordRole GetRoleByName(IDiscordGuild guild, string roleName)
        {
            IDiscordRole role = guild.Roles.Where(x => x.Name.ToLower() == roleName.ToLower()).FirstOrDefault();

            return(role);
        }
Пример #21
0
 public ValueTask AddRoleAsync(IDiscordRole role)
 {
     return(Client.AddGuildMemberRoleAsync(GuildId, Id, role.Id));
 }
Пример #22
0
 public ValueTask OnGuildRoleDeleted(ulong guildId, IDiscordRole role)
 {
     return(default);
Пример #23
0
 public async Task RemoveRoleAsync(IDiscordRole role)
 => await _client.RemoveGuildMemberRoleAsync(GuildId, Id, role.Id);
Пример #24
0
        public async Task PermissionsAsync(IDiscordRole role)
        {
            var allowedPermissions = await _permissionManager.GetAllowedRolePermissionAsync(role.Id, _guild.Id);

            await PermissionsAsync("Role", role, allowedPermissions);
        }
Пример #25
0
        public async Task IAmNotAsync(EventContext e)
        {
            string roleName = e.Arguments.ToString();

            using (var context = new MikiContext())
            {
                List <IDiscordRole> roles = await GetRolesByName(e.Guild, roleName);

                IDiscordRole role = null;

                if (roles.Count > 1)
                {
                    List <LevelRole> levelRoles = await context.LevelRoles.Where(x => x.GuildId == (long)e.Guild.Id).ToListAsync();

                    if (levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).Count() > 1)
                    {
                        await e.ErrorEmbed("two roles configured have the same name.")
                        .ToEmbed().QueueToChannelAsync(e.Channel);

                        return;
                    }
                    else
                    {
                        role = levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).FirstOrDefault().GetRoleAsync().Result;
                    }
                }
                else
                {
                    role = roles.FirstOrDefault();
                }

                if (role == null)
                {
                    await e.ErrorEmbed(e.Locale.GetString("error_role_null"))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                IDiscordGuildUser author = await e.Guild.GetMemberAsync(e.Author.Id);

                IDiscordGuildUser me = await e.Guild.GetSelfAsync();

                if (!author.RoleIds.Contains(role.Id))
                {
                    await e.ErrorEmbed(e.Locale.GetString("error_role_forbidden"))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                User user = await context.Users.FindAsync(e.Author.Id.ToDbLong());

                if (!await me.HasPermissionsAsync(GuildPermission.ManageRoles))
                {
                    await e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed()
                    .QueueToChannelAsync(e.Channel);

                    return;
                }

                if (role.Position >= await me.GetHierarchyAsync())
                {
                    await e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed()
                    .QueueToChannelAsync(e.Channel);

                    return;
                }

                await author.RemoveRoleAsync(role);

                await new EmbedBuilder()
                .SetTitle("I AM NOT")
                .SetColor(255, 128, 128)
                .SetDescription($"You're no longer a(n) {role.Name}!")
                .ToEmbed().QueueToChannelAsync(e.Channel);
            }
        }
Пример #26
0
        public async Task ConfigRoleInteractiveAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                IDiscordEmbed sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                                            .SetDescription("Type out the role name you want to config")
                                            .SetColor(138, 182, 239);
                IDiscordMessage sourceMessage = await sourceEmbed.SendToChannel(e.Channel);

                IDiscordMessage msg = null;

                while (true)
                {
                    msg = await EventSystem.Instance.ListenNextMessageAsync(e.Channel.Id, e.Author.Id);

                    if (msg.Content.Length < 20)
                    {
                        break;
                    }

                    sourceMessage.Modify("", e.ErrorEmbed("That role name is way too long! Try again."));
                }

                IDiscordRole role    = GetRoleByName(e.Guild, msg.Content.ToLower());
                LevelRole    newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                if (newRole == null)
                {
                    newRole = (await context.LevelRoles.AddAsync(new LevelRole()
                    {
                        RoleId = role.Id.ToDbLong(),
                        GuildId = e.Guild.Id.ToDbLong()
                    })).Entity;
                }

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription("Is there a role that is needed to get this role? Type out the role name, or `-` to skip")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.SendToChannel(e.Channel);


                while (true)
                {
                    msg = await EventSystem.Instance.ListenNextMessageAsync(e.Channel.Id, e.Author.Id);

                    IDiscordRole parentRole = GetRoleByName(e.Guild, msg.Content.ToLower());

                    if (parentRole != null || msg.Content == "-")
                    {
                        newRole.RequiredRole = (long?)parentRole?.Id ?? 0;
                        break;
                    }

                    sourceMessage.Modify(null, e.ErrorEmbed("I couldn't find that role. Try again!"));
                }

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription($"Is there a level requirement? type a number, if there is no requirement type 0")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.SendToChannel(e.Channel);

                while (true)
                {
                    msg = await EventSystem.Instance.ListenNextMessageAsync(e.Channel.Id, e.Author.Id);

                    if (int.TryParse(msg.Content, out int r))
                    {
                        if (r >= 0)
                        {
                            newRole.RequiredLevel = r;
                            break;
                        }
                        else
                        {
                            sourceMessage.Modify(null, sourceEmbed.SetDescription($"Please pick a number above 0. Try again"));
                        }
                    }
                    else
                    {
                        sourceMessage.Modify(null, sourceEmbed.SetDescription($"Are you sure `{msg.Content}` is a number? Try again"));
                    }
                }

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription($"Should I give them when the user level ups? type `yes`, otherwise it will be considered as no")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.SendToChannel(e.Channel);

                msg = await EventSystem.Instance.ListenNextMessageAsync(e.Channel.Id, e.Author.Id);

                if (msg == null)
                {
                    return;
                }

                newRole.Automatic = msg.Content.ToLower()[0] == 'y';

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription($"Should users be able to opt in? type `yes`, otherwise it will be considered as no")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.SendToChannel(e.Channel);

                msg = await EventSystem.Instance.ListenNextMessageAsync(e.Channel.Id, e.Author.Id);

                newRole.Optable = msg.Content.ToLower()[0] == 'y';

                if (newRole.Optable)
                {
                    sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                                  .SetDescription($"Do you want the user to pay mekos for the role? Enter any amount. Enter 0 to keep the role free.")
                                  .SetColor(138, 182, 239);

                    sourceMessage = await sourceEmbed.SendToChannel(e.Channel);

                    while (true)
                    {
                        msg = await EventSystem.Instance.ListenNextMessageAsync(e.Channel.Id, e.Author.Id);

                        if (msg == null)
                        {
                            return;
                        }

                        if (int.TryParse(msg.Content, out int r))
                        {
                            if (r >= 0)
                            {
                                newRole.Price = r;
                                break;
                            }
                            else
                            {
                                sourceMessage.Modify(null, e.ErrorEmbed($"Please pick a number above 0. Try again"));
                            }
                        }
                        else
                        {
                            sourceMessage.Modify(null, e.ErrorEmbed($"Not quite sure if this is a number 🤔"));
                        }
                    }
                }

                await context.SaveChangesAsync();

                Utils.Embed.SetTitle("⚙ Role Config")
                .SetColor(102, 117, 127)
                .SetDescription($"Updated {role.Name}!")
                .QueueToChannel(e.Channel);
            }
        }
Пример #27
0
        public async Task ConfigRoleInteractiveAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                EmbedBuilder sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                                           .SetDescription("Type out the role name you want to config")
                                           .SetColor(138, 182, 239);
                IDiscordMessage sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                IDiscordMessage msg = null;

                while (true)
                {
                    msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                    if (msg.Content.Length < 20)
                    {
                        break;
                    }
                    else
                    {
                        await sourceMessage.EditAsync(new EditMessageArgs
                        {
                            embed = e.ErrorEmbed("That role name is way too long! Try again.")
                                    .ToEmbed()
                        });
                    }
                }

                string roleName = msg.Content;

                List <IDiscordRole> rolesFound = await GetRolesByName(e.Guild, roleName.ToLower());

                IDiscordRole role = null;

                if (rolesFound.Count == 0)
                {
                    // Hey, I couldn't find this role, Can I make a new one?
                    await sourceMessage.EditAsync(new EditMessageArgs
                    {
                        embed = e.ErrorEmbed($"There's no role that is named `{roleName}`, Shall I create it? Y/N").ToEmbed()
                    });

                    msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                    if (msg.Content.ToLower()[0] != 'y')
                    {
                        throw new RoleNullException();
                    }

                    role = await e.Guild.CreateRoleAsync(new CreateRoleArgs
                    {
                        Name = roleName,
                    });
                }
                else if (rolesFound.Count > 1)
                {
                    string roleIds = string.Join("\n", rolesFound.Select(x => $"`{x.Name}`: {x.Id}"));

                    if (roleIds.Length > 1024)
                    {
                        roleIds = roleIds.Substring(0, 1024);
                    }

                    sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                                  .SetDescription("I found multiple roles with that name, which one would you like? please enter the ID")
                                  .AddInlineField("Roles - Ids", roleIds)
                                  .SetColor(138, 182, 239);

                    sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                    while (true)
                    {
                        msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                        if (ulong.TryParse(msg.Content, out ulong id))
                        {
                            role = rolesFound.Where(x => x.Id == id)
                                   .FirstOrDefault();

                            if (role != null)
                            {
                                break;
                            }
                            else
                            {
                                await sourceMessage.EditAsync(new EditMessageArgs {
                                    embed = e.ErrorEmbed("I couldn't find that role id in the list. Try again!")
                                            .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
                                });
                            }
                        }
                        else
                        {
                            await sourceMessage.EditAsync(new EditMessageArgs
                            {
                                embed = e.ErrorEmbed("I couldn't find that role. Try again!")
                                        .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
                            });
                        }
                    }
                }
                else
                {
                    role = rolesFound.FirstOrDefault();
                }

                LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                if (newRole == null)
                {
                    newRole = (await context.LevelRoles.AddAsync(new LevelRole()
                    {
                        RoleId = role.Id.ToDbLong(),
                        GuildId = e.Guild.Id.ToDbLong()
                    })).Entity;
                }

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription("Is there a role that is needed to get this role? Type out the role name, or `-` to skip")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                while (true)
                {
                    msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                    rolesFound = (await GetRolesByName(e.Guild, msg.Content.ToLower()));
                    IDiscordRole parentRole = null;

                    if (rolesFound.Count > 1)
                    {
                        string roleIds = string.Join("\n", rolesFound.Select(x => $"`{x.Name}`: {x.Id}"));

                        if (roleIds.Length > 1024)
                        {
                            roleIds = roleIds.Substring(0, 1024);
                        }

                        sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                                      .SetDescription("I found multiple roles with that name, which one would you like? please enter the ID")
                                      .AddInlineField("Roles - Ids", roleIds)
                                      .SetColor(138, 182, 239);

                        sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                        while (true)
                        {
                            msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                            if (ulong.TryParse(msg.Content, out ulong id))
                            {
                                parentRole = rolesFound.Where(x => x.Id == id)
                                             .FirstOrDefault();

                                if (parentRole != null)
                                {
                                    break;
                                }
                                else
                                {
                                    await sourceMessage.EditAsync(new EditMessageArgs {
                                        embed = e.ErrorEmbed("I couldn't find that role id in the list. Try again!")
                                                .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
                                    });
                                }
                            }
                            else
                            {
                                await sourceMessage.EditAsync(new EditMessageArgs
                                {
                                    embed = e.ErrorEmbed("I couldn't find that role. Try again!")
                                            .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
                                });
                            }
                        }
                    }
                    else
                    {
                        parentRole = rolesFound.FirstOrDefault();
                    }

                    if (parentRole != null || msg.Content == "-")
                    {
                        newRole.RequiredRole = (long?)parentRole?.Id ?? 0;
                        break;
                    }

                    await sourceMessage.EditAsync(new EditMessageArgs
                    {
                        embed = e.ErrorEmbed("I couldn't find that role. Try again!").ToEmbed()
                    });
                }

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription($"Is there a level requirement? type a number, if there is no requirement type 0")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                while (true)
                {
                    msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                    if (int.TryParse(msg.Content, out int r))
                    {
                        if (r >= 0)
                        {
                            newRole.RequiredLevel = r;
                            break;
                        }
                        else
                        {
                            await sourceMessage.EditAsync(new EditMessageArgs
                            {
                                embed = sourceEmbed.SetDescription($"Please pick a number above 0. Try again")
                                        .ToEmbed()
                            });
                        }
                    }
                    else
                    {
                        await sourceMessage.EditAsync(new EditMessageArgs
                        {
                            embed = sourceEmbed.SetDescription($"Are you sure `{msg.Content}` is a number? Try again").ToEmbed()
                        });
                    }
                }

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription($"Should I give them when the user level ups? type `yes`, otherwise it will be considered as no")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                if (msg == null)
                {
                    return;
                }

                newRole.Automatic = msg.Content.ToLower()[0] == 'y';

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription($"Should users be able to opt in? type `yes`, otherwise it will be considered as no")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                newRole.Optable = msg.Content.ToLower()[0] == 'y';

                if (newRole.Optable)
                {
                    sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                                  .SetDescription($"Do you want the user to pay mekos for the role? Enter any amount. Enter 0 to keep the role free.")
                                  .SetColor(138, 182, 239);

                    sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                    while (true)
                    {
                        msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                        if (msg == null)
                        {
                            return;
                        }

                        if (int.TryParse(msg.Content, out int r))
                        {
                            if (r >= 0)
                            {
                                newRole.Price = r;
                                break;
                            }
                            else
                            {
                                await sourceMessage.EditAsync(new EditMessageArgs
                                {
                                    embed = e.ErrorEmbed($"Please pick a number above 0. Try again").ToEmbed()
                                });
                            }
                        }
                        else
                        {
                            await sourceMessage.EditAsync(new EditMessageArgs
                            {
                                embed = e.ErrorEmbed($"Not quite sure if this is a number 🤔").ToEmbed()
                            });
                        }
                    }
                }

                await context.SaveChangesAsync();

                Utils.Embed.SetTitle("⚙ Role Config")
                .SetColor(102, 117, 127)
                .SetDescription($"Updated {role.Name}!")
                .ToEmbed().QueueToChannel(e.Channel);
            }
        }
Пример #28
0
        public async Task IAmAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                string roleName = e.Arguments.ToString();

                List <IDiscordRole> roles = await GetRolesByName(e.Guild, roleName);

                IDiscordRole role = null;

                // checking if the role has a duplicate name.
                if (roles.Count > 1)
                {
                    List <LevelRole> levelRoles = await context.LevelRoles.Where(x => x.GuildId == (long)e.Guild.Id).ToListAsync();

                    if (levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).Count() > 1)
                    {
                        await e.ErrorEmbed("two roles configured have the same name.")
                        .ToEmbed().QueueToChannelAsync(e.Channel);

                        return;
                    }
                    else
                    {
                        role = levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).FirstOrDefault().GetRoleAsync().Result;
                    }
                }
                else
                {
                    role = roles.FirstOrDefault();
                }

                // checking if the role is null
                if (role == null)
                {
                    await e.ErrorEmbedResource("error_role_null")
                    .ToEmbed().QueueToChannelAsync(e.Channel);

                    return;
                }

                IDiscordGuildUser author = await e.Guild.GetMemberAsync(e.Author.Id);

                if (author.RoleIds.Contains(role.Id))
                {
                    await e.ErrorEmbed(e.Locale.GetString("error_role_already_given"))
                    .ToEmbed().QueueToChannelAsync(e.Channel);

                    return;
                }

                LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                IDiscordRole discordRole = await newRole.GetRoleAsync();

                User user = (await context.Users.FindAsync(e.Author.Id.ToDbLong()));

                IDiscordGuildUser discordUser = await e.Guild.GetMemberAsync(user.Id.FromDbLong());

                LocalExperience localUser = await LocalExperience.GetAsync(context, e.Guild.Id.ToDbLong(), discordUser.Id.ToDbLong(), discordUser.Username);

                if (!newRole?.Optable ?? false)
                {
                    await e.ErrorEmbed(e.Locale.GetString("error_role_forbidden"))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                int level = User.CalculateLevel(localUser.Experience);

                if (newRole.RequiredLevel > level)
                {
                    await e.ErrorEmbed(e.Locale.GetString("error_role_level_low", newRole.RequiredLevel - level))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                if (newRole.RequiredRole != 0 && !discordUser.RoleIds.Contains(newRole.RequiredRole.FromDbLong()))
                {
                    var requiredRole = await e.Guild.GetRoleAsync(newRole.RequiredRole.FromDbLong());

                    await e.ErrorEmbed(
                        e.Locale.GetString(
                            "error_role_required", $"**{requiredRole.Name}**"
                            )
                        ).ToEmbed().QueueToChannelAsync(e.Channel);

                    return;
                }

                if (newRole.Price > 0)
                {
                    if (user.Currency >= newRole.Price)
                    {
                        user.RemoveCurrency(newRole.Price);
                        await context.SaveChangesAsync();
                    }
                    else
                    {
                        await e.ErrorEmbed(e.Locale.GetString("user_error_insufficient_mekos"))
                        .ToEmbed().SendToChannel(e.Channel);

                        return;
                    }
                }

                var me = await e.Guild.GetSelfAsync();

                if (!await me.HasPermissionsAsync(GuildPermission.ManageRoles))
                {
                    await e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed()
                    .QueueToChannelAsync(e.Channel);

                    return;
                }

                if (discordRole.Position >= await me.GetHierarchyAsync())
                {
                    await e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed()
                    .QueueToChannelAsync(e.Channel);

                    return;
                }

                await author.AddRoleAsync(discordRole);

                await new EmbedBuilder()
                .SetTitle("I AM")
                .SetColor(128, 255, 128)
                .SetDescription($"You're a(n) {role.Name} now!")
                .ToEmbed().QueueToChannelAsync(e.Channel);
            }
        }
 public ValueTask OnGuildRoleDeleted(ulong guildId, IDiscordRole role)
 {
     return(_eventManager.CallAsync(new GuildRoleDeleteEvent(guildId, role)));
 }
Пример #30
0
        public void LoadAchievements()
        {
            AchievementDataContainer AchievementAchievements = new AchievementDataContainer(x =>
            {
                x.Name         = "achievements";
                x.Achievements = new List <BaseAchievement>()
                {
                    new AchievementAchievement()
                    {
                        Name             = "Underachiever",
                        Icon             = "🖍",
                        CheckAchievement = async(p) =>
                        {
                            await Task.Yield();
                            return(p.count >= 3);
                        },
                        Points = 5,
                    },
                    new AchievementAchievement()
                    {
                        Name             = "Achiever",
                        Icon             = "✏️",
                        CheckAchievement = async(p) =>
                        {
                            await Task.Yield();
                            return(p.count >= 5);
                        },
                        Points = 10,
                    },
                    new AchievementAchievement()
                    {
                        Name             = "Overachiever",
                        Icon             = "🖋️",
                        CheckAchievement = async(p) =>
                        {
                            return(p.count >= 12);
                        },
                        Points = 15,
                    },
                    new AchievementAchievement()
                    {
                        Name             = "Completionist",
                        Icon             = "🖊️",
                        CheckAchievement = async(p) =>
                        {
                            return(p.count >= 25);
                        },
                        Points = 30,
                    }
                };
            });

            AchievementDataContainer LotteryAchievements = new AchievementDataContainer(x =>
            {
                x.Name         = "lottery";
                x.Achievements = new List <BaseAchievement>()
                {
                    // Win a lottery > 100k
                    new BaseAchievement()
                    {
                        Name   = "Celebrator",
                        Icon   = "🍺",
                        Points = 5,
                    },
                    // Win a lottery > 10m
                    new BaseAchievement()
                    {
                        Name   = "Absolute Madman",
                        Icon   = "🍸",
                        Points = 10,
                    },
                    // Win a lottery > 250m
                    new BaseAchievement()
                    {
                        Name   = "Pop da champagne",
                        Icon   = "🍾",
                        Points = 15
                    }
                };
            });

            AchievementDataContainer InfoAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "info";
                x.Achievements = new List <BaseAchievement>()
                {
                    new CommandAchievement()
                    {
                        Name = "Informed",
                        Icon = "📚",

                        CheckCommand = async(p) =>
                        {
                            await Task.Yield();
                            return(p.command.Name.ToLower() == "info");
                        },
                        Points = 5
                    }
                };
            });
            AchievementDataContainer LonelyAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "fa";
                x.Achievements = new List <BaseAchievement>()
                {
                    new CommandAchievement()
                    {
                        Name = "Lonely",
                        Icon = "😭",

                        CheckCommand = async(p) =>
                        {
                            await Task.Yield();
                            return(p.command.Name.ToLower() == "marry" && p.message.MentionedUserIds.FirstOrDefault() == p.message.Author.Id);
                        },
                        Points = 5,
                    }
                };
            });
            AchievementDataContainer ChefAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "creator";
                x.Achievements = new List <BaseAchievement>()
                {
                    new CommandAchievement()
                    {
                        Name         = "Chef",
                        Icon         = "📝",
                        CheckCommand = async(p) =>
                        {
                            await Task.Yield();
                            return(p.command.Name.ToLower() == "createpasta");
                        },
                        Points = 5,
                    }
                };
            });
            AchievementDataContainer NoPermissionAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "noperms";
                x.Achievements = new List <BaseAchievement>()
                {
                    new CommandAchievement()
                    {
                        Name         = "NO! Don't touch that!",
                        Icon         = "😱",
                        CheckCommand = async(p) =>
                        {
                            return(await Bot.Instance.GetAttachedObject <EventSystem>().GetCommandHandler <SimpleCommandHandler>().GetUserAccessibility(p.message, p.discordChannel) < p.command.Accessibility);
                        },
                        Points = 5
                    }
                };
            });

            AchievementDataContainer LevelAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "levelachievements";
                x.Achievements = new List <BaseAchievement>()
                {
                    new LevelAchievement()
                    {
                        Name       = "Novice",
                        Icon       = "🎟",
                        CheckLevel = async(p) => p.level >= 3,
                        Points     = 5,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Intermediate",
                        Icon       = "🎫",
                        CheckLevel = async(p) => p.level >= 5,
                        Points     = 10,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Experienced",
                        Icon       = "🏵",
                        CheckLevel = async(p) => p.level >= 10,
                        Points     = 15,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Expert",
                        Icon       = "🎗",
                        CheckLevel = async(p) => p.level >= 20,
                        Points     = 20,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Sage",
                        Icon       = "🎖",
                        CheckLevel = async(p) => p.level >= 30,
                        Points     = 25,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Master",
                        Icon       = "🏅",
                        CheckLevel = async(p) => p.level >= 50,
                        Points     = 30,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Legend",
                        Icon       = "💮",
                        CheckLevel = async(p) => p.level >= 100,
                        Points     = 35,
                    },
                    new LevelAchievement()
                    {
                        Name       = "Epic",
                        Icon       = "🌸",
                        CheckLevel = async(p) => p.level >= 150,
                        Points     = 40,
                    }
                };
            });

            AchievementDataContainer FrogAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "frog";
                x.Achievements = new List <BaseAchievement>()
                {
                    new MessageAchievement()
                    {
                        Name         = "Oh shit! Waddup",
                        Icon         = "🐸",
                        CheckMessage = async(p) => p.message.Content.Contains("dat boi"),
                        Points       = 5
                    }
                };
            });
            AchievementDataContainer LennyAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "lenny";
                x.Achievements = new List <BaseAchievement>()
                {
                    new MessageAchievement()
                    {
                        Name         = "Lenny",
                        Icon         = "😏",
                        CheckMessage = async(p) =>
                        {
                            return(p.message.Content.Contains("( ͡° ͜ʖ ͡°)"));
                        },
                        Points = 5
                    }
                };
            });
            AchievementDataContainer PoiAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "poi";
                x.Achievements = new List <BaseAchievement>
                {
                    new MessageAchievement()
                    {
                        Name         = "Shipgirl",
                        Icon         = "⛵",
                        CheckMessage = async(p) =>
                        {
                            return(p.message.Content.Split(' ').Contains("poi"));
                        },
                        Points = 5,
                    }
                };
            });
            AchievementDataContainer LuckyAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "goodluck";
                x.Achievements = new List <BaseAchievement>()
                {
                    new MessageAchievement()
                    {
                        Name         = "Lucky",
                        Icon         = "🍀",
                        CheckMessage = async(p) =>
                        {
                            return(MikiRandom.Next(0, 10000000) == 5033943);
                        },
                        Points = 25
                    }
                };
            });

            AchievementDataContainer MekosAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "meko";
                x.Achievements = new List <BaseAchievement>()
                {
                    new TransactionAchievement()
                    {
                        Name             = "Loaded",
                        Icon             = "💵",
                        CheckTransaction = async(p) =>
                        {
                            return(p.receiver.Currency > 10000);
                        },
                        Points = 5
                    },
                    new TransactionAchievement()
                    {
                        Name             = "Rich",
                        Icon             = "💸",
                        CheckTransaction = async(p) =>
                        {
                            return(p.receiver.Currency > 50000);
                        },
                        Points = 10
                    },
                    new TransactionAchievement()
                    {
                        Name             = "Minted",
                        Icon             = "💲",
                        CheckTransaction = async(p) =>
                        {
                            return(p.receiver.Currency > 125000);
                        },
                        Points = 15
                    },
                    new TransactionAchievement()
                    {
                        Name             = "Millionaire",
                        Icon             = "🤑",
                        CheckTransaction = async(p) =>
                        {
                            return(p.receiver.Currency > 1000000);
                        },
                        Points = 20
                    },
                    new TransactionAchievement()
                    {
                        Name             = "Billionaire",
                        Icon             = "🏦",
                        CheckTransaction = async(p) =>
                        {
                            return(p.receiver.Currency > 1000000000);
                        },
                        Points = 25
                    }
                };
            });

            AchievementDataContainer DiscordBotsOrgAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "voter";
                x.Achievements = new List <BaseAchievement>()
                {
                    // first vote
                    new BaseAchievement()
                    {
                        Name   = "Helper",
                        Icon   = "✉",
                        Points = 5,
                    },
                    // 10 votes
                    new BaseAchievement()
                    {
                        Name   = "Voter",
                        Icon   = "🗳",
                        Points = 10,
                    },
                    // 50 votes
                    new BaseAchievement()
                    {
                        Name   = "Elector",
                        Icon   = "🗃",
                        Points = 15,
                    }
                };
            });

            AchievementDataContainer SlotsAchievement = new AchievementDataContainer(x =>
            {
                x.Name         = "slots";
                x.Achievements = new List <BaseAchievement>
                {
                    new BaseAchievement()
                    {
                        Name   = "Jackpot",
                        Icon   = "🎰",
                        Points = 15
                    }
                };
            });

            #region Achievement Achievements

            AchievementManager.Instance.OnAchievementUnlocked += async(pa) =>
            {
                await AchievementAchievements.CheckAsync(pa);
            };

            #endregion Achievement Achievements

            #region Command Achievements

            AchievementManager.Instance.OnCommandUsed += InfoAchievement.CheckAsync;
            AchievementManager.Instance.OnCommandUsed += LonelyAchievement.CheckAsync;
            AchievementManager.Instance.OnCommandUsed += ChefAchievement.CheckAsync;
            AchievementManager.Instance.OnCommandUsed += NoPermissionAchievement.CheckAsync;
            #endregion Command Achievements

            #region Level Achievements
            AchievementManager.Instance.OnLevelGained += LevelAchievement.CheckAsync;

            #endregion Level Achievements

            AchievementManager.Instance.OnMessage += LennyAchievement.CheckAsync;
            AchievementManager.Instance.OnMessage += PoiAchievement.CheckAsync;
            AchievementManager.Instance.OnMessage += LuckyAchievement.CheckAsync;
            AchievementManager.Instance.OnMessage += FrogAchievement.CheckAsync;

            #region Misc Achievements

            new AchievementDataContainer(x =>
            {
                x.Name         = "badluck";
                x.Achievements = new List <BaseAchievement>()
                {
                    new BaseAchievement()
                    {
                        Name   = "Unlucky",
                        Icon   = "🎲",
                        Points = 5
                    }
                };
            });

            #endregion Misc Achievements

            #region User Update Achievements (don't disable these)

            new AchievementDataContainer(x =>
            {
                x.Name         = "contributor";
                x.Achievements = new List <BaseAchievement>()
                {
                    new UserUpdateAchievement()
                    {
                        Name = "Contributor",
                        Icon = "⭐",

                        CheckUserUpdate = async(p) =>
                        {
                            if (p.userNew is IDiscordGuildUser guildUser)
                            {
                                if (guildUser.GuildId == 160067691783127041)
                                {
                                    IDiscordRole role = (await guildUser.GetGuildAsync()).GetRolesAsync().Result.Where(r => r.Name == "Contributors").FirstOrDefault();

                                    if (guildUser.RoleIds.Contains(role.Id))
                                    {
                                        return(true);
                                    }
                                }
                            }
                            return(false);
                        }
                    }
                };
            });
            new AchievementDataContainer(x =>
            {
                x.Name         = "developer";
                x.Achievements = new List <BaseAchievement>()
                {
                    new UserUpdateAchievement()
                    {
                        Name            = "Developer",
                        Icon            = "🌟",
                        CheckUserUpdate = async(p) =>
                        {
                            if (p.userNew is IDiscordGuildUser guildUser)
                            {
                                if (guildUser.GuildId == 160067691783127041)
                                {
                                    IDiscordRole role = (await guildUser.GetGuildAsync()).GetRolesAsync().Result.Where(r => r.Name == "Developer").FirstOrDefault();

                                    if (guildUser.RoleIds.Contains(role.Id))
                                    {
                                        return(true);
                                    }
                                }
                            }
                            return(false);
                        }
                    }
                };
            });
            new AchievementDataContainer(x =>
            {
                x.Name         = "glitch";
                x.Achievements = new List <BaseAchievement>()
                {
                    new UserUpdateAchievement()
                    {
                        Name            = "Glitch",
                        Icon            = "👾",
                        CheckUserUpdate = async(p) =>
                        {
                            return(false);
                        }
                    }
                };
            });
            new AchievementDataContainer(x =>
            {
                x.Name         = "donator";
                x.Achievements = new List <BaseAchievement>()
                {
                    new BaseAchievement()
                    {
                        Name   = "Donator",
                        Icon   = "💖",
                        Points = 0,
                    },
                    new BaseAchievement()
                    {
                        Name   = "Supporter",
                        Icon   = "💘",
                        Points = 0,
                    },
                    new BaseAchievement()
                    {
                        Name   = "Sponsor",
                        Icon   = "💟",
                        Points = 0,
                    },
                };
            });

            #endregion User Update Achievements (don't disable these)

            #region Transaction Achievements

            AchievementManager.Instance.OnTransaction += MekosAchievement.CheckAsync;

            #endregion Transaction Achievements
        }