diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs
index f23f55238..6c7a4af89 100644
--- a/src/Discord.Net.Core/CDN.cs
+++ b/src/Discord.Net.Core/CDN.cs
@@ -13,6 +13,8 @@ namespace Discord
string extension = FormatToExtension(format, avatarId);
return $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}.{extension}?size={size}";
}
+ public static string GetUserDefaultAvatarUrl(ushort discrim)
+ => $"{DiscordConfig.CDNUrl}embed/avatars/{discrim}.png";
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/IUser.cs b/src/Discord.Net.Core/Entities/Users/IUser.cs
index e3f270f6f..9d06ca12a 100644
--- a/src/Discord.Net.Core/Entities/Users/IUser.cs
+++ b/src/Discord.Net.Core/Entities/Users/IUser.cs
@@ -8,6 +8,10 @@ namespace Discord
string AvatarId { get; }
/// Gets the url to this user's avatar.
string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128);
+ /// Get the url to this user's custom avatar.
+ string GetCustomAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128);
+ /// Get the url to this user's default avatar.
+ string GetDefaultAvatarUrl();
/// Gets the per-username unique id for this user.
string Discriminator { get; }
/// Gets the per-username unique id for this user.
@@ -16,6 +20,8 @@ namespace Discord
bool IsBot { get; }
/// Returns true if this user is a webhook user.
bool IsWebhook { get; }
+ /// Returns true if this user has set a custom avatar.
+ bool HasCustomAvatar { get; }
/// Gets the username for this user.
string Username { get; }
diff --git a/src/Discord.Net.Rest/Entities/Users/RestUser.cs b/src/Discord.Net.Rest/Entities/Users/RestUser.cs
index c6cf6103a..f9eac20cc 100644
--- a/src/Discord.Net.Rest/Entities/Users/RestUser.cs
+++ b/src/Discord.Net.Rest/Entities/Users/RestUser.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Model = Discord.API.User;
@@ -9,6 +9,7 @@ namespace Discord.Rest
public class RestUser : RestEntity, IUser, IUpdateable
{
public bool IsBot { get; private set; }
+ public bool HasCustomeAvatar { get; private set; }
public string Username { get; private set; }
public ushort DiscriminatorValue { get; private set; }
public string AvatarId { get; private set; }
@@ -19,6 +20,7 @@ namespace Discord.Rest
public virtual IActivity Activity => null;
public virtual UserStatus Status => UserStatus.Offline;
public virtual bool IsWebhook => false;
+ public bool HasCustomAvatar => AvatarId != null;
internal RestUser(BaseDiscordClient discord, ulong id)
: base(discord, id)
@@ -58,13 +60,20 @@ namespace Discord.Rest
=> UserHelper.CreateDMChannelAsync(this, Discord, options);
public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
+ => GetCustomAvatarUrl(format, size) ?? GetDefaultAvatarUrl();
+
+ public string GetCustomAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
=> CDN.GetUserAvatarUrl(Id, AvatarId, size, format);
+ public string GetDefaultAvatarUrl()
+ => CDN.GetUserDefaultAvatarUrl(DiscriminatorValue);
+
public override string ToString() => $"{Username}#{Discriminator}";
private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")})";
//IUser
async Task IUser.GetOrCreateDMChannelAsync(RequestOptions options)
=> await GetOrCreateDMChannelAsync(options);
+
}
}
diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs
index 58d5c62a1..aa0b22f9c 100644
--- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs
+++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs
@@ -1,4 +1,4 @@
-using Discord.Rest;
+using Discord.Rest;
using System;
using System.Threading.Tasks;
using Model = Discord.API.User;
@@ -20,6 +20,7 @@ namespace Discord.WebSocket
public string Mention => MentionUtils.MentionUser(Id);
public IActivity Activity => Presence.Activity;
public UserStatus Status => Presence.Status;
+ public bool HasCustomAvatar => AvatarId != null;
internal SocketUser(DiscordSocketClient discord, ulong id)
: base(discord, id)
@@ -59,10 +60,17 @@ namespace Discord.WebSocket
=> GlobalUser.DMChannel ?? await UserHelper.CreateDMChannelAsync(this, Discord, options) as IDMChannel;
public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
+ => GetCustomAvatarUrl(format, size) ?? GetDefaultAvatarUrl();
+
+ public string GetCustomAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
=> CDN.GetUserAvatarUrl(Id, AvatarId, size, format);
+ public string GetDefaultAvatarUrl()
+ => CDN.GetUserDefaultAvatarUrl(DiscriminatorValue);
+
public override string ToString() => $"{Username}#{Discriminator}";
private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")})";
internal SocketUser Clone() => MemberwiseClone() as SocketUser;
+
}
}