diff --git a/src/Discord.Net.Core/Entities/Emotes/GuildEmote.cs b/src/Discord.Net.Core/Entities/Emotes/GuildEmote.cs index 1c5b3af9e..5a5301c2d 100644 --- a/src/Discord.Net.Core/Entities/Emotes/GuildEmote.cs +++ b/src/Discord.Net.Core/Entities/Emotes/GuildEmote.cs @@ -31,19 +31,19 @@ namespace Discord /// public IReadOnlyList RoleIds { get; } /// - /// Gets the user Id that created this emoji. + /// Gets the User that created this emoji. /// /// - /// A user Id of the user who created this emoji, which may be null. A null value only indicates that the creator was not supplied as part of the API response. - /// - public ulong? CreatorId { get; } + /// An optional who created this emoji. An unspecified value only indicates that the creator was not supplied as part of the API response. + /// + public Optional Creator { get; } - internal GuildEmote(ulong id, string name, bool animated, bool isManaged, bool requireColons, IReadOnlyList roleIds, ulong? userId) : base(id, name, animated) + internal GuildEmote(ulong id, string name, bool animated, bool isManaged, bool requireColons, IReadOnlyList roleIds, Optional creator) : base(id, name, animated) { IsManaged = isManaged; RequireColons = requireColons; RoleIds = roleIds; - CreatorId = userId; + Creator = creator; } private string DebuggerDisplay => $"{Name} ({Id})"; diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index affa74685..02de92081 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -393,7 +393,7 @@ namespace Discord.Rest public static async Task GetEmoteAsync(IGuild guild, BaseDiscordClient client, ulong id, RequestOptions options) { var emote = await client.ApiClient.GetGuildEmoteAsync(guild.Id, id, options).ConfigureAwait(false); - return emote.ToEntity(); + return emote.ToEntity(guild); } public static async Task CreateEmoteAsync(IGuild guild, BaseDiscordClient client, string name, Image image, Optional> roles, RequestOptions options) @@ -407,7 +407,7 @@ namespace Discord.Rest apiargs.RoleIds = roles.Value?.Select(xr => xr.Id).ToArray(); var emote = await client.ApiClient.CreateGuildEmoteAsync(guild.Id, apiargs, options).ConfigureAwait(false); - return emote.ToEntity(); + return emote.ToEntity(guild); } /// is null. public static async Task ModifyEmoteAsync(IGuild guild, BaseDiscordClient client, ulong id, Action func, @@ -426,7 +426,7 @@ namespace Discord.Rest apiargs.RoleIds = props.Roles.Value?.Select(xr => xr.Id).ToArray(); var emote = await client.ApiClient.ModifyGuildEmoteAsync(guild.Id, id, apiargs, options).ConfigureAwait(false); - return emote.ToEntity(); + return emote.ToEntity(guild); } public static Task DeleteEmoteAsync(IGuild guild, BaseDiscordClient client, ulong id, RequestOptions options) => client.ApiClient.DeleteGuildEmoteAsync(guild.Id, id, options); diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index a847998b5..971b5344c 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -109,7 +109,7 @@ namespace Discord.Rest { var emotes = ImmutableArray.CreateBuilder(model.Emojis.Length); for (int i = 0; i < model.Emojis.Length; i++) - emotes.Add(model.Emojis[i].ToEntity()); + emotes.Add(model.Emojis[i].ToEntity(this)); _emotes = emotes.ToImmutableArray(); } else diff --git a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs index 6e3b109e4..e1b0810f3 100644 --- a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs @@ -5,9 +5,16 @@ namespace Discord.Rest { internal static class EntityExtensions { - public static GuildEmote ToEntity(this API.Emoji model) + public static GuildEmote ToEntity(this API.Emoji model, IGuild guild) { - return new GuildEmote(model.Id.Value, model.Name, model.Animated.GetValueOrDefault(), model.Managed, model.RequireColons, ImmutableArray.Create(model.Roles), model.User.IsSpecified ? model.User.Value.Id : (ulong?)null); + return new GuildEmote(model.Id.Value, model.Name, model.Animated.GetValueOrDefault(), model.Managed, model.RequireColons, ImmutableArray.Create(model.Roles), GetEmoteAuthor(model, guild)); + } + + internal static Optional GetEmoteAuthor(API.Emoji model, IGuild guild) + { + if (!model.User.IsSpecified || guild == null) + return new Optional(); + return new Optional(guild.GetUserAsync(model.User.Value.Id).Result); } public static Embed ToEntity(this API.Embed model) diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index ca2db1a77..1fb7a8f97 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -359,7 +359,7 @@ namespace Discord.WebSocket { var emojis = ImmutableArray.CreateBuilder(model.Emojis.Length); for (int i = 0; i < model.Emojis.Length; i++) - emojis.Add(model.Emojis[i].ToEntity()); + emojis.Add(model.Emojis[i].ToEntity(this)); _emotes = emojis.ToImmutable(); } else @@ -409,7 +409,7 @@ namespace Discord.WebSocket { var emotes = ImmutableArray.CreateBuilder(model.Emojis.Length); for (int i = 0; i < model.Emojis.Length; i++) - emotes.Add(model.Emojis[i].ToEntity()); + emotes.Add(model.Emojis[i].ToEntity(this)); _emotes = emotes.ToImmutable(); }