* 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 /> | ||||