Create all interaction models
This commit is contained in:
parent
209887e237
commit
60547140ea
59 changed files with 1589 additions and 222 deletions
73
src/Core/Interactions/ApplicationCommand/Command.cs
Normal file
73
src/Core/Interactions/ApplicationCommand/Command.cs
Normal file
|
@ -0,0 +1,73 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.ApplicationCommand
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/application-commands#application-command-object"/>
|
||||
public record Command
|
||||
{
|
||||
/// <summary>
|
||||
/// unique id of the command
|
||||
/// </summary>
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// the type of command, defaults 1 if not set
|
||||
/// </summary>
|
||||
[JsonPropertyName("type")]
|
||||
public CommandType Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// unique id of the parent application
|
||||
/// </summary>
|
||||
[JsonPropertyName("application_id")]
|
||||
public string ApplicationId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// guild id of the command, if not global
|
||||
/// </summary>
|
||||
[JsonPropertyName("guild_id")]
|
||||
public string GuildId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 1-32 character name
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// CHAT_INPUT command names and command option names must match the following regex ^[\w-]{1,32}$ with the unicode flag set. If there is a lowercase variant of any letters used, you must use those.
|
||||
/// Characters with no lowercase variants and/or uncased letters are still allowed. USER and MESSAGE commands may be mixed case and can include spaces.
|
||||
/// </remarks>
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 1-100 character description for CHAT_INPUT commands, empty string for USER and MESSAGE commands
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Exclusive: CHAT_INPUT
|
||||
/// </remarks>
|
||||
[JsonPropertyName("description")]
|
||||
public string Description { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// the parameters for the command, max 25
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Exclusive: CHAT_INPUT
|
||||
/// </remarks>
|
||||
[JsonPropertyName("options")]
|
||||
public List<Option> Options { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// whether the command is enabled by default when the app is added to a guild
|
||||
/// </summary>
|
||||
[JsonPropertyName("default_permission")]
|
||||
public bool DefaultPermission { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// autoincrementing version identifier updated during substantial record changes
|
||||
/// </summary>
|
||||
[JsonPropertyName("version")]
|
||||
public string Version { get; set; }
|
||||
}
|
||||
}
|
21
src/Core/Interactions/ApplicationCommand/CommandType.cs
Normal file
21
src/Core/Interactions/ApplicationCommand/CommandType.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
namespace Geekbot.Core.Interactions.ApplicationCommand
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-types"/>
|
||||
public enum CommandType
|
||||
{
|
||||
/// <summary>
|
||||
/// Slash commands; a text-based command that shows up when a user types /
|
||||
/// </summary>
|
||||
ChatInput = 1,
|
||||
|
||||
/// <summary>
|
||||
/// A UI-based command that shows up when you right click or tap on a user
|
||||
/// </summary>
|
||||
User = 2,
|
||||
|
||||
/// <summary>
|
||||
/// A UI-based command that shows up when you right click or tap on a message
|
||||
/// </summary>
|
||||
Message = 3,
|
||||
}
|
||||
}
|
51
src/Core/Interactions/ApplicationCommand/Option.cs
Normal file
51
src/Core/Interactions/ApplicationCommand/Option.cs
Normal file
|
@ -0,0 +1,51 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.ApplicationCommand
|
||||
{
|
||||
/// <remarks>
|
||||
/// Required options must be listed before optional options
|
||||
/// </remarks>
|
||||
/// <see href="https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-structure"/>
|
||||
public record Option
|
||||
{
|
||||
/// <summary>
|
||||
/// the type of option
|
||||
/// </summary>
|
||||
[JsonPropertyName("type")]
|
||||
public OptionType Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 1-32 character name
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Must match ^[\w-]{1,32}$
|
||||
/// </remarks>
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 1-100 character description
|
||||
/// </summary>
|
||||
[JsonPropertyName("description")]
|
||||
public string Description { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// if the parameter is required or optional--default false
|
||||
/// </summary>
|
||||
[JsonPropertyName("required")]
|
||||
public bool Required { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// choices for STRING, INTEGER, and NUMBER types for the user to pick from, max 25
|
||||
/// </summary>
|
||||
[JsonPropertyName("choices")]
|
||||
public List<OptionChoice> Choices { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// if the option is a subcommand or subcommand group type, this nested options will be the parameters
|
||||
/// </summary>
|
||||
[JsonPropertyName("options")]
|
||||
public List<Option> Options { get; set; }
|
||||
}
|
||||
}
|
17
src/Core/Interactions/ApplicationCommand/OptionChoice.cs
Normal file
17
src/Core/Interactions/ApplicationCommand/OptionChoice.cs
Normal file
|
@ -0,0 +1,17 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.ApplicationCommand
|
||||
{
|
||||
/// <remarks>
|
||||
/// If you specify choices for an option, they are the only valid values for a user to pick
|
||||
/// </remarks>
|
||||
/// <see href="https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-choice-structure"/>
|
||||
public record OptionChoice
|
||||
{
|
||||
/// <summary>
|
||||
/// 1-100 character choice name
|
||||
/// </summary>
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.ApplicationCommand
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-choice-structure"/>
|
||||
public record OptionChoiceDouble : OptionChoice
|
||||
{
|
||||
/// <summary>
|
||||
/// value of the choice, up to 100 characters if string
|
||||
/// </summary>
|
||||
[JsonPropertyName("value")]
|
||||
public double Value { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.ApplicationCommand
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-choice-structure"/>
|
||||
public record OptionChoiceInteger : OptionChoice
|
||||
{
|
||||
/// <summary>
|
||||
/// value of the choice, up to 100 characters if string
|
||||
/// </summary>
|
||||
[JsonPropertyName("value")]
|
||||
public int Value { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.ApplicationCommand
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-choice-structure"/>
|
||||
public record OptionChoiceString : OptionChoice
|
||||
{
|
||||
/// <summary>
|
||||
/// value of the choice, up to 100 characters if string
|
||||
/// </summary>
|
||||
[JsonPropertyName("value")]
|
||||
public string Value { get; set; }
|
||||
}
|
||||
}
|
38
src/Core/Interactions/ApplicationCommand/OptionType.cs
Normal file
38
src/Core/Interactions/ApplicationCommand/OptionType.cs
Normal file
|
@ -0,0 +1,38 @@
|
|||
namespace Geekbot.Core.Interactions.ApplicationCommand
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-type"/>
|
||||
public enum OptionType
|
||||
{
|
||||
SubCommand = 1,
|
||||
|
||||
SubCommandGroup = 2,
|
||||
|
||||
String = 3,
|
||||
|
||||
/// <summary>
|
||||
/// Any integer between -2^53 and 2^53
|
||||
/// </summary>
|
||||
Integer = 4,
|
||||
|
||||
Boolean = 5,
|
||||
|
||||
User = 6,
|
||||
|
||||
/// <summary>
|
||||
/// Includes all channel types + categories
|
||||
/// </summary>
|
||||
Channel = 7,
|
||||
|
||||
Role = 8,
|
||||
|
||||
/// <summary>
|
||||
/// Includes users and roles
|
||||
/// </summary>
|
||||
Mentionable = 9,
|
||||
|
||||
/// <summary>
|
||||
/// Any double between -2^53 and 2^53
|
||||
/// </summary>
|
||||
Number = 10,
|
||||
}
|
||||
}
|
88
src/Core/Interactions/Embed/Embed.cs
Normal file
88
src/Core/Interactions/Embed/Embed.cs
Normal file
|
@ -0,0 +1,88 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Embed
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/resources/channel#embed-object" />
|
||||
public record Embed
|
||||
{
|
||||
/// <summary>
|
||||
/// title of embed
|
||||
/// </summary>
|
||||
[JsonPropertyName("title")]
|
||||
public string Title { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// type of embed (always "rich" for webhook embeds)
|
||||
/// </summary>
|
||||
[JsonPropertyName("type")]
|
||||
public EmbedTypes Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// description of embed
|
||||
/// </summary>
|
||||
[JsonPropertyName("description")]
|
||||
public string Description { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// url of embed
|
||||
/// </summary>
|
||||
[JsonPropertyName("url")]
|
||||
public string Url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// timestamp of embed content
|
||||
/// </summary>
|
||||
[JsonPropertyName("timestamp")]
|
||||
public DateTime? Timestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// color code of the embed
|
||||
/// </summary>
|
||||
[JsonPropertyName("color")]
|
||||
public int Color { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// footer information
|
||||
/// </summary>
|
||||
[JsonPropertyName("footer")]
|
||||
public EmbedFooter Footer { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// image information
|
||||
/// </summary>
|
||||
[JsonPropertyName("image")]
|
||||
public EmbedImage Image { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// thumbnail information
|
||||
/// </summary>
|
||||
[JsonPropertyName("thumbnail")]
|
||||
public EmbedThumbnail Thumbnail { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// video information
|
||||
/// </summary>
|
||||
[JsonPropertyName("video")]
|
||||
public EmbedVideo Video { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// provider information
|
||||
/// </summary>
|
||||
[JsonPropertyName("provider")]
|
||||
public EmbedProvider Provider { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// author information
|
||||
/// </summary>
|
||||
[JsonPropertyName("author")]
|
||||
public EmbedAuthor Author { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// fields information
|
||||
/// </summary>
|
||||
[JsonPropertyName("fields")]
|
||||
public List<EmbedField> Fields { get; set; }
|
||||
}
|
||||
}
|
32
src/Core/Interactions/Embed/EmbedAuthor.cs
Normal file
32
src/Core/Interactions/Embed/EmbedAuthor.cs
Normal file
|
@ -0,0 +1,32 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Embed
|
||||
{
|
||||
public record EmbedAuthor
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// name of author
|
||||
/// </summary>
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// url of author
|
||||
/// </summary>
|
||||
[JsonPropertyName("url")]
|
||||
public string Url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// url of author icon (only supports http(s) and attachments)
|
||||
/// </summary>
|
||||
[JsonPropertyName("icon_url")]
|
||||
public string IconUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// a proxied url of author icon
|
||||
/// </summary>
|
||||
[JsonPropertyName("proxy_icon_url")]
|
||||
public string ProxyIconUrl { get; set; }
|
||||
}
|
||||
}
|
26
src/Core/Interactions/Embed/EmbedField.cs
Normal file
26
src/Core/Interactions/Embed/EmbedField.cs
Normal file
|
@ -0,0 +1,26 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Embed
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/resources/channel#embed-object-embed-field-structure" />
|
||||
public record EmbedField
|
||||
{
|
||||
/// <summary>
|
||||
/// name of the field
|
||||
/// </summary>
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// value of the field
|
||||
/// </summary>
|
||||
[JsonPropertyName("value")]
|
||||
public string Value { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// whether or not this field should display inline
|
||||
/// </summary>
|
||||
[JsonPropertyName("inline")]
|
||||
public bool Inline { get; set; }
|
||||
}
|
||||
}
|
27
src/Core/Interactions/Embed/EmbedFooter.cs
Normal file
27
src/Core/Interactions/Embed/EmbedFooter.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Embed
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure" />
|
||||
public record EmbedFooter
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// footer text
|
||||
/// </summary>
|
||||
[JsonPropertyName("text")]
|
||||
public string Text { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// url of footer icon (only supports http(s) and attachments)
|
||||
/// </summary>
|
||||
[JsonPropertyName("icon_url")]
|
||||
public string IconUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// a proxied url of footer icon
|
||||
/// </summary>
|
||||
[JsonPropertyName("proxy_icon_url")]
|
||||
public string ProxyIconUrl { get; set; }
|
||||
}
|
||||
}
|
32
src/Core/Interactions/Embed/EmbedImage.cs
Normal file
32
src/Core/Interactions/Embed/EmbedImage.cs
Normal file
|
@ -0,0 +1,32 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Embed
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure" />
|
||||
public record EmbedImage
|
||||
{
|
||||
/// <summary>
|
||||
/// source url of image (only supports http(s) and attachments)
|
||||
/// </summary>
|
||||
[JsonPropertyName("url")]
|
||||
public string Url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// a proxied url of the image
|
||||
/// </summary>
|
||||
[JsonPropertyName("proxy_url")]
|
||||
public string ProxyUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// height of image
|
||||
/// </summary>
|
||||
[JsonPropertyName("height")]
|
||||
public int Height { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// width of image
|
||||
/// </summary>
|
||||
[JsonPropertyName("width")]
|
||||
public int Width { get; set; }
|
||||
}
|
||||
}
|
20
src/Core/Interactions/Embed/EmbedProvider.cs
Normal file
20
src/Core/Interactions/Embed/EmbedProvider.cs
Normal file
|
@ -0,0 +1,20 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Embed
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/resources/channel#embed-object-embed-provider-structure" />
|
||||
public record EmbedProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// name of provider
|
||||
/// </summary>
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// url of provider
|
||||
/// </summary>
|
||||
[JsonPropertyName("url")]
|
||||
public string Url { get; set; }
|
||||
}
|
||||
}
|
33
src/Core/Interactions/Embed/EmbedThumbnail.cs
Normal file
33
src/Core/Interactions/Embed/EmbedThumbnail.cs
Normal file
|
@ -0,0 +1,33 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Embed
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/resources/channel#embed-object-embed-thumbnail-structure" />
|
||||
public record EmbedThumbnail
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// source url of thumbnail (only supports http(s) and attachments)
|
||||
/// </summary>
|
||||
[JsonPropertyName("url")]
|
||||
public string Url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// a proxied url of the thumbnail
|
||||
/// </summary>
|
||||
[JsonPropertyName("proxy_url")]
|
||||
public string ProxyUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// height of thumbnail
|
||||
/// </summary>
|
||||
[JsonPropertyName("height")]
|
||||
public int Height { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// width of thumbnail
|
||||
/// </summary>
|
||||
[JsonPropertyName("width")]
|
||||
public int Width { get; set; }
|
||||
}
|
||||
}
|
49
src/Core/Interactions/Embed/EmbedTypes.cs
Normal file
49
src/Core/Interactions/Embed/EmbedTypes.cs
Normal file
|
@ -0,0 +1,49 @@
|
|||
using System.Runtime.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Embed
|
||||
{
|
||||
/// <summary>
|
||||
/// Embed types are "loosely defined" and, for the most part, are not used by our clients for rendering.
|
||||
/// Embed attributes power what is rendered.
|
||||
/// Embed types should be considered deprecated and might be removed in a future API version.
|
||||
/// </summary>
|
||||
/// <see href="https://discord.com/developers/docs/resources/channel#embed-object-embed-types" />
|
||||
public enum EmbedTypes
|
||||
{
|
||||
/// <summary>
|
||||
/// generic embed rendered from embed attributes
|
||||
/// </summary>
|
||||
[EnumMember(Value = "rich")]
|
||||
Rich,
|
||||
|
||||
/// <summary>
|
||||
/// image embed
|
||||
/// </summary>
|
||||
[EnumMember(Value = "image")]
|
||||
Image,
|
||||
|
||||
/// <summary>
|
||||
/// video embed
|
||||
/// </summary>
|
||||
[EnumMember(Value = "video")]
|
||||
Video,
|
||||
|
||||
/// <summary>
|
||||
/// animated gif image embed rendered as a video embed
|
||||
/// </summary>
|
||||
[EnumMember(Value = "gifv")]
|
||||
Gifv,
|
||||
|
||||
/// <summary>
|
||||
/// article embed
|
||||
/// </summary>
|
||||
[EnumMember(Value = "article")]
|
||||
Article,
|
||||
|
||||
/// <summary>
|
||||
/// link embed
|
||||
/// </summary>
|
||||
[EnumMember(Value = "link")]
|
||||
Link,
|
||||
}
|
||||
}
|
32
src/Core/Interactions/Embed/EmbedVideo.cs
Normal file
32
src/Core/Interactions/Embed/EmbedVideo.cs
Normal file
|
@ -0,0 +1,32 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Embed
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/resources/channel#embed-object-embed-video-structure" />
|
||||
public record EmbedVideo
|
||||
{
|
||||
/// <summary>
|
||||
/// source url of video
|
||||
/// </summary>
|
||||
[JsonPropertyName("url")]
|
||||
public string Url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// a proxied url of the video
|
||||
/// </summary>
|
||||
[JsonPropertyName("proxy_url")]
|
||||
public string ProxyUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// height of video
|
||||
/// </summary>
|
||||
[JsonPropertyName("height")]
|
||||
public int Height { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// width of video
|
||||
/// </summary>
|
||||
[JsonPropertyName("width")]
|
||||
public int Width { get; set; }
|
||||
}
|
||||
}
|
31
src/Core/Interactions/MessageComponents/ButtonStyle.cs
Normal file
31
src/Core/Interactions/MessageComponents/ButtonStyle.cs
Normal file
|
@ -0,0 +1,31 @@
|
|||
namespace Geekbot.Core.Interactions.MessageComponents
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/message-components#button-object-button-styles" />
|
||||
public enum ButtonStyle
|
||||
{
|
||||
/// <summary>
|
||||
/// blurple
|
||||
/// </summary>
|
||||
Primary = 1,
|
||||
|
||||
/// <summary>
|
||||
/// grey
|
||||
/// </summary>
|
||||
Secondary = 2,
|
||||
|
||||
/// <summary>
|
||||
/// green
|
||||
/// </summary>
|
||||
Success = 3,
|
||||
|
||||
/// <summary>
|
||||
/// red
|
||||
/// </summary>
|
||||
Danger = 4,
|
||||
|
||||
/// <summary>
|
||||
/// grey, navigates to a URL
|
||||
/// </summary>
|
||||
Link = 5
|
||||
}
|
||||
}
|
111
src/Core/Interactions/MessageComponents/Component.cs
Normal file
111
src/Core/Interactions/MessageComponents/Component.cs
Normal file
|
@ -0,0 +1,111 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.MessageComponents
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/message-components#component-object-component-structure"/>
|
||||
public record Component
|
||||
{
|
||||
/// <summary>
|
||||
/// component type
|
||||
/// </summary>
|
||||
[JsonPropertyName("type")]
|
||||
public ComponentType Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// a developer-defined identifier for the component, max 100 characters
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Buttons, Select Menus
|
||||
/// </remarks>
|
||||
[JsonPropertyName("custom_id")]
|
||||
public string CustomId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// whether the component is disabled, default false
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Buttons, Select Menus
|
||||
/// </remarks>
|
||||
[JsonPropertyName("disabled")]
|
||||
public bool Disabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// one of button styles
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Buttons
|
||||
/// </remarks>
|
||||
[JsonPropertyName("style")]
|
||||
public ButtonStyle Style { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// text that appears on the button, max 80 characters
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Buttons
|
||||
/// </remarks>
|
||||
[JsonPropertyName("label")]
|
||||
public string Label { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// name, id, and animated
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Buttons
|
||||
/// </remarks>
|
||||
[JsonPropertyName("emoji")]
|
||||
public ComponentEmoji Emoji { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// a url for link-style buttons
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Buttons
|
||||
/// </remarks>
|
||||
[JsonPropertyName("url")]
|
||||
public string Url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// the choices in the select, max 25
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Select Menus
|
||||
/// </remarks>
|
||||
[JsonPropertyName("options")]
|
||||
public List<SelectOption> Options { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// custom placeholder text if nothing is selected, max 100 characters
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Select Menus
|
||||
/// </remarks>
|
||||
[JsonPropertyName("placeholder")]
|
||||
public string Placeholder { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// the minimum number of items that must be chosen; default 1, min 0, max 25
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Select Menus
|
||||
/// </remarks>
|
||||
[JsonPropertyName("min_values")]
|
||||
public int MinValues { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// the maximum number of items that can be chosen; default 1, max 25
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Select Menus
|
||||
/// </remarks>
|
||||
[JsonPropertyName("max_values")]
|
||||
public int MaxValues { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// a list of child components
|
||||
/// </summary>
|
||||
[JsonPropertyName("components")]
|
||||
public List<Component> Components { get; set; }
|
||||
}
|
||||
}
|
33
src/Core/Interactions/MessageComponents/ComponentEmoji.cs
Normal file
33
src/Core/Interactions/MessageComponents/ComponentEmoji.cs
Normal file
|
@ -0,0 +1,33 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.MessageComponents
|
||||
{
|
||||
/// <remarks>
|
||||
/// Partial emoji with just id, name, and animated
|
||||
/// </remarks>
|
||||
/// <see href="https://discord.com/developers/docs/resources/emoji#emoji-object" />
|
||||
public record ComponentEmoji
|
||||
{
|
||||
/// <summary>
|
||||
/// emoji name
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// can be null only in reaction emoji objects
|
||||
/// </remarks>
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// emoji id
|
||||
/// </summary>
|
||||
/// <see href="https://discord.com/developers/docs/reference#image-formatting" />
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// whether this emoji can be used, may be false due to loss of Server Boosts
|
||||
/// </summary>
|
||||
[JsonPropertyName("animated")]
|
||||
public bool Animated { get; set; }
|
||||
}
|
||||
}
|
21
src/Core/Interactions/MessageComponents/ComponentType.cs
Normal file
21
src/Core/Interactions/MessageComponents/ComponentType.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
namespace Geekbot.Core.Interactions.MessageComponents
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/message-components#component-object-component-types" />
|
||||
public enum ComponentType
|
||||
{
|
||||
/// <summary>
|
||||
/// A container for other components
|
||||
/// </summary>
|
||||
ActionRow = 1,
|
||||
|
||||
/// <summary>
|
||||
/// A button object
|
||||
/// </summary>
|
||||
Button = 2,
|
||||
|
||||
/// <summary>
|
||||
/// A select menu for picking from choices
|
||||
/// </summary>
|
||||
SelectMenu = 3
|
||||
}
|
||||
}
|
38
src/Core/Interactions/MessageComponents/SelectOption.cs
Normal file
38
src/Core/Interactions/MessageComponents/SelectOption.cs
Normal file
|
@ -0,0 +1,38 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.MessageComponents
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-option-structure" />
|
||||
public record SelectOption
|
||||
{
|
||||
/// <summary>
|
||||
/// the user-facing name of the option, max 100 characters
|
||||
/// </summary>
|
||||
[JsonPropertyName("label")]
|
||||
public string Label { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// the dev-define value of the option, max 100 characters
|
||||
/// </summary>
|
||||
[JsonPropertyName("value")]
|
||||
public string Value { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// an additional description of the option, max 100 characters
|
||||
/// </summary>
|
||||
[JsonPropertyName("description")]
|
||||
public string Description { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// id, name, and animated
|
||||
/// </summary>
|
||||
[JsonPropertyName("emoji")]
|
||||
public ComponentEmoji Emoji { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// will render this option as selected by default
|
||||
/// </summary>
|
||||
[JsonPropertyName("default")]
|
||||
public bool Default { get; set; }
|
||||
}
|
||||
}
|
77
src/Core/Interactions/Request/Interaction.cs
Normal file
77
src/Core/Interactions/Request/Interaction.cs
Normal file
|
@ -0,0 +1,77 @@
|
|||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Text.Json.Serialization;
|
||||
using Geekbot.Core.Interactions.Resolved;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Request
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object-interaction-structure" />
|
||||
public record Interaction
|
||||
{
|
||||
/// <summary>
|
||||
/// id of the interaction
|
||||
/// </summary>
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// id of the application this interaction is for
|
||||
/// </summary>
|
||||
[JsonPropertyName("application_id")]
|
||||
public string ApplicationId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// the type of interaction
|
||||
/// </summary>
|
||||
[JsonPropertyName("type")]
|
||||
public InteractionType Type { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// the command data payload
|
||||
/// </summary>
|
||||
[JsonPropertyName("data")]
|
||||
public InteractionData Data { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// the guild it was sent from
|
||||
/// </summary>
|
||||
[JsonPropertyName("guild_id")]
|
||||
public string GuildId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// the channel it was sent from
|
||||
/// </summary>
|
||||
[JsonPropertyName("channel_id")]
|
||||
public string ChannelId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// guild member data for the invoking user, including permissions
|
||||
/// </summary>
|
||||
[JsonPropertyName("member")]
|
||||
public Member Member { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// user object for the invoking user, if invoked in a DM
|
||||
/// </summary>
|
||||
[JsonPropertyName("user")]
|
||||
public User User { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// a continuation token for responding to the interaction
|
||||
/// </summary>
|
||||
[JsonPropertyName("token")]
|
||||
public string Token { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// read-only property, always 1
|
||||
/// </summary>
|
||||
[JsonPropertyName("version")]
|
||||
public int Version { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// object for components, the message they were attached to
|
||||
/// </summary>
|
||||
[JsonPropertyName("message")]
|
||||
public Message Message { get; init; }
|
||||
}
|
||||
}
|
109
src/Core/Interactions/Request/InteractionData.cs
Normal file
109
src/Core/Interactions/Request/InteractionData.cs
Normal file
|
@ -0,0 +1,109 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
using Geekbot.Core.Interactions.ApplicationCommand;
|
||||
using Geekbot.Core.Interactions.MessageComponents;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Request
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object-interaction-data-structure" />
|
||||
public class InteractionData
|
||||
{
|
||||
/// <summary>
|
||||
/// the ID of the invoked command
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Application Command
|
||||
/// </remarks>
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// the name of the invoked command
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Application Command
|
||||
/// </remarks>
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// the type of the invoked command
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Application Command
|
||||
/// </remarks>
|
||||
[JsonPropertyName("type")]
|
||||
public CommandType Type { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// converted users + roles + channels
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Application Command
|
||||
/// </remarks>
|
||||
[JsonPropertyName("resolved")]
|
||||
public InteractionResolvedData Resolved { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// of application command interaction data option the params + values from the user
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Application Command
|
||||
/// </remarks>
|
||||
[JsonPropertyName("options")]
|
||||
public List<InteractionOption> Options { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// the custom_id of the component
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Component
|
||||
/// </remarks>
|
||||
[JsonPropertyName("custom_id")]
|
||||
public string CustomId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// the type of the component
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Component
|
||||
/// </remarks>
|
||||
[JsonPropertyName("component_type")]
|
||||
public ComponentType ComponentType { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// of select option values the values the user selected
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Component (Select)
|
||||
/// </remarks>
|
||||
[JsonPropertyName("values")]
|
||||
public string Values { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// id the of user or message targetted by a user or message command
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For: Application Command
|
||||
/// Present in: User Command, Message Command
|
||||
/// </remarks>
|
||||
[JsonPropertyName("target_id")]
|
||||
public string TargetId { get; init; }
|
||||
|
||||
public string GetTargetNickname()
|
||||
{
|
||||
return GetUserNickename(TargetId);
|
||||
}
|
||||
|
||||
public string GetUserNickename(string userId)
|
||||
{
|
||||
var username = Resolved.Members[userId].Nick;
|
||||
if (string.IsNullOrEmpty(username))
|
||||
{
|
||||
username = Resolved.Users[userId].Username;
|
||||
}
|
||||
|
||||
return username;
|
||||
}
|
||||
}
|
||||
}
|
34
src/Core/Interactions/Request/InteractionOption.cs
Normal file
34
src/Core/Interactions/Request/InteractionOption.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
using Geekbot.Core.Interactions.ApplicationCommand;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Request
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-interaction-data-option-structure" />
|
||||
public record InteractionOption
|
||||
{
|
||||
/// <summary>
|
||||
/// the name of the parameter
|
||||
/// </summary>
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// value of application command option type
|
||||
/// </summary>
|
||||
[JsonPropertyName("type")]
|
||||
public OptionType Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// the value of the pair
|
||||
/// </summary>
|
||||
[JsonPropertyName("value")]
|
||||
public object Value { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// present if this option is a group or subcommand
|
||||
/// </summary>
|
||||
[JsonPropertyName("options")]
|
||||
public List<InteractionOption> Options { get; set; }
|
||||
}
|
||||
}
|
24
src/Core/Interactions/Request/InteractionResolvedData.cs
Normal file
24
src/Core/Interactions/Request/InteractionResolvedData.cs
Normal file
|
@ -0,0 +1,24 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
using Geekbot.Core.Interactions.Resolved;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Request
|
||||
{
|
||||
public class InteractionResolvedData
|
||||
{
|
||||
[JsonPropertyName("users")]
|
||||
public Dictionary<string, User> Users { get; set; }
|
||||
|
||||
[JsonPropertyName("members")]
|
||||
public Dictionary<string, Member> Members { get; set; }
|
||||
|
||||
[JsonPropertyName("roles")]
|
||||
public Dictionary<string, Role> Roles { get; set; }
|
||||
|
||||
[JsonPropertyName("channels")]
|
||||
public Dictionary<string, Channel> Channels { get; set; }
|
||||
|
||||
[JsonPropertyName("messages")]
|
||||
public Dictionary<string, Message> Messages { get; set; }
|
||||
}
|
||||
}
|
10
src/Core/Interactions/Request/InteractionType.cs
Normal file
10
src/Core/Interactions/Request/InteractionType.cs
Normal file
|
@ -0,0 +1,10 @@
|
|||
namespace Geekbot.Core.Interactions.Request
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object-interaction-type" />
|
||||
public enum InteractionType
|
||||
{
|
||||
Ping = 1,
|
||||
ApplicationCommand = 2,
|
||||
MessageComponent = 3,
|
||||
}
|
||||
}
|
34
src/Core/Interactions/Resolved/Attachment.cs
Normal file
34
src/Core/Interactions/Resolved/Attachment.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public record Attachment
|
||||
{
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[JsonPropertyName("filename")]
|
||||
public string Filename { get; set; }
|
||||
|
||||
[JsonPropertyName("content_type")]
|
||||
public string ContentType { get; set; }
|
||||
|
||||
[JsonPropertyName("size")]
|
||||
public int Size { get; set; }
|
||||
|
||||
[JsonPropertyName("url")]
|
||||
public string Url { get; set; }
|
||||
|
||||
[JsonPropertyName("proxy_url")]
|
||||
public string ProxyUrl { get; set; }
|
||||
|
||||
[JsonPropertyName("height")]
|
||||
public int Height { get; set; }
|
||||
|
||||
[JsonPropertyName("width")]
|
||||
public int Width { get; set; }
|
||||
|
||||
[JsonPropertyName("ephemeral")]
|
||||
public bool Ephemeral { get; set; }
|
||||
}
|
||||
}
|
25
src/Core/Interactions/Resolved/Channel.cs
Normal file
25
src/Core/Interactions/Resolved/Channel.cs
Normal file
|
@ -0,0 +1,25 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public record Channel
|
||||
{
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[JsonPropertyName("type")]
|
||||
public ChannelType Type { get; set; }
|
||||
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonPropertyName("parent_id")]
|
||||
public string ParentId { get; set; }
|
||||
|
||||
[JsonPropertyName("thread_metadata")]
|
||||
public ThreadMetadata ThreadMetadata { get; set; }
|
||||
|
||||
[JsonPropertyName("permissions")]
|
||||
public string Permissions { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
namespace Geekbot.Web.Controllers.Interactions.Model.Resolved
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public enum ChannelType
|
||||
{
|
32
src/Core/Interactions/Resolved/Emoji.cs
Normal file
32
src/Core/Interactions/Resolved/Emoji.cs
Normal file
|
@ -0,0 +1,32 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public record Emoji
|
||||
{
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonPropertyName("roles")]
|
||||
public List<string> Roles { get; set; }
|
||||
|
||||
[JsonPropertyName("user")]
|
||||
public User User { get; set; }
|
||||
|
||||
[JsonPropertyName("require_colons")]
|
||||
public bool RequireColons { get; set; }
|
||||
|
||||
[JsonPropertyName("managed")]
|
||||
public bool Managed { get; set; }
|
||||
|
||||
[JsonPropertyName("animated")]
|
||||
public bool Animated { get; set; }
|
||||
|
||||
[JsonPropertyName("available")]
|
||||
public bool Available { get; set; }
|
||||
}
|
||||
}
|
27
src/Core/Interactions/Resolved/Member.cs
Normal file
27
src/Core/Interactions/Resolved/Member.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public record Member
|
||||
{
|
||||
[JsonPropertyName("nick")]
|
||||
public string Nick { get; set; }
|
||||
|
||||
[JsonPropertyName("roles")]
|
||||
public List<string> Roles { get; set; }
|
||||
|
||||
[JsonPropertyName("joined_at")]
|
||||
public DateTime JoinedAt { get; set; }
|
||||
|
||||
[JsonPropertyName("premium_since")]
|
||||
public DateTime? PremiumSince { get; set; }
|
||||
|
||||
[JsonPropertyName("pending")]
|
||||
public bool Pending { get; set; }
|
||||
|
||||
[JsonPropertyName("permissions")]
|
||||
public string Permissions { get; set; }
|
||||
}
|
||||
}
|
103
src/Core/Interactions/Resolved/Message.cs
Normal file
103
src/Core/Interactions/Resolved/Message.cs
Normal file
|
@ -0,0 +1,103 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public record Message
|
||||
{
|
||||
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[JsonPropertyName("channel_id")]
|
||||
public string ChannelId { get; set; }
|
||||
|
||||
[JsonPropertyName("guild_id")]
|
||||
public string GuildId { get; set; }
|
||||
|
||||
[JsonPropertyName("author")]
|
||||
public User Author { get; set; }
|
||||
|
||||
[JsonPropertyName("member")]
|
||||
public Member Member { get; set; }
|
||||
|
||||
[JsonPropertyName("content")]
|
||||
public string Content { get; set; }
|
||||
|
||||
[JsonPropertyName("timestamp")]
|
||||
public DateTime Timestamp { get; set; }
|
||||
|
||||
[JsonPropertyName("edited_timestamp")]
|
||||
public DateTime? EditedTimestamp { get; set; }
|
||||
|
||||
[JsonPropertyName("tts")]
|
||||
public bool Tts { get; set; }
|
||||
|
||||
[JsonPropertyName("mention_everyone")]
|
||||
public bool MentionEveryone { get; set; }
|
||||
|
||||
[JsonPropertyName("mentions")]
|
||||
public List<User> Mentions { get; set; }
|
||||
|
||||
[JsonPropertyName("mention_roles")]
|
||||
public List<Role> MentionRoles { get; set; }
|
||||
|
||||
[JsonPropertyName("mention_channels")]
|
||||
public List<Channel> MentionChannels { get; set; }
|
||||
|
||||
[JsonPropertyName("attachments")]
|
||||
public List<Attachment> Attachments { get; set; }
|
||||
|
||||
[JsonPropertyName("embeds")]
|
||||
public List<Embed.Embed> Embeds { get; set; }
|
||||
|
||||
[JsonPropertyName("reactions")]
|
||||
public List<Reaction> Reactions { get; set; }
|
||||
|
||||
// [JsonPropertyName("nonce")]
|
||||
// public string Nonce { get; set; }
|
||||
|
||||
[JsonPropertyName("pinned")]
|
||||
public bool Pinned { get; set; }
|
||||
|
||||
[JsonPropertyName("webhook_id")]
|
||||
public string WebhookId { get; set; }
|
||||
|
||||
[JsonPropertyName("type")]
|
||||
public MessageType Type { get; set; }
|
||||
|
||||
// [JsonPropertyName("activity")]
|
||||
// public string Activity { get; set; }
|
||||
|
||||
// [JsonPropertyName("application")]
|
||||
// public string Application { get; set; }
|
||||
|
||||
[JsonPropertyName("application_id")]
|
||||
public string ApplicationId { get; set; }
|
||||
|
||||
// [JsonPropertyName("message_reference")]
|
||||
// public string MessageReference { get; set; }
|
||||
|
||||
[JsonPropertyName("flags")]
|
||||
public int Flags { get; set; }
|
||||
|
||||
[JsonPropertyName("referenced_message")]
|
||||
public Message ReferencedMessage { get; set; }
|
||||
|
||||
[JsonPropertyName("interaction")]
|
||||
public MessageInteraction Interaction { get; set; }
|
||||
|
||||
[JsonPropertyName("thread")]
|
||||
public Channel Thread { get; set; }
|
||||
|
||||
// [JsonPropertyName("components")]
|
||||
// public string Components { get; set; }
|
||||
|
||||
// [JsonPropertyName("sticker_items")]
|
||||
// public string StickerItems { get; set; }
|
||||
|
||||
// [JsonPropertyName("stickers")]
|
||||
// public string Stickers { get; set; }
|
||||
}
|
||||
}
|
20
src/Core/Interactions/Resolved/MessageInteraction.cs
Normal file
20
src/Core/Interactions/Resolved/MessageInteraction.cs
Normal file
|
@ -0,0 +1,20 @@
|
|||
using System.Text.Json.Serialization;
|
||||
using Geekbot.Core.Interactions.Request;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public record MessageInteraction
|
||||
{
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[JsonPropertyName("type")]
|
||||
public InteractionType Type { get; set; }
|
||||
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonPropertyName("user")]
|
||||
public User User { get; set; }
|
||||
}
|
||||
}
|
29
src/Core/Interactions/Resolved/MessageType.cs
Normal file
29
src/Core/Interactions/Resolved/MessageType.cs
Normal file
|
@ -0,0 +1,29 @@
|
|||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public enum MessageType
|
||||
{
|
||||
Default = 0,
|
||||
RecipientAdd = 1,
|
||||
RecipientRemove = 2,
|
||||
Call = 3,
|
||||
ChannelNameChange = 4,
|
||||
ChannelIconChange = 5,
|
||||
ChannelPinnedMessage = 6,
|
||||
GuildMemberJoin = 7,
|
||||
UserPremiumGuildSubscription = 8,
|
||||
UserPremiumGuildSubscriptionTier1 = 9,
|
||||
UserPremiumGuildSubscriptionTier2 = 10,
|
||||
UserPremiumGuildSubscriptionTier3 = 11,
|
||||
ChannelFollowAdd = 12,
|
||||
GuildDiscoveryDisqualified = 14,
|
||||
GuildDiscoveryRequalified = 15,
|
||||
GuildDiscoveryGracePeriodInitialWarning = 16,
|
||||
GuildDiscoveryGracePeriodFinalWarning = 17,
|
||||
ThreadCreated = 18,
|
||||
Reply = 19,
|
||||
ChatInputCommand = 20,
|
||||
ThreadStarterMessage = 21,
|
||||
GuildInviteReminder = 22,
|
||||
ContextMenuCommand = 23,
|
||||
}
|
||||
}
|
16
src/Core/Interactions/Resolved/Reaction.cs
Normal file
16
src/Core/Interactions/Resolved/Reaction.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public struct Reaction
|
||||
{
|
||||
[JsonPropertyName("count")]
|
||||
public int Count { get; set; }
|
||||
|
||||
[JsonPropertyName("me")]
|
||||
public bool Me { get; set; }
|
||||
|
||||
[JsonPropertyName("emoji")]
|
||||
public Emoji emoji { get; set; }
|
||||
}
|
||||
}
|
34
src/Core/Interactions/Resolved/Role.cs
Normal file
34
src/Core/Interactions/Resolved/Role.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public record Role
|
||||
{
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonPropertyName("color")]
|
||||
public int Color { get; set; }
|
||||
|
||||
[JsonPropertyName("hoist")]
|
||||
public bool Hoist { get; set; }
|
||||
|
||||
[JsonPropertyName("position")]
|
||||
public int Position { get; set; }
|
||||
|
||||
[JsonPropertyName("permissions")]
|
||||
public string Permissions { get; set; }
|
||||
|
||||
[JsonPropertyName("managed")]
|
||||
public bool Managed { get; set; }
|
||||
|
||||
[JsonPropertyName("mentionable")]
|
||||
public bool Mentionable { get; set; }
|
||||
|
||||
[JsonPropertyName("tags")]
|
||||
public RoleTag Tags { get; set; }
|
||||
}
|
||||
}
|
16
src/Core/Interactions/Resolved/RoleTag.cs
Normal file
16
src/Core/Interactions/Resolved/RoleTag.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public record RoleTag
|
||||
{
|
||||
[JsonPropertyName("bot_id")]
|
||||
public string BotId { get; set; }
|
||||
|
||||
[JsonPropertyName("integration_id")]
|
||||
public string IntegrationId { get; set; }
|
||||
|
||||
[JsonPropertyName("premium_subscriber")]
|
||||
public bool PremiumSubscriber { get; set; }
|
||||
}
|
||||
}
|
23
src/Core/Interactions/Resolved/ThreadMetadata.cs
Normal file
23
src/Core/Interactions/Resolved/ThreadMetadata.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public record ThreadMetadata
|
||||
{
|
||||
[JsonPropertyName("archived")]
|
||||
public bool Archived { get; set; }
|
||||
|
||||
[JsonPropertyName("auto_archive_duration")]
|
||||
public int AutoArchiveDuration { get; set; }
|
||||
|
||||
[JsonPropertyName("archive_timestamp")]
|
||||
public DateTime ArchiveTimestamp { get; set; }
|
||||
|
||||
[JsonPropertyName("locked")]
|
||||
public bool Locked { get; set; }
|
||||
|
||||
[JsonPropertyName("invitable")]
|
||||
public bool Invitable { get; set; }
|
||||
}
|
||||
}
|
52
src/Core/Interactions/Resolved/User.cs
Normal file
52
src/Core/Interactions/Resolved/User.cs
Normal file
|
@ -0,0 +1,52 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Resolved
|
||||
{
|
||||
public record User
|
||||
{
|
||||
[JsonPropertyName("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[JsonPropertyName("username")]
|
||||
public string Username { get; set; }
|
||||
|
||||
[JsonPropertyName("discriminator")]
|
||||
public string Discriminator { get; set; }
|
||||
|
||||
[JsonPropertyName("avatar")]
|
||||
public string Avatar { get; set; }
|
||||
|
||||
[JsonPropertyName("bot")]
|
||||
public bool Bot { get; set; }
|
||||
|
||||
[JsonPropertyName("system")]
|
||||
public bool System { get; set; }
|
||||
|
||||
[JsonPropertyName("mfa_enabled")]
|
||||
public bool MfaEnabled { get; set; }
|
||||
|
||||
[JsonPropertyName("banner")]
|
||||
public string Banner { get; set; }
|
||||
|
||||
[JsonPropertyName("accent_color")]
|
||||
public int AccentColor { get; set; }
|
||||
|
||||
[JsonPropertyName("locale")]
|
||||
public string Locale { get; set; }
|
||||
|
||||
[JsonPropertyName("verified")]
|
||||
public bool Verified { get; set; }
|
||||
|
||||
[JsonPropertyName("email")]
|
||||
public string Email { get; set; }
|
||||
|
||||
[JsonPropertyName("flags")]
|
||||
public int Flags { get; set; }
|
||||
|
||||
[JsonPropertyName("premium_type")]
|
||||
public int PremiumType { get; set; }
|
||||
|
||||
[JsonPropertyName("public_flags")]
|
||||
public int PublicFlags { get; set; }
|
||||
}
|
||||
}
|
23
src/Core/Interactions/Response/InteractionResponse.cs
Normal file
23
src/Core/Interactions/Response/InteractionResponse.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Response
|
||||
{
|
||||
/// <summary>
|
||||
/// Interactions--both receiving and responding--are webhooks under the hood. So responding to an Interaction is just like sending a webhook request!
|
||||
/// </summary>
|
||||
/// <see href="https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-interaction-response-structure"/>
|
||||
public record InteractionResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// the type of response
|
||||
/// </summary>
|
||||
[JsonPropertyName("type")]
|
||||
public InteractionResponseType Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// an optional response message
|
||||
/// </summary>
|
||||
[JsonPropertyName("data")]
|
||||
public InteractionResponseData Data { get; set; }
|
||||
}
|
||||
}
|
51
src/Core/Interactions/Response/InteractionResponseData.cs
Normal file
51
src/Core/Interactions/Response/InteractionResponseData.cs
Normal file
|
@ -0,0 +1,51 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
using Discord;
|
||||
using Geekbot.Core.Interactions.MessageComponents;
|
||||
using Embed = Geekbot.Core.Interactions.Embed.Embed;
|
||||
|
||||
namespace Geekbot.Core.Interactions.Response
|
||||
{
|
||||
/// <remarks>
|
||||
/// Not all message fields are currently supported.
|
||||
/// </remarks>
|
||||
/// <see href="https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-interaction-callback-data-structure"/>
|
||||
public record InteractionResponseData
|
||||
{
|
||||
/// <summary>
|
||||
/// is the response TTS
|
||||
/// </summary>
|
||||
[JsonPropertyName("tts")]
|
||||
public bool Tts { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// message content
|
||||
/// </summary>
|
||||
[JsonPropertyName("content")]
|
||||
public string Content { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// supports up to 10 embeds
|
||||
/// </summary>
|
||||
[JsonPropertyName("embeds")]
|
||||
public List<Embed.Embed> Embeds { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// allowed mentions object
|
||||
/// </summary>
|
||||
[JsonPropertyName("allowed_mentions")]
|
||||
public AllowedMentions AllowedMentions { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// interaction callback data flags
|
||||
/// </summary>
|
||||
[JsonPropertyName("flags")]
|
||||
public int Flags { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// message components
|
||||
/// </summary>
|
||||
[JsonPropertyName("components")]
|
||||
public List<Component> Components { get; set; }
|
||||
}
|
||||
}
|
34
src/Core/Interactions/Response/InteractionResponseType.cs
Normal file
34
src/Core/Interactions/Response/InteractionResponseType.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
namespace Geekbot.Core.Interactions.Response
|
||||
{
|
||||
/// <see href="https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-interaction-callback-type"/>
|
||||
public enum InteractionResponseType
|
||||
{
|
||||
/// <summary>
|
||||
/// ACK a Ping
|
||||
/// </summary>
|
||||
Pong = 1,
|
||||
|
||||
/// <summary>
|
||||
/// respond to an interaction with a message
|
||||
/// </summary>
|
||||
ChannelMessageWithSource = 4,
|
||||
|
||||
/// <summary>
|
||||
/// ACK an interaction and edit a response later, the user sees a loading state
|
||||
/// </summary>
|
||||
DeferredChannelMessageWithSource = 5,
|
||||
|
||||
/// <summary>
|
||||
/// for components, ACK an interaction and edit the original message later; the user does not see a loading state
|
||||
/// </summary>
|
||||
DeferredUpdateMessage = 6,
|
||||
|
||||
/// <summary>
|
||||
/// for components, edit the message the component was attached to
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Only valid for component-based interactions
|
||||
/// </remarks>
|
||||
UpdateMessage = 7,
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
namespace Geekbot.Web.Controllers.Interactions.Model
|
||||
{
|
||||
public enum ApplicationCommandOption
|
||||
{
|
||||
SubCommand = 1,
|
||||
SubCommandGroup = 2,
|
||||
String = 3,
|
||||
Integer = 4,
|
||||
Boolean = 5,
|
||||
User = 6,
|
||||
Channel = 7,
|
||||
Role = 8,
|
||||
Mentionable = 9,
|
||||
Number = 10,
|
||||
}
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Web.Controllers.Interactions.Model
|
||||
{
|
||||
public record Interaction
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string ApplicationId { get; init; }
|
||||
[Required]
|
||||
public InteractionType Type { get; set; }
|
||||
public InteractionData Data { get; init; }
|
||||
public string GuildId { get; init; }
|
||||
public string Name { get; init; }
|
||||
public string Description { get; init; }
|
||||
public List<InteractionOption> Options { get; init; }
|
||||
public bool DefaultPermission { get; init; }
|
||||
[Required]
|
||||
public int Version { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace Geekbot.Web.Controllers.Interactions.Model
|
||||
{
|
||||
public record InteractionData
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public int Type { get; set;}
|
||||
public InteractionResolvedData Resolved { get; set; }
|
||||
public List<InteractionOption> Options { get; set; }
|
||||
public string TargetId { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace Geekbot.Web.Controllers.Interactions.Model
|
||||
{
|
||||
public record InteractionOption
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public ApplicationCommandOption Type { get; set; }
|
||||
public string Value { get; set; }
|
||||
public List<InteractionOption> Options { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using Discord;
|
||||
using Geekbot.Web.Controllers.Interactions.Model.Resolved;
|
||||
|
||||
namespace Geekbot.Web.Controllers.Interactions.Model
|
||||
{
|
||||
public class InteractionResolvedData
|
||||
{
|
||||
public Dictionary<string, User> Users { get; set; }
|
||||
public Dictionary<string, Member> Members { get; set; }
|
||||
public Dictionary<string, Roles> Roles { get; set; }
|
||||
public Dictionary<string, Channel> Channels { get; set; }
|
||||
// public Dictionary<string, IMessage> Messages { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Geekbot.Web.Controllers.Interactions.Model
|
||||
{
|
||||
public record InteractionResponse
|
||||
{
|
||||
[JsonPropertyName("type")]
|
||||
public InteractionResponseType Type { get; set; }
|
||||
|
||||
[JsonPropertyName("data")]
|
||||
public InteractionData Data { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using Discord;
|
||||
using Geekbot.Web.Controllers.Interactions.Model.MessageComponents;
|
||||
|
||||
namespace Geekbot.Web.Controllers.Interactions.Model
|
||||
{
|
||||
public record InteractionResponseData
|
||||
{
|
||||
public bool Tts { get; set; } = false;
|
||||
public string Content { get; set; }
|
||||
public List<string> Embeds { get; set; }
|
||||
public AllowedMentions AllowedMentions { get; set; }
|
||||
public int Flags { get; set; }
|
||||
public List<Component> Components { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
namespace Geekbot.Web.Controllers.Interactions.Model
|
||||
{
|
||||
public enum InteractionResponseType
|
||||
{
|
||||
Pong = 1,
|
||||
ChannelMessageWithSource = 4,
|
||||
DeferredChannelMessageWithSource = 5,
|
||||
DeferredUpdateMessage = 6,
|
||||
UpdateMessage = 7,
|
||||
}
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
namespace Geekbot.Web.Controllers.Interactions.Model
|
||||
{
|
||||
public enum InteractionType
|
||||
{
|
||||
Ping = 1,
|
||||
ApplicationCommand = 2,
|
||||
MessageComponent = 3,
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
namespace Geekbot.Web.Controllers.Interactions.Model.MessageComponents
|
||||
{
|
||||
public record Component
|
||||
{
|
||||
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
namespace Geekbot.Web.Controllers.Interactions.Model.Resolved
|
||||
{
|
||||
public record Channel
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public ChannelType Type { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string ParentId { get; set; }
|
||||
public ThreadMetadata ThreadMetadata { get; set; }
|
||||
public string Permissions { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Geekbot.Web.Controllers.Interactions.Model.Resolved
|
||||
{
|
||||
public record Member
|
||||
{
|
||||
// public User User { get; set; }
|
||||
public string Nick { get; set; }
|
||||
public List<string> Roles { get; set; }
|
||||
public DateTime JoinedAt { get; set; }
|
||||
public DateTime PremiumSince { get; set; }
|
||||
public bool Pending { get; set; }
|
||||
public string Permissions { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
namespace Geekbot.Web.Controllers.Interactions.Model.Resolved
|
||||
{
|
||||
public record RoleTag
|
||||
{
|
||||
public string BotId { get; set; }
|
||||
public string IntegrationId { get; set; }
|
||||
public bool PremiumSubscriber { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
namespace Geekbot.Web.Controllers.Interactions.Model.Resolved
|
||||
{
|
||||
public record Roles
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public int Color { get; set; }
|
||||
public bool Hoist { get; set; }
|
||||
public int Position { get; set; }
|
||||
public string Permissions { get; set; }
|
||||
public bool Managed { get; set; }
|
||||
public bool Mentionable { get; set; }
|
||||
public RoleTag Tags { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
using System;
|
||||
|
||||
namespace Geekbot.Web.Controllers.Interactions.Model.Resolved
|
||||
{
|
||||
public record ThreadMetadata
|
||||
{
|
||||
public bool Archived { get; set; }
|
||||
public int AutoArchiveDuration { get; set; }
|
||||
public DateTime ArchiveTimestamp { get; set; }
|
||||
public bool Locked { get; set; }
|
||||
public bool Invitable { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
namespace Geekbot.Web.Controllers.Interactions.Model.Resolved
|
||||
{
|
||||
public record User
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string Username { get; set; }
|
||||
public string Discriminator { get; set; }
|
||||
public string Avatar { get; set; }
|
||||
public bool Bot { get; set; }
|
||||
public bool System { get; set; }
|
||||
public bool MfaEnabled { get; set; }
|
||||
public string Banner { get; set; }
|
||||
public int AccentColor { get; set; }
|
||||
public string Locale { get; set; }
|
||||
public bool Verified { get; set; }
|
||||
public string Email { get; set; }
|
||||
public int Flags { get; set; }
|
||||
public int PremiumType { get; set; }
|
||||
public int PublicFlags { get; set; }
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue