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;