feature: better call control in ParseHttpInteraction (#2330)
* Init * Fix channelid xmldoc
This commit is contained in:
@@ -121,7 +121,7 @@ namespace Discord.Rest
|
||||
/// A <see cref="RestInteraction"/> that represents the incoming http interaction.
|
||||
/// </returns>
|
||||
/// <exception cref="BadSignatureException">Thrown when the signature doesn't match the public key.</exception>
|
||||
public Task<RestInteraction> ParseHttpInteractionAsync(string publicKey, string signature, string timestamp, string body, Func<InteractionType, bool> doApiCallOnCreation = null)
|
||||
public Task<RestInteraction> ParseHttpInteractionAsync(string publicKey, string signature, string timestamp, string body, Func<InteractionProperties, bool> doApiCallOnCreation = null)
|
||||
=> ParseHttpInteractionAsync(publicKey, signature, timestamp, Encoding.UTF8.GetBytes(body), doApiCallOnCreation);
|
||||
|
||||
/// <summary>
|
||||
@@ -135,7 +135,7 @@ namespace Discord.Rest
|
||||
/// A <see cref="RestInteraction"/> that represents the incoming http interaction.
|
||||
/// </returns>
|
||||
/// <exception cref="BadSignatureException">Thrown when the signature doesn't match the public key.</exception>
|
||||
public async Task<RestInteraction> ParseHttpInteractionAsync(string publicKey, string signature, string timestamp, byte[] body, Func<InteractionType, bool> doApiCallOnCreation = null)
|
||||
public async Task<RestInteraction> ParseHttpInteractionAsync(string publicKey, string signature, string timestamp, byte[] body, Func<InteractionProperties, bool> doApiCallOnCreation = null)
|
||||
{
|
||||
if (!IsValidHttpInteraction(publicKey, signature, timestamp, body))
|
||||
{
|
||||
@@ -146,7 +146,7 @@ namespace Discord.Rest
|
||||
using (var jsonReader = new JsonTextReader(textReader))
|
||||
{
|
||||
var model = Serializer.Deserialize<API.Interaction>(jsonReader);
|
||||
return await RestInteraction.CreateAsync(this, model, doApiCallOnCreation != null ? doApiCallOnCreation(model.Type) : _apiOnCreation);
|
||||
return await RestInteraction.CreateAsync(this, model, doApiCallOnCreation is not null ? doApiCallOnCreation(new InteractionProperties(model)) : _apiOnCreation);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Discord.Rest
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a class that contains data present in all interactions to evaluate against at rest-interaction creation.
|
||||
/// </summary>
|
||||
public readonly struct InteractionProperties
|
||||
{
|
||||
/// <summary>
|
||||
/// The type of this interaction.
|
||||
/// </summary>
|
||||
public InteractionType Type { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the type of application command this interaction represents.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This will be <see langword="null"/> if the <see cref="Type"/> is not <see cref="InteractionType.ApplicationCommand"/>.
|
||||
/// </remarks>
|
||||
public ApplicationCommandType? CommandType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the name of the interaction.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This will be <see cref="string.Empty"/> if the <see cref="Type"/> is not <see cref="InteractionType.ApplicationCommand"/>.
|
||||
/// </remarks>
|
||||
public string Name { get; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the custom ID of the interaction.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This will be <see cref="string.Empty"/> if the <see cref="Type"/> is not <see cref="InteractionType.MessageComponent"/> or <see cref="InteractionType.ModalSubmit"/>.
|
||||
/// </remarks>
|
||||
public string CustomId { get; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the guild ID of the interaction.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This will be <see langword="null"/> if this interaction was not executed in a guild.
|
||||
/// </remarks>
|
||||
public ulong? GuildId { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the channel ID of the interaction.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This will be <see langword="null"/> if this interaction is <see cref="InteractionType.Ping"/>.
|
||||
/// </remarks>
|
||||
public ulong? ChannelId { get; }
|
||||
|
||||
internal InteractionProperties(API.Interaction model)
|
||||
{
|
||||
Type = model.Type;
|
||||
CommandType = null;
|
||||
|
||||
if (model.GuildId.IsSpecified)
|
||||
GuildId = model.GuildId.Value;
|
||||
else
|
||||
GuildId = null;
|
||||
|
||||
if (model.ChannelId.IsSpecified)
|
||||
ChannelId = model.ChannelId.Value;
|
||||
else
|
||||
ChannelId = null;
|
||||
|
||||
switch (Type)
|
||||
{
|
||||
case InteractionType.ApplicationCommand:
|
||||
{
|
||||
var data = (API.ApplicationCommandInteractionData)model.Data;
|
||||
|
||||
CommandType = data.Type;
|
||||
Name = data.Name;
|
||||
}
|
||||
break;
|
||||
case InteractionType.MessageComponent:
|
||||
{
|
||||
var data = (API.MessageComponentInteractionData)model.Data;
|
||||
|
||||
CustomId = data.CustomId;
|
||||
}
|
||||
break;
|
||||
case InteractionType.ModalSubmit:
|
||||
{
|
||||
var data = (API.ModalInteractionData)model.Data;
|
||||
|
||||
CustomId = data.CustomId;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user