| @@ -174,6 +174,91 @@ namespace Discord.WebSocket | |||||
| HasResponded = true; | HasResponded = true; | ||||
| } | } | ||||
| public async Task UpdateAsync(Action<MessageProperties> func, RequestOptions options = null) | |||||
| { | |||||
| var args = new MessageProperties(); | |||||
| func(args); | |||||
| if (!IsValidToken) | |||||
| throw new InvalidOperationException("Interaction token is no longer valid"); | |||||
| if (!InteractionHelper.CanSendResponse(this)) | |||||
| throw new TimeoutException($"Cannot respond to an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); | |||||
| if (args.AllowedMentions.IsSpecified) | |||||
| { | |||||
| var allowedMentions = args.AllowedMentions.Value; | |||||
| Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 role Ids are allowed."); | |||||
| Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 user Ids are allowed."); | |||||
| } | |||||
| var embed = args.Embed; | |||||
| var embeds = args.Embeds; | |||||
| bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : false; | |||||
| bool hasEmbeds = embed.IsSpecified && embed.Value != null || embeds.IsSpecified && embeds.Value?.Length > 0; | |||||
| if (!hasText && !hasEmbeds) | |||||
| Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); | |||||
| var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List<API.Embed>() : null; | |||||
| if (embed.IsSpecified && embed.Value != null) | |||||
| { | |||||
| apiEmbeds.Add(embed.Value.ToModel()); | |||||
| } | |||||
| if (embeds.IsSpecified && embeds.Value != null) | |||||
| { | |||||
| apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); | |||||
| } | |||||
| Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); | |||||
| // check that user flag and user Id list are exclusive, same with role flag and role Id list | |||||
| if (args.AllowedMentions.IsSpecified && args.AllowedMentions.Value != null && args.AllowedMentions.Value.AllowedTypes.HasValue) | |||||
| { | |||||
| var allowedMentions = args.AllowedMentions.Value; | |||||
| if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) | |||||
| && allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) | |||||
| { | |||||
| throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(args.AllowedMentions)); | |||||
| } | |||||
| if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) | |||||
| && allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) | |||||
| { | |||||
| throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(args.AllowedMentions)); | |||||
| } | |||||
| } | |||||
| var response = new API.InteractionResponse | |||||
| { | |||||
| Type = InteractionResponseType.UpdateMessage, | |||||
| Data = new API.InteractionCallbackData | |||||
| { | |||||
| Content = args.Content, | |||||
| AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional<API.AllowedMentions>.Unspecified, | |||||
| Embeds = apiEmbeds?.ToArray() ?? Optional<API.Embed[]>.Unspecified, | |||||
| Components = args.Components.IsSpecified | |||||
| ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty<API.ActionRowComponent>() | |||||
| : Optional<API.ActionRowComponent[]>.Unspecified, | |||||
| Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional<MessageFlags>.Unspecified : Optional<MessageFlags>.Unspecified | |||||
| } | |||||
| }; | |||||
| lock (_lock) | |||||
| { | |||||
| if (HasResponded) | |||||
| { | |||||
| throw new InvalidOperationException("Cannot respond, update, or defer twice to the same interaction"); | |||||
| } | |||||
| } | |||||
| await InteractionHelper.SendInteractionResponseAsync(Discord, response, this, Channel, options).ConfigureAwait(false); | |||||
| HasResponded = true; | |||||
| } | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public override async Task<RestFollowupMessage> FollowupAsync( | public override async Task<RestFollowupMessage> FollowupAsync( | ||||
| string text = null, | string text = null, | ||||