From bfc4fd686e23c89f6ade6d1bdca34a9e5692f353 Mon Sep 17 00:00:00 2001 From: james7132 Date: Wed, 15 Mar 2017 00:33:07 +0000 Subject: [PATCH 1/3] Automatic animated avatar detection --- src/Discord.Net.Core/CDN.cs | 11 +++++++++-- src/Discord.Net.Core/Entities/Users/AvatarFormat.cs | 1 + src/Discord.Net.Core/Entities/Users/IUser.cs | 2 +- src/Discord.Net.Rest/Entities/Users/RestUser.cs | 4 ++-- src/Discord.Net.Rpc/Entities/Users/RpcUser.cs | 2 +- .../Entities/Users/SocketUser.cs | 2 +- 6 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index b7a5346ea..6a4e03212 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -4,8 +4,15 @@ { public static string GetApplicationIconUrl(ulong appId, string iconId) => iconId != null ? $"{DiscordConfig.CDNUrl}app-icons/{appId}/{iconId}.jpg" : null; - public static string GetUserAvatarUrl(ulong userId, string avatarId, ushort size, AvatarFormat format) - => avatarId != null ? $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}.{format.ToString().ToLower()}?size={size}" : null; + public static string GetUserAvatarUrl(ulong userId, string avatarId, ushort size, AvatarFormat format) { + if (avatarId == null) + return null; + var base = $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}"; + if (format == AvatarFormat.Auto) + return base + (avatarId.StartsWith("a_") ? "gif" : "png") + $"?size={size}"; + else + return base + format.ToString().ToLower() + $"?size={size}"; + } public static string GetGuildIconUrl(ulong guildId, string iconId) => iconId != null ? $"{DiscordConfig.CDNUrl}icons/{guildId}/{iconId}.jpg" : null; public static string GetGuildSplashUrl(ulong guildId, string splashId) diff --git a/src/Discord.Net.Core/Entities/Users/AvatarFormat.cs b/src/Discord.Net.Core/Entities/Users/AvatarFormat.cs index 29c17cede..ef9e4b375 100644 --- a/src/Discord.Net.Core/Entities/Users/AvatarFormat.cs +++ b/src/Discord.Net.Core/Entities/Users/AvatarFormat.cs @@ -2,6 +2,7 @@ { public enum AvatarFormat { + Auto, WebP, Png, Jpeg, diff --git a/src/Discord.Net.Core/Entities/Users/IUser.cs b/src/Discord.Net.Core/Entities/Users/IUser.cs index b7e807d8e..4d36295f3 100644 --- a/src/Discord.Net.Core/Entities/Users/IUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IUser.cs @@ -7,7 +7,7 @@ namespace Discord /// Gets the id of this user's avatar. string AvatarId { get; } /// Gets the url to this user's avatar. - string GetAvatarUrl(AvatarFormat format = AvatarFormat.Png, ushort size = 128); + string GetAvatarUrl(AvatarFormat format = AvatarFormat.Auto, ushort size = 128); /// Gets the per-username unique id for this user. string Discriminator { get; } /// Gets the per-username unique id for this user. diff --git a/src/Discord.Net.Rest/Entities/Users/RestUser.cs b/src/Discord.Net.Rest/Entities/Users/RestUser.cs index b439fb886..c57d96c5e 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestUser.cs @@ -13,7 +13,7 @@ namespace Discord.Rest public ushort DiscriminatorValue { get; private set; } public string AvatarId { get; private set; } - public string GetAvatarUrl(AvatarFormat format = AvatarFormat.Png, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); + public string GetAvatarUrl(AvatarFormat format = AvatarFormat.Auto, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); public string Discriminator => DiscriminatorValue.ToString("D4"); public string Mention => MentionUtils.MentionUser(Id); @@ -41,7 +41,7 @@ namespace Discord.Rest if (model.Username.IsSpecified) Username = model.Username.Value; } - + public virtual async Task UpdateAsync(RequestOptions options = null) { var model = await Discord.ApiClient.GetUserAsync(Id, options).ConfigureAwait(false); diff --git a/src/Discord.Net.Rpc/Entities/Users/RpcUser.cs b/src/Discord.Net.Rpc/Entities/Users/RpcUser.cs index e78aee008..6a75f07a3 100644 --- a/src/Discord.Net.Rpc/Entities/Users/RpcUser.cs +++ b/src/Discord.Net.Rpc/Entities/Users/RpcUser.cs @@ -14,7 +14,7 @@ namespace Discord.Rpc public ushort DiscriminatorValue { get; private set; } public string AvatarId { get; private set; } - public string GetAvatarUrl(AvatarFormat format = AvatarFormat.Png, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); + public string GetAvatarUrl(AvatarFormat format = AvatarFormat.Auto, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); public string Discriminator => DiscriminatorValue.ToString("D4"); public string Mention => MentionUtils.MentionUser(Id); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs index 574e79b6e..5a0c22d36 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs @@ -15,7 +15,7 @@ namespace Discord.WebSocket internal abstract SocketGlobalUser GlobalUser { get; } internal abstract SocketPresence Presence { get; set; } - public string GetAvatarUrl(AvatarFormat format = AvatarFormat.Png, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); + public string GetAvatarUrl(AvatarFormat format = AvatarFormat.Auto, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); public string Discriminator => DiscriminatorValue.ToString("D4"); public string Mention => MentionUtils.MentionUser(Id); From 46b6b8c03bbdd30636790aa4626a9822c6bc395f Mon Sep 17 00:00:00 2001 From: james7132 Date: Wed, 15 Mar 2017 00:48:37 +0000 Subject: [PATCH 2/3] Review fixes --- src/Discord.Net.Core/CDN.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index 6a4e03212..40e25e186 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -4,14 +4,15 @@ { public static string GetApplicationIconUrl(ulong appId, string iconId) => iconId != null ? $"{DiscordConfig.CDNUrl}app-icons/{appId}/{iconId}.jpg" : null; - public static string GetUserAvatarUrl(ulong userId, string avatarId, ushort size, AvatarFormat format) { + public static string GetUserAvatarUrl(ulong userId, string avatarId, ushort size, AvatarFormat format) + { if (avatarId == null) return null; - var base = $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}"; + var baseUrl = $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}"; if (format == AvatarFormat.Auto) - return base + (avatarId.StartsWith("a_") ? "gif" : "png") + $"?size={size}"; + return baseUrl + (avatarId.StartsWith("a_") ? "gif" : "png") + $"?size={size}"; else - return base + format.ToString().ToLower() + $"?size={size}"; + return baseUrl + format.ToString().ToLower() + $"?size={size}"; } public static string GetGuildIconUrl(ulong guildId, string iconId) => iconId != null ? $"{DiscordConfig.CDNUrl}icons/{guildId}/{iconId}.jpg" : null; From bd0a329912802376ed3426bf2b914a9890d14dcb Mon Sep 17 00:00:00 2001 From: james7132 Date: Thu, 16 Mar 2017 16:06:40 +0000 Subject: [PATCH 3/3] Simplify format logic --- src/Discord.Net.Core/CDN.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index 40e25e186..c5f05c0c3 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -8,11 +8,9 @@ { if (avatarId == null) return null; - var baseUrl = $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}"; if (format == AvatarFormat.Auto) - return baseUrl + (avatarId.StartsWith("a_") ? "gif" : "png") + $"?size={size}"; - else - return baseUrl + format.ToString().ToLower() + $"?size={size}"; + format = avatarId.StartsWith("a_") ? AvatarFormat.Gif : AvatarFormat.Png; + return $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}.{format.ToString().ToLower()}?size={size}"; } public static string GetGuildIconUrl(ulong guildId, string iconId) => iconId != null ? $"{DiscordConfig.CDNUrl}icons/{guildId}/{iconId}.jpg" : null;