public static async Task GiveUserRolesAsync(CommandContext ctx, Func <System.Reflection.PropertyInfo, bool> predicate) { if (Program.cfgjson.UserRoles is null) { // Config hasn't been updated yet. return; } DiscordGuild guild = await Program.discord.GetGuildAsync(ctx.Guild.Id); String response = ""; System.Reflection.PropertyInfo[] roleIds = Program.cfgjson.UserRoles.GetType().GetProperties().Where(predicate).ToArray(); for (int i = 0; i < roleIds.Length; i++) { DiscordRole roleToGrant = guild.GetRole((ulong)roleIds[i].GetValue(Program.cfgjson.UserRoles, null)); await ctx.Member.GrantRoleAsync(roleToGrant); if (roleIds.Length == 1) { response += roleToGrant.Mention; } else { response += i == roleIds.Length - 1 ? $"and {roleToGrant.Mention}" : $"{roleToGrant.Mention}{(roleIds.Length != 2 ? "," : String.Empty)} "; } } await ctx.RespondAsync($"{ctx.User.Mention} has joined the {response} role{(roleIds.Length != 1 ? "s" : String.Empty)}."); }