| @@ -1085,6 +1085,21 @@ | |||||
| A sticker was deleted. | A sticker was deleted. | ||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.ActionType.ThreadCreate"> | |||||
| <summary> | |||||
| A thread was created. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="F:Discord.ActionType.ThreadUpdate"> | |||||
| <summary> | |||||
| A thread was updated. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="F:Discord.ActionType.ThreadDelete"> | |||||
| <summary> | |||||
| A thread was deleted. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="T:Discord.IAuditLogData"> | <member name="T:Discord.IAuditLogData"> | ||||
| <summary> | <summary> | ||||
| Represents data applied to an <see cref="T:Discord.IAuditLogEntry"/>. | Represents data applied to an <see cref="T:Discord.IAuditLogEntry"/>. | ||||
| @@ -4981,7 +4996,7 @@ | |||||
| </member> | </member> | ||||
| <member name="P:Discord.IApplicationCommandOption.ChannelTypes"> | <member name="P:Discord.IApplicationCommandOption.ChannelTypes"> | ||||
| <summary> | <summary> | ||||
| The allowed channel types for this option. | |||||
| The allowed channel types for this option. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="T:Discord.IApplicationCommandOptionChoice"> | <member name="T:Discord.IApplicationCommandOptionChoice"> | ||||
| @@ -8286,15 +8301,15 @@ | |||||
| The message is an inline reply. | The message is an inline reply. | ||||
| </summary> | </summary> | ||||
| <remarks> | <remarks> | ||||
| Only available in API v8 | |||||
| Only available in API v8. | |||||
| </remarks> | </remarks> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.MessageType.ApplicationCommand"> | <member name="F:Discord.MessageType.ApplicationCommand"> | ||||
| <summary> | <summary> | ||||
| The message is an Application Command | |||||
| The message is an Application Command. | |||||
| </summary> | </summary> | ||||
| <remarks> | <remarks> | ||||
| Only available in API v8 | |||||
| Only available in API v8. | |||||
| </remarks> | </remarks> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.MessageType.ThreadStarterMessage"> | <member name="F:Discord.MessageType.ThreadStarterMessage"> | ||||
| @@ -8302,12 +8317,17 @@ | |||||
| The message that starts a thread. | The message that starts a thread. | ||||
| </summary> | </summary> | ||||
| <remarks> | <remarks> | ||||
| Only available in API v9 | |||||
| Only available in API v9. | |||||
| </remarks> | </remarks> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.MessageType.GuildInviteReminder"> | <member name="F:Discord.MessageType.GuildInviteReminder"> | ||||
| <summary> | <summary> | ||||
| The message for a invite reminder | |||||
| The message for a invite reminder. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="F:Discord.MessageType.ContextMenuCommand"> | |||||
| <summary> | |||||
| The message for a context menu command. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="T:Discord.ReactionMetadata"> | <member name="T:Discord.ReactionMetadata"> | ||||
| @@ -81,26 +81,30 @@ namespace Discord | |||||
| /// The message is an inline reply. | /// The message is an inline reply. | ||||
| /// </summary> | /// </summary> | ||||
| /// <remarks> | /// <remarks> | ||||
| /// Only available in API v8 | |||||
| /// Only available in API v8. | |||||
| /// </remarks> | /// </remarks> | ||||
| Reply = 19, | Reply = 19, | ||||
| /// <summary> | /// <summary> | ||||
| /// The message is an Application Command | |||||
| /// The message is an Application Command. | |||||
| /// </summary> | /// </summary> | ||||
| /// <remarks> | /// <remarks> | ||||
| /// Only available in API v8 | |||||
| /// Only available in API v8. | |||||
| /// </remarks> | /// </remarks> | ||||
| ApplicationCommand = 20, | ApplicationCommand = 20, | ||||
| /// <summary> | /// <summary> | ||||
| /// The message that starts a thread. | /// The message that starts a thread. | ||||
| /// </summary> | /// </summary> | ||||
| /// <remarks> | /// <remarks> | ||||
| /// Only available in API v9 | |||||
| /// Only available in API v9. | |||||
| /// </remarks> | /// </remarks> | ||||
| ThreadStarterMessage = 21, | ThreadStarterMessage = 21, | ||||
| /// <summary> | /// <summary> | ||||
| /// The message for a invite reminder | |||||
| /// The message for a invite reminder. | |||||
| /// </summary> | /// </summary> | ||||
| GuildInviteReminder = 22 | |||||
| GuildInviteReminder = 22, | |||||
| /// <summary> | |||||
| /// The message for a context menu command. | |||||
| /// </summary> | |||||
| ContextMenuCommand = 23, | |||||
| } | } | ||||
| } | } | ||||
| @@ -32,7 +32,7 @@ namespace Discord.API | |||||
| [JsonProperty("mention_everyone")] | [JsonProperty("mention_everyone")] | ||||
| public Optional<bool> MentionEveryone { get; set; } | public Optional<bool> MentionEveryone { get; set; } | ||||
| [JsonProperty("mentions")] | [JsonProperty("mentions")] | ||||
| public Optional<EntityOrId<User>[]> UserMentions { get; set; } | |||||
| public Optional<User[]> UserMentions { get; set; } | |||||
| [JsonProperty("mention_roles")] | [JsonProperty("mention_roles")] | ||||
| public Optional<ulong[]> RoleMentions { get; set; } | public Optional<ulong[]> RoleMentions { get; set; } | ||||
| [JsonProperty("attachments")] | [JsonProperty("attachments")] | ||||
| @@ -1507,6 +1507,96 @@ | |||||
| A role information object containing the role information after the changes were made. | A role information object containing the role information after the changes were made. | ||||
| </returns> | </returns> | ||||
| </member> | </member> | ||||
| <member name="T:Discord.Rest.StageInfo"> | |||||
| <summary> | |||||
| Represents information for a stage. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInfo.Topic"> | |||||
| <summary> | |||||
| Gets the topic of the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInfo.PrivacyLevel"> | |||||
| <summary> | |||||
| Gets the privacy level of the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInfo.User"> | |||||
| <summary> | |||||
| Gets the user who started the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="T:Discord.Rest.StageInstanceCreateAuditLogData"> | |||||
| <summary> | |||||
| Contains a piece of audit log data related to a stage going live. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceCreateAuditLogData.Topic"> | |||||
| <summary> | |||||
| Gets the topic of the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceCreateAuditLogData.PrivacyLevel"> | |||||
| <summary> | |||||
| Gets the privacy level of the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceCreateAuditLogData.User"> | |||||
| <summary> | |||||
| Gets the user who started the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceCreateAuditLogData.StageChannelId"> | |||||
| <summary> | |||||
| Gets the Id of the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="T:Discord.Rest.StageInstanceDeleteAuditLogData"> | |||||
| <summary> | |||||
| Contains a piece of audit log data related to a stage instance deleted. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceDeleteAuditLogData.Topic"> | |||||
| <summary> | |||||
| Gets the topic of the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceDeleteAuditLogData.PrivacyLevel"> | |||||
| <summary> | |||||
| Gets the privacy level of the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceDeleteAuditLogData.User"> | |||||
| <summary> | |||||
| Gets the user who started the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceDeleteAuditLogData.StageChannelId"> | |||||
| <summary> | |||||
| Gets the Id of the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="T:Discord.Rest.StageInstanceUpdatedAuditLogData"> | |||||
| <summary> | |||||
| Contains a piece of audit log data related to a stage instance update. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceUpdatedAuditLogData.StageChannelId"> | |||||
| <summary> | |||||
| Gets the Id of the stage channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceUpdatedAuditLogData.Before"> | |||||
| <summary> | |||||
| Gets the stage information before the changes. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.StageInstanceUpdatedAuditLogData.After"> | |||||
| <summary> | |||||
| Gets the stage information after the changes. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="T:Discord.Rest.UnbanAuditLogData"> | <member name="T:Discord.Rest.UnbanAuditLogData"> | ||||
| <summary> | <summary> | ||||
| Contains a piece of audit log data related to an unban. | Contains a piece of audit log data related to an unban. | ||||
| @@ -4031,7 +4121,7 @@ | |||||
| </member> | </member> | ||||
| <member name="P:Discord.Rest.RestApplicationCommandOption.ChannelTypes"> | <member name="P:Discord.Rest.RestApplicationCommandOption.ChannelTypes"> | ||||
| <summary> | <summary> | ||||
| The allowed channel types for this option. | |||||
| The allowed channel types for this option. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="T:Discord.Rest.RestGlobalCommand"> | <member name="T:Discord.Rest.RestGlobalCommand"> | ||||
| @@ -4341,11 +4431,6 @@ | |||||
| <member name="P:Discord.Rest.RestMessage.MentionedRoleIds"> | <member name="P:Discord.Rest.RestMessage.MentionedRoleIds"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.Rest.RestMessage.MentionedUsers"> | |||||
| <summary> | |||||
| Gets a collection of the mentioned users in the message. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.RestMessage.Tags"> | <member name="P:Discord.Rest.RestMessage.Tags"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| @@ -4373,6 +4458,11 @@ | |||||
| <member name="P:Discord.Rest.RestMessage.Components"> | <member name="P:Discord.Rest.RestMessage.Components"> | ||||
| <inheritdoc/> | <inheritdoc/> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.Rest.RestMessage.MentionedUsers"> | |||||
| <summary> | |||||
| Gets a collection of the mentioned users in the message. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="M:Discord.Rest.RestMessage.UpdateAsync(Discord.RequestOptions)"> | <member name="M:Discord.Rest.RestMessage.UpdateAsync(Discord.RequestOptions)"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| @@ -4478,9 +4568,6 @@ | |||||
| <member name="P:Discord.Rest.RestUserMessage.MentionedRoleIds"> | <member name="P:Discord.Rest.RestUserMessage.MentionedRoleIds"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.Rest.RestUserMessage.MentionedUsers"> | |||||
| <inheritdoc /> | |||||
| </member> | |||||
| <member name="P:Discord.Rest.RestUserMessage.Tags"> | <member name="P:Discord.Rest.RestUserMessage.Tags"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| @@ -15,6 +15,7 @@ namespace Discord.Rest | |||||
| { | { | ||||
| private long _timestampTicks; | private long _timestampTicks; | ||||
| private ImmutableArray<RestReaction> _reactions = ImmutableArray.Create<RestReaction>(); | private ImmutableArray<RestReaction> _reactions = ImmutableArray.Create<RestReaction>(); | ||||
| private ImmutableArray<RestUser> _userMentions = ImmutableArray.Create<RestUser>(); | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public IMessageChannel Channel { get; } | public IMessageChannel Channel { get; } | ||||
| @@ -56,10 +57,6 @@ namespace Discord.Rest | |||||
| public virtual IReadOnlyCollection<ulong> MentionedChannelIds => ImmutableArray.Create<ulong>(); | public virtual IReadOnlyCollection<ulong> MentionedChannelIds => ImmutableArray.Create<ulong>(); | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public virtual IReadOnlyCollection<ulong> MentionedRoleIds => ImmutableArray.Create<ulong>(); | public virtual IReadOnlyCollection<ulong> MentionedRoleIds => ImmutableArray.Create<ulong>(); | ||||
| /// <summary> | |||||
| /// Gets a collection of the mentioned users in the message. | |||||
| /// </summary> | |||||
| public virtual IReadOnlyCollection<RestUser> MentionedUsers => ImmutableArray.Create<RestUser>(); | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public virtual IReadOnlyCollection<ITag> Tags => ImmutableArray.Create<ITag>(); | public virtual IReadOnlyCollection<ITag> Tags => ImmutableArray.Create<ITag>(); | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| @@ -80,6 +77,10 @@ namespace Discord.Rest | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public IReadOnlyCollection<ActionRowComponent> Components { get; private set; } | public IReadOnlyCollection<ActionRowComponent> Components { get; private set; } | ||||
| /// <summary> | |||||
| /// Gets a collection of the mentioned users in the message. | |||||
| /// </summary> | |||||
| public IReadOnlyCollection<RestUser> MentionedUsers => _userMentions; | |||||
| internal RestMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author, MessageSource source) | internal RestMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author, MessageSource source) | ||||
| : base(discord, id) | : base(discord, id) | ||||
| @@ -210,6 +211,22 @@ namespace Discord.Rest | |||||
| } | } | ||||
| else | else | ||||
| _reactions = ImmutableArray.Create<RestReaction>(); | _reactions = ImmutableArray.Create<RestReaction>(); | ||||
| if (model.UserMentions.IsSpecified) | |||||
| { | |||||
| var value = model.UserMentions.Value; | |||||
| if (value.Length > 0) | |||||
| { | |||||
| var newMentions = ImmutableArray.CreateBuilder<RestUser>(value.Length); | |||||
| for (int i = 0; i < value.Length; i++) | |||||
| { | |||||
| var val = value[i]; | |||||
| if (val != null) | |||||
| newMentions.Add(RestUser.Create(Discord, val)); | |||||
| } | |||||
| _userMentions = newMentions.ToImmutable(); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public async Task UpdateAsync(RequestOptions options = null) | public async Task UpdateAsync(RequestOptions options = null) | ||||
| @@ -20,7 +20,6 @@ namespace Discord.Rest | |||||
| private ImmutableArray<Embed> _embeds = ImmutableArray.Create<Embed>(); | private ImmutableArray<Embed> _embeds = ImmutableArray.Create<Embed>(); | ||||
| private ImmutableArray<ITag> _tags = ImmutableArray.Create<ITag>(); | private ImmutableArray<ITag> _tags = ImmutableArray.Create<ITag>(); | ||||
| private ImmutableArray<ulong> _roleMentionIds = ImmutableArray.Create<ulong>(); | private ImmutableArray<ulong> _roleMentionIds = ImmutableArray.Create<ulong>(); | ||||
| private ImmutableArray<RestUser> _userMentions = ImmutableArray.Create<RestUser>(); | |||||
| private ImmutableArray<StickerItem> _stickers = ImmutableArray.Create<StickerItem>(); | private ImmutableArray<StickerItem> _stickers = ImmutableArray.Create<StickerItem>(); | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| @@ -42,8 +41,6 @@ namespace Discord.Rest | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override IReadOnlyCollection<ulong> MentionedRoleIds => _roleMentionIds; | public override IReadOnlyCollection<ulong> MentionedRoleIds => _roleMentionIds; | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override IReadOnlyCollection<RestUser> MentionedUsers => _userMentions; | |||||
| /// <inheritdoc /> | |||||
| public override IReadOnlyCollection<ITag> Tags => _tags; | public override IReadOnlyCollection<ITag> Tags => _tags; | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override IReadOnlyCollection<StickerItem> Stickers => _stickers; | public override IReadOnlyCollection<StickerItem> Stickers => _stickers; | ||||
| @@ -104,28 +101,12 @@ namespace Discord.Rest | |||||
| _embeds = ImmutableArray.Create<Embed>(); | _embeds = ImmutableArray.Create<Embed>(); | ||||
| } | } | ||||
| if (model.UserMentions.IsSpecified) | |||||
| { | |||||
| var value = model.UserMentions.Value; | |||||
| if (value.Length > 0) | |||||
| { | |||||
| var newMentions = ImmutableArray.CreateBuilder<RestUser>(value.Length); | |||||
| for (int i = 0; i < value.Length; i++) | |||||
| { | |||||
| var val = value[i]; | |||||
| if (val.Object != null) | |||||
| newMentions.Add(RestUser.Create(Discord, val.Object)); | |||||
| } | |||||
| _userMentions = newMentions.ToImmutable(); | |||||
| } | |||||
| } | |||||
| var guildId = (Channel as IGuildChannel)?.GuildId; | var guildId = (Channel as IGuildChannel)?.GuildId; | ||||
| var guild = guildId != null ? (Discord as IDiscordClient).GetGuildAsync(guildId.Value, CacheMode.CacheOnly).Result : null; | var guild = guildId != null ? (Discord as IDiscordClient).GetGuildAsync(guildId.Value, CacheMode.CacheOnly).Result : null; | ||||
| if (model.Content.IsSpecified) | if (model.Content.IsSpecified) | ||||
| { | { | ||||
| var text = model.Content.Value; | var text = model.Content.Value; | ||||
| _tags = MessageHelper.ParseTags(text, null, guild, _userMentions); | |||||
| _tags = MessageHelper.ParseTags(text, null, guild, MentionedUsers); | |||||
| model.Content = text; | model.Content = text; | ||||
| } | } | ||||
| @@ -3933,7 +3933,7 @@ | |||||
| <member name="M:Discord.WebSocket.SocketMessageComponent.FollowupAsync(System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | <member name="M:Discord.WebSocket.SocketMessageComponent.FollowupAsync(System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | ||||
| <inheritdoc/> | <inheritdoc/> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketMessageComponent.FollowupWithFileAsync(System.String,System.IO.Stream,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <member name="M:Discord.WebSocket.SocketMessageComponent.FollowupWithFileAsync(System.IO.Stream,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <inheritdoc/> | <inheritdoc/> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketMessageComponent.FollowupWithFileAsync(System.String,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | <member name="M:Discord.WebSocket.SocketMessageComponent.FollowupWithFileAsync(System.String,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | ||||
| @@ -4020,7 +4020,7 @@ | |||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.FollowupAsync(System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.FollowupAsync(System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | ||||
| <inheritdoc/> | <inheritdoc/> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.FollowupWithFileAsync(System.String,System.IO.Stream,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.FollowupWithFileAsync(System.IO.Stream,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <inheritdoc/> | <inheritdoc/> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.FollowupWithFileAsync(System.String,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.FollowupWithFileAsync(System.String,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | ||||
| @@ -4191,7 +4191,7 @@ | |||||
| </member> | </member> | ||||
| <member name="P:Discord.WebSocket.SocketApplicationCommandOption.ChannelTypes"> | <member name="P:Discord.WebSocket.SocketApplicationCommandOption.ChannelTypes"> | ||||
| <summary> | <summary> | ||||
| The allowed channel types for this option. | |||||
| The allowed channel types for this option. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="T:Discord.WebSocket.SocketCommandBase"> | <member name="T:Discord.WebSocket.SocketCommandBase"> | ||||
| @@ -4220,7 +4220,7 @@ | |||||
| <member name="M:Discord.WebSocket.SocketCommandBase.FollowupAsync(System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | <member name="M:Discord.WebSocket.SocketCommandBase.FollowupAsync(System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | ||||
| <inheritdoc/> | <inheritdoc/> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketCommandBase.FollowupWithFileAsync(System.String,System.IO.Stream,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <member name="M:Discord.WebSocket.SocketCommandBase.FollowupWithFileAsync(System.IO.Stream,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <inheritdoc/> | <inheritdoc/> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketCommandBase.FollowupWithFileAsync(System.String,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | <member name="M:Discord.WebSocket.SocketCommandBase.FollowupWithFileAsync(System.String,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | ||||
| @@ -4326,7 +4326,7 @@ | |||||
| The sent message. | The sent message. | ||||
| </returns> | </returns> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketInteraction.FollowupWithFileAsync(System.String,System.IO.Stream,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <member name="M:Discord.WebSocket.SocketInteraction.FollowupWithFileAsync(System.IO.Stream,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <summary> | <summary> | ||||
| Sends a followup message for this interaction. | Sends a followup message for this interaction. | ||||
| </summary> | </summary> | ||||
| @@ -4366,7 +4366,7 @@ | |||||
| <summary> | <summary> | ||||
| Gets the original response for this interaction. | Gets the original response for this interaction. | ||||
| </summary> | </summary> | ||||
| <param name="options">The request options for this async request.</param> | |||||
| <param name="options">The request options for this <see langword="async"/> request.</param> | |||||
| <returns>A <see cref="T:Discord.Rest.RestInteractionMessage"/> that represents the initial response.</returns> | <returns>A <see cref="T:Discord.Rest.RestInteractionMessage"/> that represents the initial response.</returns> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketInteraction.ModifyOriginalResponseAsync(System.Action{Discord.MessageProperties},Discord.RequestOptions)"> | <member name="M:Discord.WebSocket.SocketInteraction.ModifyOriginalResponseAsync(System.Action{Discord.MessageProperties},Discord.RequestOptions)"> | ||||
| @@ -4374,7 +4374,7 @@ | |||||
| Edits original response for this interaction. | Edits original response for this interaction. | ||||
| </summary> | </summary> | ||||
| <param name="func">A delegate containing the properties to modify the message with.</param> | <param name="func">A delegate containing the properties to modify the message with.</param> | ||||
| <param name="options">The request options for this async request.</param> | |||||
| <param name="options">The request options for this <see langword="async"/> request.</param> | |||||
| <returns>A <see cref="T:Discord.Rest.RestInteractionMessage"/> that represents the initial response.</returns> | <returns>A <see cref="T:Discord.Rest.RestInteractionMessage"/> that represents the initial response.</returns> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketInteraction.DeferAsync(System.Boolean,Discord.RequestOptions)"> | <member name="M:Discord.WebSocket.SocketInteraction.DeferAsync(System.Boolean,Discord.RequestOptions)"> | ||||
| @@ -4382,7 +4382,7 @@ | |||||
| Acknowledges this interaction. | Acknowledges this interaction. | ||||
| </summary> | </summary> | ||||
| <param name="ephemeral"><see langword="true"/> to send this message ephemerally, otherwise <see langword="false"/>.</param> | <param name="ephemeral"><see langword="true"/> to send this message ephemerally, otherwise <see langword="false"/>.</param> | ||||
| <param name="options">The request options for this async request.</param> | |||||
| <param name="options">The request options for this <see langword="async"/> request.</param> | |||||
| <returns> | <returns> | ||||
| A task that represents the asynchronous operation of acknowledging the interaction. | A task that represents the asynchronous operation of acknowledging the interaction. | ||||
| </returns> | </returns> | ||||
| @@ -4612,14 +4612,6 @@ | |||||
| Collection of WebSocket-based roles. | Collection of WebSocket-based roles. | ||||
| </returns> | </returns> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.WebSocket.SocketMessage.MentionedUsers"> | |||||
| <summary> | |||||
| Returns the users mentioned in this message. | |||||
| </summary> | |||||
| <returns> | |||||
| Collection of WebSocket-based users. | |||||
| </returns> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketMessage.Tags"> | <member name="P:Discord.WebSocket.SocketMessage.Tags"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| @@ -4629,6 +4621,14 @@ | |||||
| <member name="P:Discord.WebSocket.SocketMessage.Reactions"> | <member name="P:Discord.WebSocket.SocketMessage.Reactions"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.WebSocket.SocketMessage.MentionedUsers"> | |||||
| <summary> | |||||
| Returns the users mentioned in this message. | |||||
| </summary> | |||||
| <returns> | |||||
| Collection of WebSocket-based users. | |||||
| </returns> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketMessage.Timestamp"> | <member name="P:Discord.WebSocket.SocketMessage.Timestamp"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| @@ -4801,9 +4801,6 @@ | |||||
| <member name="P:Discord.WebSocket.SocketUserMessage.MentionedRoles"> | <member name="P:Discord.WebSocket.SocketUserMessage.MentionedRoles"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.WebSocket.SocketUserMessage.MentionedUsers"> | |||||
| <inheritdoc /> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketUserMessage.Stickers"> | <member name="P:Discord.WebSocket.SocketUserMessage.Stickers"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| @@ -17,6 +17,7 @@ namespace Discord.WebSocket | |||||
| #region SocketMessage | #region SocketMessage | ||||
| private long _timestampTicks; | private long _timestampTicks; | ||||
| private readonly List<SocketReaction> _reactions = new List<SocketReaction>(); | private readonly List<SocketReaction> _reactions = new List<SocketReaction>(); | ||||
| private ImmutableArray<SocketUser> _userMentions = ImmutableArray.Create<SocketUser>(); | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets the author of this message. | /// Gets the author of this message. | ||||
| @@ -100,19 +101,19 @@ namespace Discord.WebSocket | |||||
| /// Collection of WebSocket-based roles. | /// Collection of WebSocket-based roles. | ||||
| /// </returns> | /// </returns> | ||||
| public virtual IReadOnlyCollection<SocketRole> MentionedRoles => ImmutableArray.Create<SocketRole>(); | public virtual IReadOnlyCollection<SocketRole> MentionedRoles => ImmutableArray.Create<SocketRole>(); | ||||
| /// <summary> | |||||
| /// Returns the users mentioned in this message. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// Collection of WebSocket-based users. | |||||
| /// </returns> | |||||
| public virtual IReadOnlyCollection<SocketUser> MentionedUsers => ImmutableArray.Create<SocketUser>(); | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public virtual IReadOnlyCollection<ITag> Tags => ImmutableArray.Create<ITag>(); | public virtual IReadOnlyCollection<ITag> Tags => ImmutableArray.Create<ITag>(); | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public virtual IReadOnlyCollection<SocketSticker> Stickers => ImmutableArray.Create<SocketSticker>(); | public virtual IReadOnlyCollection<SocketSticker> Stickers => ImmutableArray.Create<SocketSticker>(); | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public IReadOnlyDictionary<IEmote, ReactionMetadata> Reactions => _reactions.GroupBy(r => r.Emote).ToDictionary(x => x.Key, x => new ReactionMetadata { ReactionCount = x.Count(), IsMe = x.Any(y => y.UserId == Discord.CurrentUser.Id) }); | public IReadOnlyDictionary<IEmote, ReactionMetadata> Reactions => _reactions.GroupBy(r => r.Emote).ToDictionary(x => x.Key, x => new ReactionMetadata { ReactionCount = x.Count(), IsMe = x.Any(y => y.UserId == Discord.CurrentUser.Id) }); | ||||
| /// <summary> | |||||
| /// Returns the users mentioned in this message. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// Collection of WebSocket-based users. | |||||
| /// </returns> | |||||
| public IReadOnlyCollection<SocketUser> MentionedUsers => ImmutableArray.Create<SocketUser>(); | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); | public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); | ||||
| @@ -230,6 +231,28 @@ namespace Discord.WebSocket | |||||
| else | else | ||||
| Components = new List<ActionRowComponent>(); | Components = new List<ActionRowComponent>(); | ||||
| if (model.UserMentions.IsSpecified) | |||||
| { | |||||
| var value = model.UserMentions.Value; | |||||
| if (value.Length > 0) | |||||
| { | |||||
| var newMentions = ImmutableArray.CreateBuilder<SocketUser>(value.Length); | |||||
| for (int i = 0; i < value.Length; i++) | |||||
| { | |||||
| var val = value[i]; | |||||
| if (val != null) | |||||
| { | |||||
| var user = Channel.GetUserAsync(val.Id, CacheMode.CacheOnly).GetAwaiter().GetResult() as SocketUser; | |||||
| if (user != null) | |||||
| newMentions.Add(user); | |||||
| else | |||||
| newMentions.Add(SocketUnknownUser.Create(Discord, state, val)); | |||||
| } | |||||
| } | |||||
| _userMentions = newMentions.ToImmutable(); | |||||
| } | |||||
| } | |||||
| if (model.Flags.IsSpecified) | if (model.Flags.IsSpecified) | ||||
| Flags = model.Flags.Value; | Flags = model.Flags.Value; | ||||
| } | } | ||||
| @@ -22,7 +22,6 @@ namespace Discord.WebSocket | |||||
| private ImmutableArray<Embed> _embeds = ImmutableArray.Create<Embed>(); | private ImmutableArray<Embed> _embeds = ImmutableArray.Create<Embed>(); | ||||
| private ImmutableArray<ITag> _tags = ImmutableArray.Create<ITag>(); | private ImmutableArray<ITag> _tags = ImmutableArray.Create<ITag>(); | ||||
| private ImmutableArray<SocketRole> _roleMentions = ImmutableArray.Create<SocketRole>(); | private ImmutableArray<SocketRole> _roleMentions = ImmutableArray.Create<SocketRole>(); | ||||
| private ImmutableArray<SocketUser> _userMentions = ImmutableArray.Create<SocketUser>(); | |||||
| private ImmutableArray<SocketSticker> _stickers = ImmutableArray.Create<SocketSticker>(); | private ImmutableArray<SocketSticker> _stickers = ImmutableArray.Create<SocketSticker>(); | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| @@ -46,8 +45,6 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override IReadOnlyCollection<SocketRole> MentionedRoles => _roleMentions; | public override IReadOnlyCollection<SocketRole> MentionedRoles => _roleMentions; | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override IReadOnlyCollection<SocketUser> MentionedUsers => _userMentions; | |||||
| /// <inheritdoc /> | |||||
| public override IReadOnlyCollection<SocketSticker> Stickers => _stickers; | public override IReadOnlyCollection<SocketSticker> Stickers => _stickers; | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public IUserMessage ReferencedMessage => _referencedMessage; | public IUserMessage ReferencedMessage => _referencedMessage; | ||||
| @@ -108,32 +105,10 @@ namespace Discord.WebSocket | |||||
| _embeds = ImmutableArray.Create<Embed>(); | _embeds = ImmutableArray.Create<Embed>(); | ||||
| } | } | ||||
| if (model.UserMentions.IsSpecified) | |||||
| { | |||||
| var value = model.UserMentions.Value; | |||||
| if (value.Length > 0) | |||||
| { | |||||
| var newMentions = ImmutableArray.CreateBuilder<SocketUser>(value.Length); | |||||
| for (int i = 0; i < value.Length; i++) | |||||
| { | |||||
| var val = value[i]; | |||||
| if (val.Object != null) | |||||
| { | |||||
| var user = Channel.GetUserAsync(val.Object.Id, CacheMode.CacheOnly).GetAwaiter().GetResult() as SocketUser; | |||||
| if (user != null) | |||||
| newMentions.Add(user); | |||||
| else | |||||
| newMentions.Add(SocketUnknownUser.Create(Discord, state, val.Object)); | |||||
| } | |||||
| } | |||||
| _userMentions = newMentions.ToImmutable(); | |||||
| } | |||||
| } | |||||
| if (model.Content.IsSpecified) | if (model.Content.IsSpecified) | ||||
| { | { | ||||
| var text = model.Content.Value; | var text = model.Content.Value; | ||||
| _tags = MessageHelper.ParseTags(text, Channel, guild, _userMentions); | |||||
| _tags = MessageHelper.ParseTags(text, Channel, guild, MentionedUsers); | |||||
| model.Content = text; | model.Content = text; | ||||
| } | } | ||||