Browse Source

feature: guild avatars, closes #238

pull/1923/head
quin lynch 3 years ago
parent
commit
796d94dcf8
8 changed files with 57 additions and 1 deletions
  1. +8
    -0
      src/Discord.Net.Core/CDN.cs
  2. +21
    -0
      src/Discord.Net.Core/Entities/Users/IGuildUser.cs
  3. +2
    -0
      src/Discord.Net.Rest/API/Common/GuildMember.cs
  4. +7
    -0
      src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs
  5. +4
    -0
      src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs
  6. +6
    -1
      src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs
  7. +5
    -0
      src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs
  8. +4
    -0
      src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs

+ 8
- 0
src/Discord.Net.Core/CDN.cs View File

@@ -47,6 +47,14 @@ namespace Discord
return $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}.{extension}?size={size}";
}

public static string GetGuildUserAvatarUrl(ulong userId, ulong guildId, string avatarId, ushort size, ImageFormat format)
{
if (avatarId == null)
return null;
string extension = FormatToExtension(format, avatarId);
return $"{DiscordConfig.CDNUrl}guilds/{guildId}/users/{userId}/avatars/{avatarId}.{extension}?size={size}";
}

/// <summary>
/// Returns a user banner URL.
/// </summary>


+ 21
- 0
src/Discord.Net.Core/Entities/Users/IGuildUser.cs View File

@@ -25,6 +25,13 @@ namespace Discord
/// </returns>
string Nickname { get; }
/// <summary>
/// Gets the guild specific avatar for this users.
/// </summary>
/// <returns>
/// The users guild avatar hash if they have one; otherwise <see langword="null"/>.
/// </returns>
string GuildAvatarId { get; }
/// <summary>
/// Gets the guild-level permissions for this user.
/// </summary>
/// <returns>
@@ -96,6 +103,20 @@ namespace Discord
/// </returns>
ChannelPermissions GetPermissions(IGuildChannel channel);

/// <summary>
/// Gets the guild avatar URL for this user.
/// </summary>
/// <remarks>
/// This property retrieves a URL for this guild user's guild specific avatar. In event that the user does not have a valid guild avatar
/// (i.e. their avatar identifier is not set), this method will return <c>null</c>.
/// </remarks>
/// <param name="format">The format to return.</param>
/// <param name="size">The size of the image to return in. This can be any power of two between 16 and 2048.
/// </param>
/// <returns>
/// A string representing the user's avatar URL; <c>null</c> if the user does not have an avatar in place.
/// </returns>
string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128);
/// <summary>
/// Kicks this user from this guild.
/// </summary>


+ 2
- 0
src/Discord.Net.Rest/API/Common/GuildMember.cs View File

@@ -9,6 +9,8 @@ namespace Discord.API
public User User { get; set; }
[JsonProperty("nick")]
public Optional<string> Nick { get; set; }
[JsonProperty("avatar")]
public Optional<string> Avatar { get; set; }
[JsonProperty("roles")]
public Optional<ulong[]> Roles { get; set; }
[JsonProperty("joined_at")]


+ 7
- 0
src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs View File

@@ -21,6 +21,8 @@ namespace Discord.Rest

/// <inheritdoc />
public string Nickname { get; private set; }
/// <inheritdoc/>
public string GuildAvatarId { get; private set; }
internal IGuild Guild { get; private set; }
/// <inheritdoc />
public bool IsDeafened { get; private set; }
@@ -80,6 +82,8 @@ namespace Discord.Rest
_joinedAtTicks = model.JoinedAt.Value.UtcTicks;
if (model.Nick.IsSpecified)
Nickname = model.Nick.Value;
if (model.Avatar.IsSpecified)
GuildAvatarId = model.Avatar.Value;
if (model.Deaf.IsSpecified)
IsDeafened = model.Deaf.Value;
if (model.Mute.IsSpecified)
@@ -156,6 +160,9 @@ namespace Discord.Rest
var guildPerms = GuildPermissions;
return new ChannelPermissions(Permissions.ResolveChannel(Guild, this, channel, guildPerms.RawValue));
}

public string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
=> CDN.GetGuildUserAvatarUrl(Id, GuildId, GuildAvatarId, size, format);
#endregion

#region IGuildUser


+ 4
- 0
src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs View File

@@ -54,6 +54,10 @@ namespace Discord.Rest
/// <inheritdoc />
string IGuildUser.Nickname => null;
/// <inheritdoc />
string IGuildUser.GuildAvatarId => null;
/// <inheritdoc />
string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => null;
/// <inheritdoc />
bool? IGuildUser.IsPending => null;
/// <inheritdoc />
int IGuildUser.Hierarchy => 0;


+ 6
- 1
src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs View File

@@ -30,7 +30,8 @@ namespace Discord.WebSocket
public SocketGuild Guild { get; }
/// <inheritdoc />
public string Nickname { get; private set; }

/// <inheritdoc/>
public string GuildAvatarId { get; private set; }
/// <inheritdoc />
public override bool IsBot { get { return GlobalUser.IsBot; } internal set { GlobalUser.IsBot = value; } }
/// <inheritdoc />
@@ -154,6 +155,8 @@ namespace Discord.WebSocket
_joinedAtTicks = model.JoinedAt.Value.UtcTicks;
if (model.Nick.IsSpecified)
Nickname = model.Nick.Value;
if (model.Avatar.IsSpecified)
GuildAvatarId = model.Avatar.Value;
if (model.Roles.IsSpecified)
UpdateRoles(model.Roles.Value);
if (model.PremiumSince.IsSpecified)
@@ -218,6 +221,8 @@ namespace Discord.WebSocket
/// <inheritdoc />
public ChannelPermissions GetPermissions(IGuildChannel channel)
=> new ChannelPermissions(Permissions.ResolveChannel(Guild, this, channel, GuildPermissions.RawValue));
public string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
=> CDN.GetGuildUserAvatarUrl(Id, Guild.Id, GuildAvatarId, size, format);

private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")}, Guild)";
internal new SocketGuildUser Clone() => MemberwiseClone() as SocketGuildUser;


+ 5
- 0
src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs View File

@@ -52,6 +52,9 @@ namespace Discord.WebSocket
get => GuildUser.AvatarId;
internal set => GuildUser.AvatarId = value;
}
/// <inheritdoc/>
public string GuildAvatarId
=> GuildUser.GuildAvatarId;

/// <inheritdoc/>
public override string BannerId
@@ -205,6 +208,8 @@ namespace Discord.WebSocket
/// <inheritdoc/>
IReadOnlyCollection<ulong> IGuildUser.RoleIds => GuildUser.Roles.Select(x => x.Id).ToImmutableArray();

string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => GuildUser.GetGuildAvatarUrl(format, size);

internal override SocketGlobalUser GlobalUser => GuildUser.GlobalUser;

internal override SocketPresence Presence { get => GuildUser.Presence; set => GuildUser.Presence = value; }


+ 4
- 0
src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs View File

@@ -81,6 +81,10 @@ namespace Discord.WebSocket
/// <inheritdoc />
string IGuildUser.Nickname => null;
/// <inheritdoc />
string IGuildUser.GuildAvatarId => null;
/// <inheritdoc />
string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => null;
/// <inheritdoc />
DateTimeOffset? IGuildUser.PremiumSince => null;
/// <inheritdoc />
bool? IGuildUser.IsPending => null;


Loading…
Cancel
Save