From a668757669e6f8d13ed6043803d491f0cdbf3a44 Mon Sep 17 00:00:00 2001 From: Mike Date: Sat, 2 Sep 2023 13:18:35 -0400 Subject: [PATCH] Fix UpdateAsync Remove Attachment Bug (#2766) * Similar to PR #2742 but this now fixes the UpdateAsync attachments bug. * Update functions. * `Update` => `UpdateAsync` --------- Co-authored-by: Misha133 --- .../MessageComponents/RestMessageComponent.cs | 44 ++++++++++++++----- .../Entities/Interactions/Modals/RestModal.cs | 36 ++++++++++++--- .../Interaction/Modals/SocketModal.cs | 36 ++++++++++++--- 3 files changed, 90 insertions(+), 26 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Interactions/MessageComponents/RestMessageComponent.cs b/src/Discord.Net.Rest/Entities/Interactions/MessageComponents/RestMessageComponent.cs index 7280c761..a59767c0 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/MessageComponents/RestMessageComponent.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/MessageComponents/RestMessageComponent.cs @@ -141,8 +141,7 @@ namespace Discord.Rest /// /// A delegate containing the properties to modify the message with. /// The request options for this request. - /// A string that contains json to write back to the incoming http request. - public string Update(Action func, RequestOptions options = null) + public async Task UpdateAsync(Action func, RequestOptions options = null) { var args = new MessageProperties(); func(args); @@ -200,20 +199,43 @@ namespace Discord.Rest } } - var response = new API.InteractionResponse + if (!args.Attachments.IsSpecified) { - Type = InteractionResponseType.UpdateMessage, - Data = new API.InteractionCallbackData + var response = new API.InteractionResponse { + Type = InteractionResponseType.UpdateMessage, + Data = new API.InteractionCallbackData + { + Content = args.Content, + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, + Components = args.Components.IsSpecified + ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() + : Optional.Unspecified, + Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified + } + }; + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, this, Channel, options).ConfigureAwait(false); + } + else + { + var attachments = args.Attachments.Value?.ToArray() ?? Array.Empty(); + + var response = new API.Rest.UploadInteractionFileParams(attachments) + { + Type = InteractionResponseType.UpdateMessage, Content = args.Content, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, - Components = args.Components.IsSpecified + MessageComponents = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified - } - }; + }; + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, this, Channel, options).ConfigureAwait(false); + } lock (_lock) { @@ -221,11 +243,9 @@ namespace Discord.Rest { throw new InvalidOperationException("Cannot respond, update, or defer twice to the same interaction"); } - - HasResponded = true; } - return SerializePayload(response); + HasResponded = true; } /// @@ -493,7 +513,7 @@ namespace Discord.Rest /// Task IComponentInteraction.UpdateAsync(Action func, RequestOptions options) - => Task.FromResult(Update(func, options)); + => UpdateAsync(func, options); /// Task IComponentInteraction.DeferLoadingAsync(bool ephemeral, RequestOptions options) diff --git a/src/Discord.Net.Rest/Entities/Interactions/Modals/RestModal.cs b/src/Discord.Net.Rest/Entities/Interactions/Modals/RestModal.cs index 37abc22d..33220d88 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/Modals/RestModal.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/Modals/RestModal.cs @@ -512,20 +512,43 @@ namespace Discord.Rest } } - var response = new API.InteractionResponse + if (!args.Attachments.IsSpecified) { - Type = InteractionResponseType.UpdateMessage, - Data = new API.InteractionCallbackData + var response = new API.InteractionResponse { + Type = InteractionResponseType.UpdateMessage, + Data = new API.InteractionCallbackData + { + Content = args.Content, + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, + Components = args.Components.IsSpecified + ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() + : Optional.Unspecified, + Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified + } + }; + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, this, Channel, options).ConfigureAwait(false); + } + else + { + var attachments = args.Attachments.Value?.ToArray() ?? Array.Empty(); + + var response = new API.Rest.UploadInteractionFileParams(attachments) + { + Type = InteractionResponseType.UpdateMessage, Content = args.Content, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, - Components = args.Components.IsSpecified + MessageComponents = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified - } - }; + }; + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, this, Channel, options).ConfigureAwait(false); + } lock (_lock) { @@ -535,7 +558,6 @@ namespace Discord.Rest } } - await InteractionHelper.SendInteractionResponseAsync(Discord, response, this, Channel, options).ConfigureAwait(false); HasResponded = true; } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Modals/SocketModal.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Modals/SocketModal.cs index 20daf7a0..ff1d4dc8 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Modals/SocketModal.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Modals/SocketModal.cs @@ -258,20 +258,43 @@ namespace Discord.WebSocket } } - var response = new API.InteractionResponse + if (!args.Attachments.IsSpecified) { - Type = InteractionResponseType.UpdateMessage, - Data = new API.InteractionCallbackData + var response = new API.InteractionResponse { + Type = InteractionResponseType.UpdateMessage, + Data = new API.InteractionCallbackData + { + Content = args.Content, + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, + Components = args.Components.IsSpecified + ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() + : Optional.Unspecified, + Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified + } + }; + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, this, Channel, options).ConfigureAwait(false); + } + else + { + var attachments = args.Attachments.Value?.ToArray() ?? Array.Empty(); + + var response = new API.Rest.UploadInteractionFileParams(attachments) + { + Type = InteractionResponseType.UpdateMessage, Content = args.Content, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, - Components = args.Components.IsSpecified + MessageComponents = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified - } - }; + }; + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, this, Channel, options).ConfigureAwait(false); + } lock (_lock) { @@ -281,7 +304,6 @@ namespace Discord.WebSocket } } - await InteractionHelper.SendInteractionResponseAsync(Discord, response, this, Channel, options).ConfigureAwait(false); HasResponded = true; }