| @@ -1085,6 +1085,21 @@ | |||
| A sticker was deleted. | |||
| </summary> | |||
| </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"> | |||
| <summary> | |||
| Represents data applied to an <see cref="T:Discord.IAuditLogEntry"/>. | |||
| @@ -4981,7 +4996,7 @@ | |||
| </member> | |||
| <member name="P:Discord.IApplicationCommandOption.ChannelTypes"> | |||
| <summary> | |||
| The allowed channel types for this option. | |||
| The allowed channel types for this option. | |||
| </summary> | |||
| </member> | |||
| <member name="T:Discord.IApplicationCommandOptionChoice"> | |||
| @@ -8286,15 +8301,15 @@ | |||
| The message is an inline reply. | |||
| </summary> | |||
| <remarks> | |||
| Only available in API v8 | |||
| Only available in API v8. | |||
| </remarks> | |||
| </member> | |||
| <member name="F:Discord.MessageType.ApplicationCommand"> | |||
| <summary> | |||
| The message is an Application Command | |||
| The message is an Application Command. | |||
| </summary> | |||
| <remarks> | |||
| Only available in API v8 | |||
| Only available in API v8. | |||
| </remarks> | |||
| </member> | |||
| <member name="F:Discord.MessageType.ThreadStarterMessage"> | |||
| @@ -8302,12 +8317,17 @@ | |||
| The message that starts a thread. | |||
| </summary> | |||
| <remarks> | |||
| Only available in API v9 | |||
| Only available in API v9. | |||
| </remarks> | |||
| </member> | |||
| <member name="F:Discord.MessageType.GuildInviteReminder"> | |||
| <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> | |||
| </member> | |||
| <member name="T:Discord.ReactionMetadata"> | |||
| @@ -81,26 +81,30 @@ namespace Discord | |||
| /// The message is an inline reply. | |||
| /// </summary> | |||
| /// <remarks> | |||
| /// Only available in API v8 | |||
| /// Only available in API v8. | |||
| /// </remarks> | |||
| Reply = 19, | |||
| /// <summary> | |||
| /// The message is an Application Command | |||
| /// The message is an Application Command. | |||
| /// </summary> | |||
| /// <remarks> | |||
| /// Only available in API v8 | |||
| /// Only available in API v8. | |||
| /// </remarks> | |||
| ApplicationCommand = 20, | |||
| /// <summary> | |||
| /// The message that starts a thread. | |||
| /// </summary> | |||
| /// <remarks> | |||
| /// Only available in API v9 | |||
| /// Only available in API v9. | |||
| /// </remarks> | |||
| ThreadStarterMessage = 21, | |||
| /// <summary> | |||
| /// The message for a invite reminder | |||
| /// The message for a invite reminder. | |||
| /// </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")] | |||
| public Optional<bool> MentionEveryone { get; set; } | |||
| [JsonProperty("mentions")] | |||
| public Optional<EntityOrId<User>[]> UserMentions { get; set; } | |||
| public Optional<User[]> UserMentions { get; set; } | |||
| [JsonProperty("mention_roles")] | |||
| public Optional<ulong[]> RoleMentions { get; set; } | |||
| [JsonProperty("attachments")] | |||
| @@ -1507,6 +1507,96 @@ | |||
| A role information object containing the role information after the changes were made. | |||
| </returns> | |||
| </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"> | |||
| <summary> | |||
| Contains a piece of audit log data related to an unban. | |||
| @@ -4031,7 +4121,7 @@ | |||
| </member> | |||
| <member name="P:Discord.Rest.RestApplicationCommandOption.ChannelTypes"> | |||
| <summary> | |||
| The allowed channel types for this option. | |||
| The allowed channel types for this option. | |||
| </summary> | |||
| </member> | |||
| <member name="T:Discord.Rest.RestGlobalCommand"> | |||
| @@ -4341,11 +4431,6 @@ | |||
| <member name="P:Discord.Rest.RestMessage.MentionedRoleIds"> | |||
| <inheritdoc /> | |||
| </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"> | |||
| <inheritdoc /> | |||
| </member> | |||
| @@ -4373,6 +4458,11 @@ | |||
| <member name="P:Discord.Rest.RestMessage.Components"> | |||
| <inheritdoc/> | |||
| </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)"> | |||
| <inheritdoc /> | |||
| </member> | |||
| @@ -4478,9 +4568,6 @@ | |||
| <member name="P:Discord.Rest.RestUserMessage.MentionedRoleIds"> | |||
| <inheritdoc /> | |||
| </member> | |||
| <member name="P:Discord.Rest.RestUserMessage.MentionedUsers"> | |||
| <inheritdoc /> | |||
| </member> | |||
| <member name="P:Discord.Rest.RestUserMessage.Tags"> | |||
| <inheritdoc /> | |||
| </member> | |||
| @@ -15,6 +15,7 @@ namespace Discord.Rest | |||
| { | |||
| private long _timestampTicks; | |||
| private ImmutableArray<RestReaction> _reactions = ImmutableArray.Create<RestReaction>(); | |||
| private ImmutableArray<RestUser> _userMentions = ImmutableArray.Create<RestUser>(); | |||
| /// <inheritdoc /> | |||
| public IMessageChannel Channel { get; } | |||
| @@ -56,10 +57,6 @@ namespace Discord.Rest | |||
| public virtual IReadOnlyCollection<ulong> MentionedChannelIds => ImmutableArray.Create<ulong>(); | |||
| /// <inheritdoc /> | |||
| 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 /> | |||
| public virtual IReadOnlyCollection<ITag> Tags => ImmutableArray.Create<ITag>(); | |||
| /// <inheritdoc /> | |||
| @@ -80,6 +77,10 @@ namespace Discord.Rest | |||
| /// <inheritdoc/> | |||
| 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) | |||
| : base(discord, id) | |||
| @@ -210,6 +211,22 @@ namespace Discord.Rest | |||
| } | |||
| else | |||
| _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 /> | |||
| public async Task UpdateAsync(RequestOptions options = null) | |||
| @@ -20,7 +20,6 @@ namespace Discord.Rest | |||
| private ImmutableArray<Embed> _embeds = ImmutableArray.Create<Embed>(); | |||
| private ImmutableArray<ITag> _tags = ImmutableArray.Create<ITag>(); | |||
| private ImmutableArray<ulong> _roleMentionIds = ImmutableArray.Create<ulong>(); | |||
| private ImmutableArray<RestUser> _userMentions = ImmutableArray.Create<RestUser>(); | |||
| private ImmutableArray<StickerItem> _stickers = ImmutableArray.Create<StickerItem>(); | |||
| /// <inheritdoc /> | |||
| @@ -42,8 +41,6 @@ namespace Discord.Rest | |||
| /// <inheritdoc /> | |||
| public override IReadOnlyCollection<ulong> MentionedRoleIds => _roleMentionIds; | |||
| /// <inheritdoc /> | |||
| public override IReadOnlyCollection<RestUser> MentionedUsers => _userMentions; | |||
| /// <inheritdoc /> | |||
| public override IReadOnlyCollection<ITag> Tags => _tags; | |||
| /// <inheritdoc /> | |||
| public override IReadOnlyCollection<StickerItem> Stickers => _stickers; | |||
| @@ -104,28 +101,12 @@ namespace Discord.Rest | |||
| _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 guild = guildId != null ? (Discord as IDiscordClient).GetGuildAsync(guildId.Value, CacheMode.CacheOnly).Result : null; | |||
| if (model.Content.IsSpecified) | |||
| { | |||
| var text = model.Content.Value; | |||
| _tags = MessageHelper.ParseTags(text, null, guild, _userMentions); | |||
| _tags = MessageHelper.ParseTags(text, null, guild, MentionedUsers); | |||
| 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)"> | |||
| <inheritdoc/> | |||
| </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/> | |||
| </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)"> | |||
| @@ -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)"> | |||
| <inheritdoc/> | |||
| </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/> | |||
| </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)"> | |||
| @@ -4191,7 +4191,7 @@ | |||
| </member> | |||
| <member name="P:Discord.WebSocket.SocketApplicationCommandOption.ChannelTypes"> | |||
| <summary> | |||
| The allowed channel types for this option. | |||
| The allowed channel types for this option. | |||
| </summary> | |||
| </member> | |||
| <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)"> | |||
| <inheritdoc/> | |||
| </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/> | |||
| </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)"> | |||
| @@ -4326,7 +4326,7 @@ | |||
| The sent message. | |||
| </returns> | |||
| </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> | |||
| Sends a followup message for this interaction. | |||
| </summary> | |||
| @@ -4366,7 +4366,7 @@ | |||
| <summary> | |||
| Gets the original response for this interaction. | |||
| </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> | |||
| </member> | |||
| <member name="M:Discord.WebSocket.SocketInteraction.ModifyOriginalResponseAsync(System.Action{Discord.MessageProperties},Discord.RequestOptions)"> | |||
| @@ -4374,7 +4374,7 @@ | |||
| Edits original response for this interaction. | |||
| </summary> | |||
| <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> | |||
| </member> | |||
| <member name="M:Discord.WebSocket.SocketInteraction.DeferAsync(System.Boolean,Discord.RequestOptions)"> | |||
| @@ -4382,7 +4382,7 @@ | |||
| Acknowledges this interaction. | |||
| </summary> | |||
| <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> | |||
| A task that represents the asynchronous operation of acknowledging the interaction. | |||
| </returns> | |||
| @@ -4612,14 +4612,6 @@ | |||
| Collection of WebSocket-based roles. | |||
| </returns> | |||
| </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"> | |||
| <inheritdoc /> | |||
| </member> | |||
| @@ -4629,6 +4621,14 @@ | |||
| <member name="P:Discord.WebSocket.SocketMessage.Reactions"> | |||
| <inheritdoc /> | |||
| </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"> | |||
| <inheritdoc /> | |||
| </member> | |||
| @@ -4801,9 +4801,6 @@ | |||
| <member name="P:Discord.WebSocket.SocketUserMessage.MentionedRoles"> | |||
| <inheritdoc /> | |||
| </member> | |||
| <member name="P:Discord.WebSocket.SocketUserMessage.MentionedUsers"> | |||
| <inheritdoc /> | |||
| </member> | |||
| <member name="P:Discord.WebSocket.SocketUserMessage.Stickers"> | |||
| <inheritdoc /> | |||
| </member> | |||
| @@ -17,6 +17,7 @@ namespace Discord.WebSocket | |||
| #region SocketMessage | |||
| private long _timestampTicks; | |||
| private readonly List<SocketReaction> _reactions = new List<SocketReaction>(); | |||
| private ImmutableArray<SocketUser> _userMentions = ImmutableArray.Create<SocketUser>(); | |||
| /// <summary> | |||
| /// Gets the author of this message. | |||
| @@ -100,19 +101,19 @@ namespace Discord.WebSocket | |||
| /// Collection of WebSocket-based roles. | |||
| /// </returns> | |||
| 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 /> | |||
| public virtual IReadOnlyCollection<ITag> Tags => ImmutableArray.Create<ITag>(); | |||
| /// <inheritdoc /> | |||
| public virtual IReadOnlyCollection<SocketSticker> Stickers => ImmutableArray.Create<SocketSticker>(); | |||
| /// <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) }); | |||
| /// <summary> | |||
| /// Returns the users mentioned in this message. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// Collection of WebSocket-based users. | |||
| /// </returns> | |||
| public IReadOnlyCollection<SocketUser> MentionedUsers => ImmutableArray.Create<SocketUser>(); | |||
| /// <inheritdoc /> | |||
| public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); | |||
| @@ -230,6 +231,28 @@ namespace Discord.WebSocket | |||
| else | |||
| 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) | |||
| Flags = model.Flags.Value; | |||
| } | |||
| @@ -22,7 +22,6 @@ namespace Discord.WebSocket | |||
| private ImmutableArray<Embed> _embeds = ImmutableArray.Create<Embed>(); | |||
| private ImmutableArray<ITag> _tags = ImmutableArray.Create<ITag>(); | |||
| private ImmutableArray<SocketRole> _roleMentions = ImmutableArray.Create<SocketRole>(); | |||
| private ImmutableArray<SocketUser> _userMentions = ImmutableArray.Create<SocketUser>(); | |||
| private ImmutableArray<SocketSticker> _stickers = ImmutableArray.Create<SocketSticker>(); | |||
| /// <inheritdoc /> | |||
| @@ -46,8 +45,6 @@ namespace Discord.WebSocket | |||
| /// <inheritdoc /> | |||
| public override IReadOnlyCollection<SocketRole> MentionedRoles => _roleMentions; | |||
| /// <inheritdoc /> | |||
| public override IReadOnlyCollection<SocketUser> MentionedUsers => _userMentions; | |||
| /// <inheritdoc /> | |||
| public override IReadOnlyCollection<SocketSticker> Stickers => _stickers; | |||
| /// <inheritdoc /> | |||
| public IUserMessage ReferencedMessage => _referencedMessage; | |||
| @@ -108,32 +105,10 @@ namespace Discord.WebSocket | |||
| _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) | |||
| { | |||
| var text = model.Content.Value; | |||
| _tags = MessageHelper.ParseTags(text, Channel, guild, _userMentions); | |||
| _tags = MessageHelper.ParseTags(text, Channel, guild, MentionedUsers); | |||
| model.Content = text; | |||
| } | |||