* Add banner and accent color to user and some fixes * Fix * Fix! * increase size of user banners to 256 * Some changes and mini refactor of color class * add constant maxDecimalValue to color and checks with exceptions * add `NotSupportedException` for `BannerId` and `AccentColor` in `SocketWebhookUser` * Update ComponentBuilder.cs - `MaxLabelLength` from `ComponentBuilder` moved to `ButtonBuilder` - Added `MaxLabelLength` for `SelectMenuOptionBuilder` - Changed `MaxDescriptionLength` to 100pull/1923/head
| @@ -46,6 +46,24 @@ namespace Discord | |||||
| string extension = FormatToExtension(format, avatarId); | string extension = FormatToExtension(format, avatarId); | ||||
| return $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}.{extension}?size={size}"; | return $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}.{extension}?size={size}"; | ||||
| } | } | ||||
| /// <summary> | |||||
| /// Returns a user banner URL. | |||||
| /// </summary> | |||||
| /// <param name="userId">The user snowflake identifier.</param> | |||||
| /// <param name="bannerId">The banner identifier.</param> | |||||
| /// <param name="size">The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048.</param> | |||||
| /// <param name="format">The format to return.</param> | |||||
| /// <returns> | |||||
| /// A URL pointing to the user's banner in the specified size. | |||||
| /// </returns> | |||||
| public static string GetUserBannerUrl(ulong userId, string bannerId, ushort size, ImageFormat format) | |||||
| { | |||||
| if (bannerId == null) | |||||
| return null; | |||||
| string extension = FormatToExtension(format, bannerId); | |||||
| return $"{DiscordConfig.CDNUrl}banners/{userId}/{bannerId}.{extension}?size={size}"; | |||||
| } | |||||
| /// <summary> | /// <summary> | ||||
| /// Returns the default user avatar URL. | /// Returns the default user avatar URL. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -10,11 +10,6 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| public class ComponentBuilder | public class ComponentBuilder | ||||
| { | { | ||||
| /// <summary> | |||||
| /// The max length of a <see cref="ButtonComponent.Label"/>. | |||||
| /// </summary> | |||||
| public const int MaxLabelLength = 80; | |||||
| /// <summary> | /// <summary> | ||||
| /// The max length of a <see cref="ButtonComponent.CustomId"/>. | /// The max length of a <see cref="ButtonComponent.CustomId"/>. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -307,17 +302,22 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| public class ButtonBuilder | public class ButtonBuilder | ||||
| { | { | ||||
| /// <summary> | |||||
| /// The max length of a <see cref="ButtonComponent.Label"/>. | |||||
| /// </summary> | |||||
| public const int MaxLabelLength = 80; | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets or sets the label of the current button. | /// Gets or sets the label of the current button. | ||||
| /// </summary> | /// </summary> | ||||
| /// <exception cref="ArgumentException" accessor="set"><see cref="Label"/> length exceeds <see cref="ComponentBuilder.MaxLabelLength"/>.</exception> | |||||
| /// <exception cref="ArgumentException" accessor="set"><see cref="Label"/> length exceeds <see cref="MaxLabelLength"/>.</exception> | |||||
| public string Label | public string Label | ||||
| { | { | ||||
| get => _label; | get => _label; | ||||
| set | set | ||||
| { | { | ||||
| if (value != null && value.Length > ComponentBuilder.MaxLabelLength) | |||||
| throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); | |||||
| if (value != null && value.Length > MaxLabelLength) | |||||
| throw new ArgumentException(message: $"Button label must be {MaxLabelLength} characters or less!", paramName: nameof(Label)); | |||||
| _label = value; | _label = value; | ||||
| } | } | ||||
| @@ -539,8 +539,8 @@ namespace Discord | |||||
| if (string.IsNullOrEmpty(this.Url)) | if (string.IsNullOrEmpty(this.Url)) | ||||
| throw new InvalidOperationException("Link buttons must have a link associated with them"); | throw new InvalidOperationException("Link buttons must have a link associated with them"); | ||||
| else | else | ||||
| UrlValidation.Validate(this.Url); | |||||
| } | |||||
| UrlValidation.Validate(this.Url); | |||||
| } | |||||
| else if (string.IsNullOrEmpty(this.CustomId)) | else if (string.IsNullOrEmpty(this.CustomId)) | ||||
| throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); | throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); | ||||
| @@ -831,23 +831,28 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| public class SelectMenuOptionBuilder | public class SelectMenuOptionBuilder | ||||
| { | { | ||||
| /// <summary> | |||||
| /// The maximum length of a <see cref="SelectMenuOption.Label"/>. | |||||
| /// </summary> | |||||
| public const int MaxLabelLength = 100; | |||||
| /// <summary> | /// <summary> | ||||
| /// The maximum length of a <see cref="SelectMenuOption.Description"/>. | /// The maximum length of a <see cref="SelectMenuOption.Description"/>. | ||||
| /// </summary> | /// </summary> | ||||
| public const int MaxDescriptionLength = 50; | |||||
| public const int MaxDescriptionLength = 100; | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets or sets the label of the current select menu. | /// Gets or sets the label of the current select menu. | ||||
| /// </summary> | /// </summary> | ||||
| /// <exception cref="ArgumentException" accessor="set"><see cref="Label"/> length exceeds <see cref="ComponentBuilder.MaxLabelLength"/></exception> | |||||
| /// <exception cref="ArgumentException" accessor="set"><see cref="Label"/> length exceeds <see cref="MaxLabelLength"/></exception> | |||||
| public string Label | public string Label | ||||
| { | { | ||||
| get => _label; | get => _label; | ||||
| set | set | ||||
| { | { | ||||
| if (value != null) | if (value != null) | ||||
| if (value.Length > ComponentBuilder.MaxLabelLength) | |||||
| throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); | |||||
| if (value.Length > MaxLabelLength) | |||||
| throw new ArgumentException(message: $"Button label must be {MaxLabelLength} characters or less!", paramName: nameof(Label)); | |||||
| _label = value; | _label = value; | ||||
| } | } | ||||
| @@ -192,7 +192,7 @@ namespace Discord | |||||
| bool manageNicknames = false, | bool manageNicknames = false, | ||||
| bool manageRoles = false, | bool manageRoles = false, | ||||
| bool manageWebhooks = false, | bool manageWebhooks = false, | ||||
| bool manageEmojis = false) | |||||
| bool manageEmojisAndStickers = false) | |||||
| : this(0, | : this(0, | ||||
| createInstantInvite: createInstantInvite, | createInstantInvite: createInstantInvite, | ||||
| manageRoles: manageRoles, | manageRoles: manageRoles, | ||||
| @@ -224,7 +224,7 @@ namespace Discord | |||||
| changeNickname: changeNickname, | changeNickname: changeNickname, | ||||
| manageNicknames: manageNicknames, | manageNicknames: manageNicknames, | ||||
| manageWebhooks: manageWebhooks, | manageWebhooks: manageWebhooks, | ||||
| manageEmojisAndStickers: manageEmojis) | |||||
| manageEmojisAndStickers: manageEmojisAndStickers) | |||||
| { } | { } | ||||
| /// <summary> Creates a new <see cref="GuildPermissions"/> from this one, changing the provided non-null permissions. </summary> | /// <summary> Creates a new <see cref="GuildPermissions"/> from this one, changing the provided non-null permissions. </summary> | ||||
| @@ -259,11 +259,11 @@ namespace Discord | |||||
| bool? manageNicknames = null, | bool? manageNicknames = null, | ||||
| bool? manageRoles = null, | bool? manageRoles = null, | ||||
| bool? manageWebhooks = null, | bool? manageWebhooks = null, | ||||
| bool? manageEmojis = null) | |||||
| bool? manageEmojisAndStickers = null) | |||||
| => new GuildPermissions(RawValue, createInstantInvite, kickMembers, banMembers, administrator, manageChannels, manageGuild, addReactions, | => new GuildPermissions(RawValue, createInstantInvite, kickMembers, banMembers, administrator, manageChannels, manageGuild, addReactions, | ||||
| viewAuditLog, viewGuildInsights, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, | viewAuditLog, viewGuildInsights, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, | ||||
| readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, moveMembers, | readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, moveMembers, | ||||
| useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojis); | |||||
| useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojisAndStickers); | |||||
| /// <summary> | /// <summary> | ||||
| /// Returns a value that indicates if a specific <see cref="GuildPermission"/> is enabled | /// Returns a value that indicates if a specific <see cref="GuildPermission"/> is enabled | ||||
| @@ -10,68 +10,70 @@ namespace Discord | |||||
| [DebuggerDisplay(@"{DebuggerDisplay,nq}")] | [DebuggerDisplay(@"{DebuggerDisplay,nq}")] | ||||
| public struct Color | public struct Color | ||||
| { | { | ||||
| /// <summary> Gets the max decimal value of color. </summary> | |||||
| public const uint MaxDecimalValue = 0xFFFFFF; | |||||
| /// <summary> Gets the default user color value. </summary> | /// <summary> Gets the default user color value. </summary> | ||||
| public static readonly Color Default = new Color(0); | |||||
| public static readonly Color Default = new(0); | |||||
| /// <summary> Gets the teal color value. </summary> | /// <summary> Gets the teal color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/1ABC9C">1ABC9C</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/1ABC9C">1ABC9C</see>.</returns> | ||||
| public static readonly Color Teal = new Color(0x1ABC9C); | |||||
| public static readonly Color Teal = new(0x1ABC9C); | |||||
| /// <summary> Gets the dark teal color value. </summary> | /// <summary> Gets the dark teal color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/11806A">11806A</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/11806A">11806A</see>.</returns> | ||||
| public static readonly Color DarkTeal = new Color(0x11806A); | |||||
| public static readonly Color DarkTeal = new(0x11806A); | |||||
| /// <summary> Gets the green color value. </summary> | /// <summary> Gets the green color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/2ECC71">2ECC71</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/2ECC71">2ECC71</see>.</returns> | ||||
| public static readonly Color Green = new Color(0x2ECC71); | |||||
| public static readonly Color Green = new(0x2ECC71); | |||||
| /// <summary> Gets the dark green color value. </summary> | /// <summary> Gets the dark green color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/1F8B4C">1F8B4C</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/1F8B4C">1F8B4C</see>.</returns> | ||||
| public static readonly Color DarkGreen = new Color(0x1F8B4C); | |||||
| public static readonly Color DarkGreen = new(0x1F8B4C); | |||||
| /// <summary> Gets the blue color value. </summary> | /// <summary> Gets the blue color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/3498DB">3498DB</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/3498DB">3498DB</see>.</returns> | ||||
| public static readonly Color Blue = new Color(0x3498DB); | |||||
| public static readonly Color Blue = new(0x3498DB); | |||||
| /// <summary> Gets the dark blue color value. </summary> | /// <summary> Gets the dark blue color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/206694">206694</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/206694">206694</see>.</returns> | ||||
| public static readonly Color DarkBlue = new Color(0x206694); | |||||
| public static readonly Color DarkBlue = new(0x206694); | |||||
| /// <summary> Gets the purple color value. </summary> | /// <summary> Gets the purple color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/9B59B6">9B59B6</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/9B59B6">9B59B6</see>.</returns> | ||||
| public static readonly Color Purple = new Color(0x9B59B6); | |||||
| public static readonly Color Purple = new(0x9B59B6); | |||||
| /// <summary> Gets the dark purple color value. </summary> | /// <summary> Gets the dark purple color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/71368A">71368A</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/71368A">71368A</see>.</returns> | ||||
| public static readonly Color DarkPurple = new Color(0x71368A); | |||||
| public static readonly Color DarkPurple = new(0x71368A); | |||||
| /// <summary> Gets the magenta color value. </summary> | /// <summary> Gets the magenta color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/E91E63">E91E63</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/E91E63">E91E63</see>.</returns> | ||||
| public static readonly Color Magenta = new Color(0xE91E63); | |||||
| public static readonly Color Magenta = new(0xE91E63); | |||||
| /// <summary> Gets the dark magenta color value. </summary> | /// <summary> Gets the dark magenta color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/AD1457">AD1457</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/AD1457">AD1457</see>.</returns> | ||||
| public static readonly Color DarkMagenta = new Color(0xAD1457); | |||||
| public static readonly Color DarkMagenta = new(0xAD1457); | |||||
| /// <summary> Gets the gold color value. </summary> | /// <summary> Gets the gold color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/F1C40F">F1C40F</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/F1C40F">F1C40F</see>.</returns> | ||||
| public static readonly Color Gold = new Color(0xF1C40F); | |||||
| public static readonly Color Gold = new(0xF1C40F); | |||||
| /// <summary> Gets the light orange color value. </summary> | /// <summary> Gets the light orange color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/C27C0E">C27C0E</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/C27C0E">C27C0E</see>.</returns> | ||||
| public static readonly Color LightOrange = new Color(0xC27C0E); | |||||
| public static readonly Color LightOrange = new(0xC27C0E); | |||||
| /// <summary> Gets the orange color value. </summary> | /// <summary> Gets the orange color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/E67E22">E67E22</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/E67E22">E67E22</see>.</returns> | ||||
| public static readonly Color Orange = new Color(0xE67E22); | |||||
| public static readonly Color Orange = new(0xE67E22); | |||||
| /// <summary> Gets the dark orange color value. </summary> | /// <summary> Gets the dark orange color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/A84300">A84300</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/A84300">A84300</see>.</returns> | ||||
| public static readonly Color DarkOrange = new Color(0xA84300); | |||||
| public static readonly Color DarkOrange = new(0xA84300); | |||||
| /// <summary> Gets the red color value. </summary> | /// <summary> Gets the red color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/E74C3C">E74C3C</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/E74C3C">E74C3C</see>.</returns> | ||||
| public static readonly Color Red = new Color(0xE74C3C); | |||||
| public static readonly Color Red = new(0xE74C3C); | |||||
| /// <summary> Gets the dark red color value. </summary> | /// <summary> Gets the dark red color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/992D22">992D22</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/992D22">992D22</see>.</returns> | ||||
| public static readonly Color DarkRed = new Color(0x992D22); | |||||
| public static readonly Color DarkRed = new(0x992D22); | |||||
| /// <summary> Gets the light grey color value. </summary> | /// <summary> Gets the light grey color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/979C9F">979C9F</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/979C9F">979C9F</see>.</returns> | ||||
| public static readonly Color LightGrey = new Color(0x979C9F); | |||||
| public static readonly Color LightGrey = new(0x979C9F); | |||||
| /// <summary> Gets the lighter grey color value. </summary> | /// <summary> Gets the lighter grey color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/95A5A6">95A5A6</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/95A5A6">95A5A6</see>.</returns> | ||||
| public static readonly Color LighterGrey = new Color(0x95A5A6); | |||||
| public static readonly Color LighterGrey = new(0x95A5A6); | |||||
| /// <summary> Gets the dark grey color value. </summary> | /// <summary> Gets the dark grey color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/607D8B">607D8B</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/607D8B">607D8B</see>.</returns> | ||||
| public static readonly Color DarkGrey = new Color(0x607D8B); | |||||
| public static readonly Color DarkGrey = new(0x607D8B); | |||||
| /// <summary> Gets the darker grey color value. </summary> | /// <summary> Gets the darker grey color value. </summary> | ||||
| /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/546E7A">546E7A</see>.</returns> | /// <returns> A color struct with the hex value of <see href="http://www.color-hex.com/color/546E7A">546E7A</see>.</returns> | ||||
| public static readonly Color DarkerGrey = new Color(0x546E7A); | |||||
| public static readonly Color DarkerGrey = new(0x546E7A); | |||||
| /// <summary> Gets the encoded value for this color. </summary> | /// <summary> Gets the encoded value for this color. </summary> | ||||
| /// <remarks> | /// <remarks> | ||||
| @@ -91,22 +93,27 @@ namespace Discord | |||||
| /// Initializes a <see cref="Color"/> struct with the given raw value. | /// Initializes a <see cref="Color"/> struct with the given raw value. | ||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following will create a color that has a hex value of | |||||
| /// The following will create a color that has a hex value of | |||||
| /// <see href="http://www.color-hex.com/color/607d8b">#607D8B</see>. | /// <see href="http://www.color-hex.com/color/607d8b">#607D8B</see>. | ||||
| /// <code language="cs"> | /// <code language="cs"> | ||||
| /// Color darkGrey = new Color(0x607D8B); | /// Color darkGrey = new Color(0x607D8B); | ||||
| /// </code> | /// </code> | ||||
| /// </example> | /// </example> | ||||
| /// <param name="rawValue">The raw value of the color (e.g. <c>0x607D8B</c>).</param> | /// <param name="rawValue">The raw value of the color (e.g. <c>0x607D8B</c>).</param> | ||||
| /// <exception cref="ArgumentException">Value exceeds <see cref="MaxDecimalValue"/>.</exception> | |||||
| public Color(uint rawValue) | public Color(uint rawValue) | ||||
| { | { | ||||
| if (rawValue > MaxDecimalValue) | |||||
| throw new ArgumentException($"{nameof(RawValue)} of color cannot be greater than {MaxDecimalValue}!", nameof(rawValue)); | |||||
| RawValue = rawValue; | RawValue = rawValue; | ||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| /// Initializes a <see cref="Color" /> struct with the given RGB bytes. | /// Initializes a <see cref="Color" /> struct with the given RGB bytes. | ||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following will create a color that has a value of | |||||
| /// The following will create a color that has a value of | |||||
| /// <see href="http://www.color-hex.com/color/607d8b">#607D8B</see>. | /// <see href="http://www.color-hex.com/color/607d8b">#607D8B</see>. | ||||
| /// <code language="cs"> | /// <code language="cs"> | ||||
| /// Color darkGrey = new Color((byte)0b_01100000, (byte)0b_01111101, (byte)0b_10001011); | /// Color darkGrey = new Color((byte)0b_01100000, (byte)0b_01111101, (byte)0b_10001011); | ||||
| @@ -115,19 +122,24 @@ namespace Discord | |||||
| /// <param name="r">The byte that represents the red color.</param> | /// <param name="r">The byte that represents the red color.</param> | ||||
| /// <param name="g">The byte that represents the green color.</param> | /// <param name="g">The byte that represents the green color.</param> | ||||
| /// <param name="b">The byte that represents the blue color.</param> | /// <param name="b">The byte that represents the blue color.</param> | ||||
| /// <exception cref="ArgumentException">Value exceeds <see cref="MaxDecimalValue"/>.</exception> | |||||
| public Color(byte r, byte g, byte b) | public Color(byte r, byte g, byte b) | ||||
| { | { | ||||
| RawValue = | |||||
| ((uint)r << 16) | | |||||
| ((uint)g << 8) | | |||||
| (uint)b; | |||||
| uint value = ((uint)r << 16) | |||||
| | ((uint)g << 8) | |||||
| | (uint)b; | |||||
| if (value > MaxDecimalValue) | |||||
| throw new ArgumentException($"{nameof(RawValue)} of color cannot be greater than {MaxDecimalValue}!"); | |||||
| RawValue = value; | |||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| /// Initializes a <see cref="Color"/> struct with the given RGB value. | /// Initializes a <see cref="Color"/> struct with the given RGB value. | ||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following will create a color that has a value of | |||||
| /// The following will create a color that has a value of | |||||
| /// <see href="http://www.color-hex.com/color/607d8b">#607D8B</see>. | /// <see href="http://www.color-hex.com/color/607d8b">#607D8B</see>. | ||||
| /// <code language="cs"> | /// <code language="cs"> | ||||
| /// Color darkGrey = new Color(96, 125, 139); | /// Color darkGrey = new Color(96, 125, 139); | ||||
| @@ -145,16 +157,15 @@ namespace Discord | |||||
| throw new ArgumentOutOfRangeException(nameof(g), "Value must be within [0,255]."); | throw new ArgumentOutOfRangeException(nameof(g), "Value must be within [0,255]."); | ||||
| if (b < 0 || b > 255) | if (b < 0 || b > 255) | ||||
| throw new ArgumentOutOfRangeException(nameof(b), "Value must be within [0,255]."); | throw new ArgumentOutOfRangeException(nameof(b), "Value must be within [0,255]."); | ||||
| RawValue = | |||||
| ((uint)r << 16) | | |||||
| ((uint)g << 8) | | |||||
| (uint)b; | |||||
| RawValue = ((uint)r << 16) | |||||
| | ((uint)g << 8) | |||||
| | (uint)b; | |||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| /// Initializes a <see cref="Color"/> struct with the given RGB float value. | /// Initializes a <see cref="Color"/> struct with the given RGB float value. | ||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following will create a color that has a value of | |||||
| /// The following will create a color that has a value of | |||||
| /// <see href="http://www.color-hex.com/color/607c8c">#607c8c</see>. | /// <see href="http://www.color-hex.com/color/607c8c">#607c8c</see>. | ||||
| /// <code language="cs"> | /// <code language="cs"> | ||||
| /// Color darkGrey = new Color(0.38f, 0.49f, 0.55f); | /// Color darkGrey = new Color(0.38f, 0.49f, 0.55f); | ||||
| @@ -172,10 +183,9 @@ namespace Discord | |||||
| throw new ArgumentOutOfRangeException(nameof(g), "Value must be within [0,1]."); | throw new ArgumentOutOfRangeException(nameof(g), "Value must be within [0,1]."); | ||||
| if (b < 0.0f || b > 1.0f) | if (b < 0.0f || b > 1.0f) | ||||
| throw new ArgumentOutOfRangeException(nameof(b), "Value must be within [0,1]."); | throw new ArgumentOutOfRangeException(nameof(b), "Value must be within [0,1]."); | ||||
| RawValue = | |||||
| ((uint)(r * 255.0f) << 16) | | |||||
| ((uint)(g * 255.0f) << 8) | | |||||
| (uint)(b * 255.0f); | |||||
| RawValue = ((uint)(r * 255.0f) << 16) | |||||
| | ((uint)(g * 255.0f) << 8) | |||||
| | (uint)(b * 255.0f); | |||||
| } | } | ||||
| public static bool operator ==(Color lhs, Color rhs) | public static bool operator ==(Color lhs, Color rhs) | ||||
| @@ -184,15 +194,22 @@ namespace Discord | |||||
| public static bool operator !=(Color lhs, Color rhs) | public static bool operator !=(Color lhs, Color rhs) | ||||
| => lhs.RawValue != rhs.RawValue; | => lhs.RawValue != rhs.RawValue; | ||||
| public static implicit operator Color(uint rawValue) | |||||
| => new(rawValue); | |||||
| public static implicit operator uint(Color color) | |||||
| => color.RawValue; | |||||
| public override bool Equals(object obj) | public override bool Equals(object obj) | ||||
| => (obj is Color c && RawValue == c.RawValue); | |||||
| => obj is Color c && RawValue == c.RawValue; | |||||
| public override int GetHashCode() => RawValue.GetHashCode(); | public override int GetHashCode() => RawValue.GetHashCode(); | ||||
| public static implicit operator StandardColor(Color color) => | |||||
| StandardColor.FromArgb((int)color.RawValue); | |||||
| public static explicit operator Color(StandardColor color) => | |||||
| new Color((uint)color.ToArgb() << 8 >> 8); | |||||
| public static implicit operator StandardColor(Color color) | |||||
| => StandardColor.FromArgb((int)color.RawValue); | |||||
| public static explicit operator Color(StandardColor color) | |||||
| => new((uint)color.ToArgb() << 8 >> 8); | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets the hexadecimal representation of the color (e.g. <c>#000ccc</c>). | /// Gets the hexadecimal representation of the color (e.g. <c>#000ccc</c>). | ||||
| @@ -12,17 +12,29 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| string AvatarId { get; } | string AvatarId { get; } | ||||
| /// <summary> | /// <summary> | ||||
| /// Gets the identifier of this user's banner. | |||||
| /// </summary> | |||||
| string BannerId { get; } | |||||
| /// <summary> | |||||
| /// Gets the user's banner color. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// A <see cref="Color"/> struct representing the accent color of this user's banner. | |||||
| /// </returns> | |||||
| Color? AccentColor { get; } | |||||
| /// <summary> | |||||
| /// Gets the avatar URL for this user. | /// Gets the avatar URL for this user. | ||||
| /// </summary> | /// </summary> | ||||
| /// <remarks> | /// <remarks> | ||||
| /// This property retrieves a URL for this user's avatar. In event that the user does not have a valid avatar | /// This property retrieves a URL for this user's avatar. In event that the user does not have a valid avatar | ||||
| /// (i.e. their avatar identifier is not set), this property will return <c>null</c>. If you wish to | |||||
| /// (i.e. their avatar identifier is not set), this method will return <c>null</c>. If you wish to | |||||
| /// retrieve the default avatar for this user, consider using <see cref="IUser.GetDefaultAvatarUrl"/> (see | /// retrieve the default avatar for this user, consider using <see cref="IUser.GetDefaultAvatarUrl"/> (see | ||||
| /// example). | /// example). | ||||
| /// </remarks> | /// </remarks> | ||||
| /// <example> | /// <example> | ||||
| /// <para>The following example attempts to retrieve the user's current avatar and send it to a channel; if one is | |||||
| /// not set, a default avatar for this user will be returned instead.</para> | |||||
| /// <para | |||||
| /// >The following example attempts to retrieve the user's current avatar and send it to a channel; if one is | |||||
| /// not set, a default avatar for this user will be returned instead.</para> | |||||
| /// <code language="cs" region="GetAvatarUrl" | /// <code language="cs" region="GetAvatarUrl" | ||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Users\IUser.Examples.cs"/> | /// source="..\..\..\Discord.Net.Examples\Core\Entities\Users\IUser.Examples.cs"/> | ||||
| /// </example> | /// </example> | ||||
| @@ -34,6 +46,16 @@ namespace Discord | |||||
| /// </returns> | /// </returns> | ||||
| string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128); | string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128); | ||||
| /// <summary> | /// <summary> | ||||
| /// Gets the banner URL for this user. | |||||
| /// </summary> | |||||
| /// <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 banner in place. | |||||
| /// </returns> | |||||
| string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256); | |||||
| /// <summary> | |||||
| /// Gets the default avatar URL for this user. | /// Gets the default avatar URL for this user. | ||||
| /// </summary> | /// </summary> | ||||
| /// <remarks> | /// <remarks> | ||||
| @@ -93,8 +115,8 @@ namespace Discord | |||||
| /// This method is used to obtain or create a channel used to send a direct message. | /// This method is used to obtain or create a channel used to send a direct message. | ||||
| /// <note type="warning"> | /// <note type="warning"> | ||||
| /// In event that the current user cannot send a message to the target user, a channel can and will | /// In event that the current user cannot send a message to the target user, a channel can and will | ||||
| /// still be created by Discord. However, attempting to send a message will yield a | |||||
| /// <see cref="Discord.Net.HttpException"/> with a 403 as its | |||||
| /// still be created by Discord. However, attempting to send a message will yield a | |||||
| /// <see cref="Discord.Net.HttpException"/> with a 403 as its | |||||
| /// <see cref="Discord.Net.HttpException.HttpCode"/>. There are currently no official workarounds by | /// <see cref="Discord.Net.HttpException.HttpCode"/>. There are currently no official workarounds by | ||||
| /// Discord. | /// Discord. | ||||
| /// </note> | /// </note> | ||||
| @@ -15,6 +15,10 @@ namespace Discord.API | |||||
| public Optional<bool> Bot { get; set; } | public Optional<bool> Bot { get; set; } | ||||
| [JsonProperty("avatar")] | [JsonProperty("avatar")] | ||||
| public Optional<string> Avatar { get; set; } | public Optional<string> Avatar { get; set; } | ||||
| [JsonProperty("banner")] | |||||
| public Optional<string> Banner { get; set; } | |||||
| [JsonProperty("accent_color")] | |||||
| public Optional<uint?> AccentColor { get; set; } | |||||
| //CurrentUser | //CurrentUser | ||||
| [JsonProperty("verified")] | [JsonProperty("verified")] | ||||
| @@ -9,7 +9,7 @@ using Model = Discord.API.ThreadMember; | |||||
| namespace Discord.Rest | namespace Discord.Rest | ||||
| { | { | ||||
| /// <summary> | /// <summary> | ||||
| /// Represents a thread user recieved over the REST api. | |||||
| /// Represents a thread user received over the REST api. | |||||
| /// </summary> | /// </summary> | ||||
| public class RestThreadUser : RestEntity<ulong> | public class RestThreadUser : RestEntity<ulong> | ||||
| { | { | ||||
| @@ -51,7 +51,7 @@ namespace Discord.Rest | |||||
| /// Gets the guild user for this thread user. | /// Gets the guild user for this thread user. | ||||
| /// </summary> | /// </summary> | ||||
| /// <returns> | /// <returns> | ||||
| /// A task representing the asyncronous get operation. The task returns a | |||||
| /// A task representing the asynchronous get operation. The task returns a | |||||
| /// <see cref="IGuildUser"/> that represents the current thread user. | /// <see cref="IGuildUser"/> that represents the current thread user. | ||||
| /// </returns> | /// </returns> | ||||
| public Task<IGuildUser> GetGuildUser() | public Task<IGuildUser> GetGuildUser() | ||||
| @@ -22,6 +22,10 @@ namespace Discord.Rest | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public string AvatarId { get; private set; } | public string AvatarId { get; private set; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public string BannerId { get; private set; } | |||||
| /// <inheritdoc /> | |||||
| public Color? AccentColor { get; private set; } | |||||
| /// <inheritdoc /> | |||||
| public UserProperties? PublicFlags { get; private set; } | public UserProperties? PublicFlags { get; private set; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| @@ -61,6 +65,10 @@ namespace Discord.Rest | |||||
| { | { | ||||
| if (model.Avatar.IsSpecified) | if (model.Avatar.IsSpecified) | ||||
| AvatarId = model.Avatar.Value; | AvatarId = model.Avatar.Value; | ||||
| if (model.Banner.IsSpecified) | |||||
| BannerId = model.Banner.Value; | |||||
| if (model.AccentColor.IsSpecified) | |||||
| AccentColor = model.AccentColor.Value; | |||||
| if (model.Discriminator.IsSpecified) | if (model.Discriminator.IsSpecified) | ||||
| DiscriminatorValue = ushort.Parse(model.Discriminator.Value, NumberStyles.None, CultureInfo.InvariantCulture); | DiscriminatorValue = ushort.Parse(model.Discriminator.Value, NumberStyles.None, CultureInfo.InvariantCulture); | ||||
| if (model.Bot.IsSpecified) | if (model.Bot.IsSpecified) | ||||
| @@ -92,6 +100,10 @@ namespace Discord.Rest | |||||
| public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) | public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) | ||||
| => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); | => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); | ||||
| /// <inheritdoc /> | |||||
| public string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256) | |||||
| => CDN.GetUserBannerUrl(Id, BannerId, size, format); | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public string GetDefaultAvatarUrl() | public string GetDefaultAvatarUrl() | ||||
| => CDN.GetDefaultUserAvatarUrl(DiscriminatorValue); | => CDN.GetDefaultUserAvatarUrl(DiscriminatorValue); | ||||
| @@ -12,6 +12,8 @@ namespace Discord.WebSocket | |||||
| public override string Username { get; internal set; } | public override string Username { get; internal set; } | ||||
| public override ushort DiscriminatorValue { get; internal set; } | public override ushort DiscriminatorValue { get; internal set; } | ||||
| public override string AvatarId { get; internal set; } | public override string AvatarId { get; internal set; } | ||||
| public override string BannerId { get; internal set; } | |||||
| public override Color? AccentColor { get; internal set; } | |||||
| internal override SocketPresence Presence { get; set; } | internal override SocketPresence Presence { get; set; } | ||||
| public override bool IsWebhook => false; | public override bool IsWebhook => false; | ||||
| @@ -47,7 +49,7 @@ namespace Discord.WebSocket | |||||
| discord.RemoveUser(Id); | discord.RemoveUser(Id); | ||||
| } | } | ||||
| } | } | ||||
| internal void Update(ClientState state, PresenceModel model) | internal void Update(ClientState state, PresenceModel model) | ||||
| { | { | ||||
| Presence = SocketPresence.Create(model); | Presence = SocketPresence.Create(model); | ||||
| @@ -29,6 +29,10 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } | public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } | |||||
| /// <inheritdoc /> | |||||
| public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } | |||||
| /// <inheritdoc /> | |||||
| internal override SocketPresence Presence { get { return GlobalUser.Presence; } set { GlobalUser.Presence = value; } } | internal override SocketPresence Presence { get { return GlobalUser.Presence; } set { GlobalUser.Presence = value; } } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| @@ -38,6 +38,11 @@ namespace Discord.WebSocket | |||||
| public override ushort DiscriminatorValue { get { return GlobalUser.DiscriminatorValue; } internal set { GlobalUser.DiscriminatorValue = value; } } | public override ushort DiscriminatorValue { get { return GlobalUser.DiscriminatorValue; } internal set { GlobalUser.DiscriminatorValue = value; } } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } | public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } | ||||
| /// <inheritdoc /> | |||||
| public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } | |||||
| /// <inheritdoc /> | |||||
| public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public GuildPermissions GuildPermissions => new GuildPermissions(Permissions.ResolveGuild(Guild, this)); | public GuildPermissions GuildPermissions => new GuildPermissions(Permissions.ResolveGuild(Guild, this)); | ||||
| internal override SocketPresence Presence { get; set; } | internal override SocketPresence Presence { get; set; } | ||||
| @@ -91,7 +96,7 @@ namespace Discord.WebSocket | |||||
| /// Returns the position of the user within the role hierarchy. | /// Returns the position of the user within the role hierarchy. | ||||
| /// </summary> | /// </summary> | ||||
| /// <remarks> | /// <remarks> | ||||
| /// The returned value equal to the position of the highest role the user has, or | |||||
| /// The returned value equal to the position of the highest role the user has, or | |||||
| /// <see cref="int.MaxValue"/> if user is the server owner. | /// <see cref="int.MaxValue"/> if user is the server owner. | ||||
| /// </remarks> | /// </remarks> | ||||
| public int Hierarchy | public int Hierarchy | ||||
| @@ -29,6 +29,10 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } | public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } | |||||
| /// <inheritdoc /> | |||||
| public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } | |||||
| /// <inheritdoc /> | |||||
| internal override SocketPresence Presence { get { return GlobalUser.Presence; } set { GlobalUser.Presence = value; } } | internal override SocketPresence Presence { get { return GlobalUser.Presence; } set { GlobalUser.Presence = value; } } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public UserProperties Flags { get; internal set; } | public UserProperties Flags { get; internal set; } | ||||
| @@ -36,7 +36,7 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public string Nickname | public string Nickname | ||||
| => GuildUser.Nickname; | |||||
| => GuildUser.Nickname; | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public DateTimeOffset? PremiumSince | public DateTimeOffset? PremiumSince | ||||
| @@ -53,6 +53,20 @@ namespace Discord.WebSocket | |||||
| internal set => GuildUser.AvatarId = value; | internal set => GuildUser.AvatarId = value; | ||||
| } | } | ||||
| /// <inheritdoc/> | |||||
| public override string BannerId | |||||
| { | |||||
| get => GuildUser.BannerId; | |||||
| internal set => GuildUser.BannerId = value; | |||||
| } | |||||
| /// <inheritdoc/> | |||||
| public override Color? AccentColor | |||||
| { | |||||
| get => GuildUser.AccentColor; | |||||
| internal set => GuildUser.AccentColor = value; | |||||
| } | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public override ushort DiscriminatorValue | public override ushort DiscriminatorValue | ||||
| { | { | ||||
| @@ -19,9 +19,16 @@ namespace Discord.WebSocket | |||||
| public override ushort DiscriminatorValue { get; internal set; } | public override ushort DiscriminatorValue { get; internal set; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override string AvatarId { get; internal set; } | public override string AvatarId { get; internal set; } | ||||
| /// <inheritdoc /> | |||||
| public override string BannerId { get; internal set; } | |||||
| /// <inheritdoc /> | |||||
| public override Color? AccentColor { get; internal set; } | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override bool IsBot { get; internal set; } | public override bool IsBot { get; internal set; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override bool IsWebhook => false; | public override bool IsWebhook => false; | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| @@ -25,6 +25,10 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public abstract string AvatarId { get; internal set; } | public abstract string AvatarId { get; internal set; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public abstract string BannerId { get; internal set; } | |||||
| /// <inheritdoc /> | |||||
| public abstract Color? AccentColor { get; internal set; } | |||||
| /// <inheritdoc /> | |||||
| public abstract bool IsWebhook { get; } | public abstract bool IsWebhook { get; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public UserProperties? PublicFlags { get; private set; } | public UserProperties? PublicFlags { get; private set; } | ||||
| @@ -64,6 +68,16 @@ namespace Discord.WebSocket | |||||
| AvatarId = model.Avatar.Value; | AvatarId = model.Avatar.Value; | ||||
| hasChanges = true; | hasChanges = true; | ||||
| } | } | ||||
| if (model.Banner.IsSpecified && model.Banner.Value != BannerId) | |||||
| { | |||||
| BannerId = model.Banner.Value; | |||||
| hasChanges = true; | |||||
| } | |||||
| if (model.AccentColor.IsSpecified && model.AccentColor.Value != AccentColor?.RawValue) | |||||
| { | |||||
| AccentColor = model.AccentColor.Value; | |||||
| hasChanges = true; | |||||
| } | |||||
| if (model.Discriminator.IsSpecified) | if (model.Discriminator.IsSpecified) | ||||
| { | { | ||||
| var newVal = ushort.Parse(model.Discriminator.Value, NumberStyles.None, CultureInfo.InvariantCulture); | var newVal = ushort.Parse(model.Discriminator.Value, NumberStyles.None, CultureInfo.InvariantCulture); | ||||
| @@ -99,6 +113,10 @@ namespace Discord.WebSocket | |||||
| public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) | public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) | ||||
| => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); | => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); | ||||
| /// <inheritdoc /> | |||||
| public string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256) | |||||
| => CDN.GetUserBannerUrl(Id, BannerId, size, format); | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public string GetDefaultAvatarUrl() | public string GetDefaultAvatarUrl() | ||||
| => CDN.GetDefaultUserAvatarUrl(DiscriminatorValue); | => CDN.GetDefaultUserAvatarUrl(DiscriminatorValue); | ||||
| @@ -24,6 +24,23 @@ namespace Discord.WebSocket | |||||
| public override ushort DiscriminatorValue { get; internal set; } | public override ushort DiscriminatorValue { get; internal set; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override string AvatarId { get; internal set; } | public override string AvatarId { get; internal set; } | ||||
| /// <inheritdoc /> | |||||
| /// <exception cref="NotSupportedException">Webhook users does not support banners.</exception> | |||||
| public override string BannerId | |||||
| { | |||||
| get => throw new NotSupportedException("Webhook users does not support banners."); | |||||
| internal set => throw new NotSupportedException("Webhook users does not support banners."); | |||||
| } | |||||
| /// <inheritdoc /> | |||||
| /// <exception cref="NotSupportedException">Webhook users does not support accent colors.</exception> | |||||
| public override Color? AccentColor | |||||
| { | |||||
| get => throw new NotSupportedException("Webhook users does not support accent colors."); | |||||
| internal set => throw new NotSupportedException("Webhook users does not support accent colors."); | |||||
| } | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override bool IsBot { get; internal set; } | public override bool IsBot { get; internal set; } | ||||
| @@ -91,7 +91,7 @@ namespace Discord | |||||
| AssertFlag(() => new GuildPermissions(manageNicknames: true), GuildPermission.ManageNicknames); | AssertFlag(() => new GuildPermissions(manageNicknames: true), GuildPermission.ManageNicknames); | ||||
| AssertFlag(() => new GuildPermissions(manageRoles: true), GuildPermission.ManageRoles); | AssertFlag(() => new GuildPermissions(manageRoles: true), GuildPermission.ManageRoles); | ||||
| AssertFlag(() => new GuildPermissions(manageWebhooks: true), GuildPermission.ManageWebhooks); | AssertFlag(() => new GuildPermissions(manageWebhooks: true), GuildPermission.ManageWebhooks); | ||||
| AssertFlag(() => new GuildPermissions(manageEmojis: true), GuildPermission.ManageEmojisAndStickers); | |||||
| AssertFlag(() => new GuildPermissions(manageEmojisAndStickers: true), GuildPermission.ManageEmojisAndStickers); | |||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| @@ -161,7 +161,7 @@ namespace Discord | |||||
| AssertUtil(GuildPermission.ManageNicknames, x => x.ManageNicknames, (p, enable) => p.Modify(manageNicknames: enable)); | AssertUtil(GuildPermission.ManageNicknames, x => x.ManageNicknames, (p, enable) => p.Modify(manageNicknames: enable)); | ||||
| AssertUtil(GuildPermission.ManageRoles, x => x.ManageRoles, (p, enable) => p.Modify(manageRoles: enable)); | AssertUtil(GuildPermission.ManageRoles, x => x.ManageRoles, (p, enable) => p.Modify(manageRoles: enable)); | ||||
| AssertUtil(GuildPermission.ManageWebhooks, x => x.ManageWebhooks, (p, enable) => p.Modify(manageWebhooks: enable)); | AssertUtil(GuildPermission.ManageWebhooks, x => x.ManageWebhooks, (p, enable) => p.Modify(manageWebhooks: enable)); | ||||
| AssertUtil(GuildPermission.ManageEmojisAndStickers, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojis: enable)); | |||||
| AssertUtil(GuildPermission.ManageEmojisAndStickers, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojisAndStickers: enable)); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||