using Discord.API.Rest; using System; using System.Diagnostics; using System.Threading.Tasks; using Model = Discord.API.Role; namespace Discord.Rest { [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestRole : RestEntity, IRole { internal IGuild Guild { get; } public Color Color { get; private set; } public bool IsHoisted { get; private set; } public bool IsManaged { get; private set; } public bool IsMentionable { get; private set; } public string Name { get; private set; } public GuildPermissions Permissions { get; private set; } public int Position { get; private set; } public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); public bool IsEveryone => Id == Guild.Id; public string Mention => MentionUtils.MentionRole(Id); internal RestRole(BaseDiscordClient discord, IGuild guild, ulong id) : base(discord, id) { Guild = guild; } internal static RestRole Create(BaseDiscordClient discord, IGuild guild, Model model) { var entity = new RestRole(discord, guild, model.Id); entity.Update(model); return entity; } internal void Update(Model model) { Name = model.Name; IsHoisted = model.Hoist; IsManaged = model.Managed; IsMentionable = model.Mentionable; Position = model.Position; Color = new Color(model.Color); Permissions = new GuildPermissions(model.Permissions); } public async Task ModifyAsync(Action func, RequestOptions options = null) { var model = await RoleHelper.ModifyAsync(this, Discord, func, options).ConfigureAwait(false); Update(model); } public Task DeleteAsync(RequestOptions options = null) => RoleHelper.DeleteAsync(this, Discord, options); public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Id})"; //IRole IGuild IRole.Guild { get { if (Guild != null) return Guild; throw new InvalidOperationException("Unable to return this entity's parent unless it was fetched through that object."); } } } }