* Add new message types & error codes * add role subscription system channel flags and message propertypull/2572/head
| @@ -98,13 +98,14 @@ namespace Discord | |||||
| MaximumStickersReached = 30039, | MaximumStickersReached = 30039, | ||||
| MaximumPruneRequestReached = 30040, | MaximumPruneRequestReached = 30040, | ||||
| MaximumGuildWidgetsReached = 30042, | MaximumGuildWidgetsReached = 30042, | ||||
| #endregion | |||||
| #region General Request Errors (40XXX) | |||||
| BitrateIsTooHighForChannelOfThisType = 30052, | BitrateIsTooHighForChannelOfThisType = 30052, | ||||
| MaximumNumberOfEditsReached = 30046, | MaximumNumberOfEditsReached = 30046, | ||||
| MaximumNumberOfPinnedThreadsInAForumChannelReached = 30047, | MaximumNumberOfPinnedThreadsInAForumChannelReached = 30047, | ||||
| MaximumNumberOfTagsInAForumChannelReached = 30048, | MaximumNumberOfTagsInAForumChannelReached = 30048, | ||||
| MaximumNumberOfWebhooksReached = 30058, | |||||
| #endregion | |||||
| #region General Request Errors (40XXX) | |||||
| TokenUnauthorized = 40001, | TokenUnauthorized = 40001, | ||||
| InvalidVerification = 40002, | InvalidVerification = 40002, | ||||
| OpeningDMTooFast = 40003, | OpeningDMTooFast = 40003, | ||||
| @@ -118,10 +119,11 @@ namespace Discord | |||||
| ApplicationNameAlreadyExists = 40041, | ApplicationNameAlreadyExists = 40041, | ||||
| ApplicationInteractionFailedToSend = 40043, | ApplicationInteractionFailedToSend = 40043, | ||||
| CannotSendAMessageInAForumChannel = 40058, | CannotSendAMessageInAForumChannel = 40058, | ||||
| ThereAreNoTagsAvailableThatCanBeSetByNonModerators = 40066, | |||||
| ATagIsRequiredToCreateAForumPostInThisChannel = 40067, | |||||
| InteractionHasAlreadyBeenAcknowledged = 40060, | InteractionHasAlreadyBeenAcknowledged = 40060, | ||||
| TagNamesMustBeUnique = 40061, | TagNamesMustBeUnique = 40061, | ||||
| ServiceResourceIsBeingRateLimited = 40062, | |||||
| ThereAreNoTagsAvailableThatCanBeSetByNonModerators = 40066, | |||||
| ATagIsRequiredToCreateAForumPostInThisChannel = 40067, | |||||
| #endregion | #endregion | ||||
| #region Action Preconditions/Checks (50XXX) | #region Action Preconditions/Checks (50XXX) | ||||
| @@ -160,6 +162,7 @@ namespace Discord | |||||
| InvalidFileUpload = 50046, | InvalidFileUpload = 50046, | ||||
| CannotSelfRedeemGift = 50054, | CannotSelfRedeemGift = 50054, | ||||
| InvalidGuild = 50055, | InvalidGuild = 50055, | ||||
| InvalidRequestOrigin = 50067, | |||||
| InvalidMessageType = 50068, | InvalidMessageType = 50068, | ||||
| PaymentSourceRequiredForGift = 50070, | PaymentSourceRequiredForGift = 50070, | ||||
| CannotModifySystemWebhook = 50073, | CannotModifySystemWebhook = 50073, | ||||
| @@ -13,18 +13,28 @@ namespace Discord | |||||
| /// <summary> | /// <summary> | ||||
| /// Deny the messages that are sent when a user joins the guild. | /// Deny the messages that are sent when a user joins the guild. | ||||
| /// </summary> | /// </summary> | ||||
| WelcomeMessage = 0b1, | |||||
| WelcomeMessage = 1 << 0, | |||||
| /// <summary> | /// <summary> | ||||
| /// Deny the messages that are sent when a user boosts the guild. | /// Deny the messages that are sent when a user boosts the guild. | ||||
| /// </summary> | /// </summary> | ||||
| GuildBoost = 0b10, | |||||
| GuildBoost = 1 << 1, | |||||
| /// <summary> | /// <summary> | ||||
| /// Deny the messages that are related to guild setup. | /// Deny the messages that are related to guild setup. | ||||
| /// </summary> | /// </summary> | ||||
| GuildSetupTip = 0b100, | |||||
| GuildSetupTip = 1 << 2, | |||||
| /// <summary> | /// <summary> | ||||
| /// Deny the reply with sticker button on welcome messages. | /// Deny the reply with sticker button on welcome messages. | ||||
| /// </summary> | /// </summary> | ||||
| WelcomeMessageReply = 0b1000 | |||||
| WelcomeMessageReply = 1 << 3, | |||||
| /// <summary> | |||||
| /// Deny role subscription purchase and renewal notifications in the guild. | |||||
| /// </summary> | |||||
| RoleSubscriptionPurchase = 1 << 4, | |||||
| /// <summary> | |||||
| /// Hide role subscription sticker reply buttons in the guild. | |||||
| /// </summary> | |||||
| RoleSubscriptionPurchaseReplies = 1 << 5, | |||||
| } | } | ||||
| } | } | ||||
| @@ -209,6 +209,14 @@ namespace Discord | |||||
| /// </returns> | /// </returns> | ||||
| IMessageInteraction Interaction { get; } | IMessageInteraction Interaction { get; } | ||||
| /// <summary> | |||||
| /// Gets the data of the role subscription purchase or renewal that prompted this <see cref="MessageType.RoleSubscriptionPurchase"/> message. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// A <see cref="MessageRoleSubscriptionData"/> if the message is a role subscription purchase message; otherwise <see langword="null"/>. | |||||
| /// </returns> | |||||
| MessageRoleSubscriptionData RoleSubscriptionData { get; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Adds a reaction to this message. | /// Adds a reaction to this message. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -0,0 +1,35 @@ | |||||
| namespace Discord; | |||||
| /// <summary> | |||||
| /// Represents a role subscription data in <see cref="IMessage"/>. | |||||
| /// </summary> | |||||
| public class MessageRoleSubscriptionData | |||||
| { | |||||
| /// <summary> | |||||
| /// Gets the id of the sku and listing that the user is subscribed to. | |||||
| /// </summary> | |||||
| public ulong Id { get; } | |||||
| /// <summary> | |||||
| /// Gets the name of the tier that the user is subscribed to. | |||||
| /// </summary> | |||||
| public string TierName { get; } | |||||
| /// <summary> | |||||
| /// Gets the cumulative number of months that the user has been subscribed for. | |||||
| /// </summary> | |||||
| public int MonthsSubscribed { get; } | |||||
| /// <summary> | |||||
| /// Gets whether this notification is for a renewal rather than a new purchase. | |||||
| /// </summary> | |||||
| public bool IsRenewal { get; } | |||||
| internal MessageRoleSubscriptionData(ulong id, string tierName, int monthsSubscribed, bool isRenewal) | |||||
| { | |||||
| Id = id; | |||||
| TierName = tierName; | |||||
| MonthsSubscribed = monthsSubscribed; | |||||
| IsRenewal = isRenewal; | |||||
| } | |||||
| } | |||||
| @@ -99,12 +99,48 @@ namespace Discord | |||||
| /// </remarks> | /// </remarks> | ||||
| ThreadStarterMessage = 21, | ThreadStarterMessage = 21, | ||||
| /// <summary> | /// <summary> | ||||
| /// The message for a invite reminder. | |||||
| /// The message for an invite reminder. | |||||
| /// </summary> | /// </summary> | ||||
| GuildInviteReminder = 22, | GuildInviteReminder = 22, | ||||
| /// <summary> | /// <summary> | ||||
| /// The message for a context menu command. | /// The message for a context menu command. | ||||
| /// </summary> | /// </summary> | ||||
| ContextMenuCommand = 23, | ContextMenuCommand = 23, | ||||
| /// <summary> | |||||
| /// The message for an automod action. | |||||
| /// </summary> | |||||
| AutoModerationAction = 24, | |||||
| /// <summary> | |||||
| /// The message for a role subscription purchase. | |||||
| /// </summary> | |||||
| RoleSubscriptionPurchase = 25, | |||||
| /// <summary> | |||||
| /// The message for an interaction premium upsell. | |||||
| /// </summary> | |||||
| InteractionPremiumUpsell = 26, | |||||
| /// <summary> | |||||
| /// The message for a stage start. | |||||
| /// </summary> | |||||
| StageStart = 27, | |||||
| /// <summary> | |||||
| /// The message for a stage end. | |||||
| /// </summary> | |||||
| StageEnd = 28, | |||||
| /// <summary> | |||||
| /// The message for a stage speaker. | |||||
| /// </summary> | |||||
| StageSpeaker = 29, | |||||
| /// <summary> | |||||
| /// The message for a stage raise hand. | |||||
| /// </summary> | |||||
| StageRaiseHand = 30, | |||||
| /// <summary> | |||||
| /// The message for a stage raise hand. | |||||
| /// </summary> | |||||
| StageTopic = 31, | |||||
| /// <summary> | |||||
| /// The message for a guild application premium subscription. | |||||
| /// </summary> | |||||
| GuildApplicationPremiumSubscription = 32 | |||||
| } | } | ||||
| } | } | ||||
| @@ -62,5 +62,7 @@ namespace Discord.API | |||||
| public Optional<MessageInteraction> Interaction { get; set; } | public Optional<MessageInteraction> Interaction { get; set; } | ||||
| [JsonProperty("sticker_items")] | [JsonProperty("sticker_items")] | ||||
| public Optional<StickerItem[]> StickerItems { get; set; } | public Optional<StickerItem[]> StickerItems { get; set; } | ||||
| [JsonProperty("role_subscription_data")] | |||||
| public Optional<MessageRoleSubscriptionData> RoleSubscriptionData { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,18 @@ | |||||
| using Newtonsoft.Json; | |||||
| namespace Discord.API; | |||||
| internal class MessageRoleSubscriptionData | |||||
| { | |||||
| [JsonProperty("role_subscription_listing_id")] | |||||
| public ulong SubscriptionListingId { get; set; } | |||||
| [JsonProperty("tier_name")] | |||||
| public string TierName { get; set; } | |||||
| [JsonProperty("total_months_subscribed")] | |||||
| public int MonthsSubscribed { get; set; } | |||||
| [JsonProperty("is_renewal")] | |||||
| public bool IsRenewal { get; set; } | |||||
| } | |||||
| @@ -80,6 +80,9 @@ namespace Discord.Rest | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public MessageType Type { get; private set; } | public MessageType Type { get; private set; } | ||||
| /// <inheritdoc /> | |||||
| public MessageRoleSubscriptionData RoleSubscriptionData { get; private set; } | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public IReadOnlyCollection<ActionRowComponent> Components { get; private set; } | public IReadOnlyCollection<ActionRowComponent> Components { get; private set; } | ||||
| /// <summary> | /// <summary> | ||||
| @@ -243,6 +246,15 @@ namespace Discord.Rest | |||||
| _userMentions = newMentions.ToImmutable(); | _userMentions = newMentions.ToImmutable(); | ||||
| } | } | ||||
| } | } | ||||
| if (model.RoleSubscriptionData.IsSpecified) | |||||
| { | |||||
| RoleSubscriptionData = new( | |||||
| model.RoleSubscriptionData.Value.SubscriptionListingId, | |||||
| model.RoleSubscriptionData.Value.TierName, | |||||
| model.RoleSubscriptionData.Value.MonthsSubscribed, | |||||
| model.RoleSubscriptionData.Value.IsRenewal); | |||||
| } | |||||
| } | } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public async Task UpdateAsync(RequestOptions options = null) | public async Task UpdateAsync(RequestOptions options = null) | ||||
| @@ -78,6 +78,9 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public MessageType Type { get; private set; } | public MessageType Type { get; private set; } | ||||
| /// <inheritdoc /> | |||||
| public MessageRoleSubscriptionData RoleSubscriptionData { get; private set; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Returns all attachments included in this message. | /// Returns all attachments included in this message. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -271,6 +274,15 @@ namespace Discord.WebSocket | |||||
| if (model.Flags.IsSpecified) | if (model.Flags.IsSpecified) | ||||
| Flags = model.Flags.Value; | Flags = model.Flags.Value; | ||||
| if (model.RoleSubscriptionData.IsSpecified) | |||||
| { | |||||
| RoleSubscriptionData = new( | |||||
| model.RoleSubscriptionData.Value.SubscriptionListingId, | |||||
| model.RoleSubscriptionData.Value.TierName, | |||||
| model.RoleSubscriptionData.Value.MonthsSubscribed, | |||||
| model.RoleSubscriptionData.Value.IsRenewal); | |||||
| } | |||||
| } | } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||