/// <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); }
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); } }
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); } }
public async Task RemoveRoleAsync(IDiscordRole role) { if (role == null) { throw new ArgumentNullException(nameof(role)); } await client.ApiClient.RemoveGuildMemberRoleAsync(GuildId, Id, role.Id); }
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 }); }
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); } } }
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)); } }
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; }
public RoleException(IDiscordRole role) { this.role = role; }
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); } }
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); } } }
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); } }
/*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()); }
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 }
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); } }
public async Task AddRoleAsync(IDiscordRole role) { await client.ApiClient.AddGuildMemberRoleAsync(GuildId, Id, role.Id); }
public async Task AddRoleAsync(IDiscordRole role) { await(user as IGuildUser).AddRolesAsync(new List <IRole> { (role as IProxy <IRole>).ToNativeObject() }); }
public IDiscordRole GetRoleByName(IDiscordGuild guild, string roleName) { IDiscordRole role = guild.Roles.Where(x => x.Name.ToLower() == roleName.ToLower()).FirstOrDefault(); return(role); }
public ValueTask AddRoleAsync(IDiscordRole role) { return(Client.AddGuildMemberRoleAsync(GuildId, Id, role.Id)); }
public ValueTask OnGuildRoleDeleted(ulong guildId, IDiscordRole role) { return(default);
public async Task RemoveRoleAsync(IDiscordRole role) => await _client.RemoveGuildMemberRoleAsync(GuildId, Id, role.Id);
public async Task PermissionsAsync(IDiscordRole role) { var allowedPermissions = await _permissionManager.GetAllowedRolePermissionAsync(role.Id, _guild.Id); await PermissionsAsync("Role", role, allowedPermissions); }
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); } }
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); } }
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); } }
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))); }
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 }