|
|
@@ -174,6 +174,91 @@ namespace Discord.WebSocket |
|
|
|
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/> |
|
|
|
public override async Task<RestFollowupMessage> FollowupAsync( |
|
|
|
string text = null, |
|
|
|