using System; using System.Threading.Tasks; using Model = Discord.API.Role; using BulkParams = Discord.API.Rest.ModifyGuildRolesParams; namespace Discord.Rest { internal static class RoleHelper { #region General public static async Task DeleteAsync(IRole role, BaseDiscordClient client, RequestOptions options) { await client.ApiClient.DeleteGuildRoleAsync(role.Guild.Id, role.Id, options).ConfigureAwait(false); } public static async Task ModifyAsync(IRole role, BaseDiscordClient client, Action func, RequestOptions options) { var args = new RoleProperties(); func(args); if (args.Icon.IsSpecified || args.Emoji.IsSpecified) { role.Guild.Features.EnsureFeature(GuildFeature.RoleIcons); if ((args.Icon.IsSpecified && args.Icon.Value != null) && (args.Emoji.IsSpecified && args.Emoji.Value != null)) { throw new ArgumentException("Emoji and Icon properties cannot be present on a role at the same time."); } } var apiArgs = new API.Rest.ModifyGuildRoleParams { Color = args.Color.IsSpecified ? args.Color.Value.RawValue : Optional.Create(), Hoist = args.Hoist, Mentionable = args.Mentionable, Name = args.Name, Permissions = args.Permissions.IsSpecified ? args.Permissions.Value.RawValue.ToString() : Optional.Create(), Icon = args.Icon.IsSpecified ? args.Icon.Value?.ToModel() ?? null : Optional.Unspecified, Emoji = args.Emoji.IsSpecified ? args.Emoji.Value?.Name ?? "" : Optional.Create(), }; if ((args.Icon.IsSpecified && args.Icon.Value != null) && role.Emoji != null) { apiArgs.Emoji = ""; } if ((args.Emoji.IsSpecified && args.Emoji.Value != null) && !string.IsNullOrEmpty(role.Icon)) { apiArgs.Icon = Optional.Unspecified; } var model = await client.ApiClient.ModifyGuildRoleAsync(role.Guild.Id, role.Id, apiArgs, options).ConfigureAwait(false); if (args.Position.IsSpecified) { var bulkArgs = new[] { new BulkParams(role.Id, args.Position.Value) }; await client.ApiClient.ModifyGuildRolesAsync(role.Guild.Id, bulkArgs, options).ConfigureAwait(false); model.Position = args.Position.Value; } return model; } #endregion } }