@@ -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; | ||||
} | } | ||||