* Init * Fix channelid xmldoctags/3.7.1
@@ -121,7 +121,7 @@ namespace Discord.Rest | |||||
/// A <see cref="RestInteraction"/> that represents the incoming http interaction. | /// A <see cref="RestInteraction"/> that represents the incoming http interaction. | ||||
/// </returns> | /// </returns> | ||||
/// <exception cref="BadSignatureException">Thrown when the signature doesn't match the public key.</exception> | /// <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); | => ParseHttpInteractionAsync(publicKey, signature, timestamp, Encoding.UTF8.GetBytes(body), doApiCallOnCreation); | ||||
/// <summary> | /// <summary> | ||||
@@ -135,7 +135,7 @@ namespace Discord.Rest | |||||
/// A <see cref="RestInteraction"/> that represents the incoming http interaction. | /// A <see cref="RestInteraction"/> that represents the incoming http interaction. | ||||
/// </returns> | /// </returns> | ||||
/// <exception cref="BadSignatureException">Thrown when the signature doesn't match the public key.</exception> | /// <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)) | if (!IsValidHttpInteraction(publicKey, signature, timestamp, body)) | ||||
{ | { | ||||
@@ -146,7 +146,7 @@ namespace Discord.Rest | |||||
using (var jsonReader = new JsonTextReader(textReader)) | using (var jsonReader = new JsonTextReader(textReader)) | ||||
{ | { | ||||
var model = Serializer.Deserialize<API.Interaction>(jsonReader); | 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; | |||||
} | |||||
} | |||||
} | |||||
} |