From 57eb906552c9854049280c14a6565a8d2c8a3700 Mon Sep 17 00:00:00 2001
From: Mihail Gribkov <61027276+Misha-133@users.noreply.github.com>
Date: Thu, 29 Aug 2024 00:02:20 +0300
Subject: [PATCH] bannerz W (#2987)
---
src/Discord.Net.Core/CDN.cs | 8 +++++++
.../Entities/Users/IGuildUser.cs | 21 +++++++++++++++++++
.../API/Common/GuildMember.cs | 3 +++
.../Entities/Users/RestGuildUser.cs | 10 +++++++++
.../Entities/Users/RestWebhookUser.cs | 4 ++++
.../Entities/Users/SocketGuildUser.cs | 9 ++++++++
.../Entities/Users/SocketThreadUser.cs | 7 +++++++
.../Entities/Users/SocketWebhookUser.cs | 4 ++++
8 files changed, 66 insertions(+)
diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs
index ab381ce4..4349d19b 100644
--- a/src/Discord.Net.Core/CDN.cs
+++ b/src/Discord.Net.Core/CDN.cs
@@ -55,6 +55,14 @@ namespace Discord
return $"{DiscordConfig.CDNUrl}guilds/{guildId}/users/{userId}/avatars/{avatarId}.{extension}?size={size}";
}
+ public static string GetGuildUserBannerUrl(ulong userId, ulong guildId, string bannerId, ushort size, ImageFormat format)
+ {
+ if (bannerId == null)
+ return null;
+ var extension = FormatToExtension(format, bannerId);
+ return $"{DiscordConfig.CDNUrl}guilds/{guildId}/users/{userId}/banners/{bannerId}.{extension}?size={size}";
+ }
+
///
/// Returns a user banner URL.
///
diff --git a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs
index cc69686c..78873e85 100644
--- a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs
+++ b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs
@@ -39,6 +39,7 @@ namespace Discord
/// If the user also does not have a regular avatar, this will be .
///
string DisplayAvatarId { get; }
+
///
/// Gets the guild specific avatar for this user.
///
@@ -46,6 +47,15 @@ namespace Discord
/// The users guild avatar hash if they have one; otherwise .
///
string GuildAvatarId { get; }
+
+ ///
+ /// Gets the guild specific banner for this user.
+ ///
+ ///
+ /// The user's guild banner hash if they have one; otherwise .
+ ///
+ string GuildBannerHash { get; }
+
///
/// Gets the guild-level permissions for this user.
///
@@ -147,6 +157,17 @@ namespace Discord
/// A string representing the user's guild-specific avatar URL; if the user has no guild avatar set.
///
string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128);
+
+ ///
+ /// Gets the guild-specific banner URL for this user, if it is set.
+ ///
+ /// The format of the image.
+ /// The size of the image that matches any power of two, ranging from 16 to 2048.
+ ///
+ /// A string representing the user's guild-specific banner URL; if the user has no guild banner set.
+ ///
+ string GetGuildBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128);
+
///
/// Kicks this user from this guild.
///
diff --git a/src/Discord.Net.Rest/API/Common/GuildMember.cs b/src/Discord.Net.Rest/API/Common/GuildMember.cs
index 3bdf0d6b..19bdd6a9 100644
--- a/src/Discord.Net.Rest/API/Common/GuildMember.cs
+++ b/src/Discord.Net.Rest/API/Common/GuildMember.cs
@@ -28,5 +28,8 @@ namespace Discord.API
[JsonProperty("flags")]
public GuildUserFlags Flags { get; set; }
+
+ [JsonProperty("banner")]
+ public Optional Banner { get; set; }
}
}
diff --git a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs
index 5e15d530..c12f1c18 100644
--- a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs
+++ b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs
@@ -29,6 +29,10 @@ namespace Discord.Rest
public string DisplayAvatarId => GuildAvatarId ?? AvatarId;
///
public string GuildAvatarId { get; private set; }
+
+ ///
+ public string GuildBannerHash { get; private set; }
+
internal IGuild Guild { get; private set; }
///
public bool IsDeafened { get; private set; }
@@ -122,6 +126,8 @@ namespace Discord.Rest
_timedOutTicks = model.TimedOutUntil.Value?.UtcTicks;
if (model.Pending.IsSpecified)
IsPending = model.Pending.Value;
+ if (model.Banner.IsSpecified)
+ GuildBannerHash = model.Banner.Value;
Flags = model.Flags;
}
private void UpdateRoles(ulong[] roleIds)
@@ -200,6 +206,10 @@ namespace Discord.Rest
public string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
=> CDN.GetGuildUserAvatarUrl(Id, GuildId, GuildAvatarId, size, format);
+ ///
+ public string GetGuildBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
+ => CDN.GetGuildUserBannerUrl(Id, GuildId, GuildBannerHash, size, format);
+
///
public override string GetDisplayAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
=> GetGuildAvatarUrl(format, size) ?? base.GetDisplayAvatarUrl(format, size);
diff --git a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs
index ba3501d7..51b8d569 100644
--- a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs
+++ b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs
@@ -60,8 +60,12 @@ namespace Discord.Rest
///
string IGuildUser.GuildAvatarId => null;
///
+ string IGuildUser.GuildBannerHash => null;
+ ///
string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => null;
///
+ string IGuildUser.GetGuildBannerUrl(ImageFormat format, ushort size) => null;
+ ///
bool? IGuildUser.IsPending => null;
///
int IGuildUser.Hierarchy => 0;
diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs
index f34fd2fb..224ec6fd 100644
--- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs
+++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs
@@ -50,6 +50,9 @@ namespace Discord.WebSocket
///
public override string GlobalName { get { return GlobalUser.GlobalName; } internal set { GlobalUser.GlobalName = value; } }
+ ///
+ public string GuildBannerHash { get; private set; }
+
///
public GuildPermissions GuildPermissions => new GuildPermissions(Permissions.ResolveGuild(Guild, this));
internal override SocketPresence Presence { get; set; }
@@ -185,6 +188,8 @@ namespace Discord.WebSocket
_timedOutTicks = model.TimedOutUntil.Value?.UtcTicks;
if (model.Pending.IsSpecified)
IsPending = model.Pending.Value;
+ if (model.Banner.IsSpecified)
+ GuildBannerHash = model.Banner.Value;
Flags = model.Flags;
}
@@ -263,6 +268,10 @@ namespace Discord.WebSocket
public string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
=> CDN.GetGuildUserAvatarUrl(Id, Guild.Id, GuildAvatarId, size, format);
+ ///
+ public string GetGuildBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
+ => CDN.GetGuildUserBannerUrl(Id, Guild.Id, GuildBannerHash, size, format);
+
///
public override string GetDisplayAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
=> GetGuildAvatarUrl(format, size) ?? base.GetDisplayAvatarUrl(format, size);
diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs
index 429dc527..b5859e77 100644
--- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs
+++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs
@@ -72,6 +72,10 @@ namespace Discord.WebSocket
public string GuildAvatarId
=> GuildUser.GuildAvatarId;
+ ///
+ public string GuildBannerHash
+ => GuildUser.GuildBannerHash;
+
///
public override ushort DiscriminatorValue
{
@@ -240,6 +244,9 @@ namespace Discord.WebSocket
///
string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => GuildUser.GetGuildAvatarUrl(format, size);
+ ///
+ string IGuildUser.GetGuildBannerUrl(ImageFormat format, ushort size) => GuildUser.GetGuildBannerUrl(format, size);
+
///
public override string GetDisplayAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
=> GuildUser.GetGuildAvatarUrl() ?? base.GetDisplayAvatarUrl(format, size);
diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs
index 2c438e6c..0b46e26d 100644
--- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs
+++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs
@@ -75,8 +75,12 @@ namespace Discord.WebSocket
///
string IGuildUser.GuildAvatarId => null;
///
+ string IGuildUser.GuildBannerHash => null;
+ ///
string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => null;
///
+ string IGuildUser.GetGuildBannerUrl(ImageFormat format, ushort size) => null;
+ ///
DateTimeOffset? IGuildUser.PremiumSince => null;
///
DateTimeOffset? IGuildUser.TimedOutUntil => null;