2024-11-21 21:25:29 -03:00
|
|
|
package bot
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
2024-11-21 21:32:36 -03:00
|
|
|
"fmt"
|
2024-11-21 21:25:29 -03:00
|
|
|
"slices"
|
2024-11-22 18:35:17 -03:00
|
|
|
"unicode/utf8"
|
2024-11-21 21:25:29 -03:00
|
|
|
|
|
|
|
|
"github.com/bwmarrin/discordgo"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type ChatCommand struct {
|
|
|
|
|
Name string
|
|
|
|
|
NameLocalizations *map[discordgo.Locale]string
|
|
|
|
|
DefaultMemberPermissions *int64
|
|
|
|
|
NSFW *bool
|
|
|
|
|
Description string
|
|
|
|
|
DescriptionLocalizations *map[discordgo.Locale]string
|
|
|
|
|
Options []ChatCommandOption
|
2024-11-22 10:37:40 -03:00
|
|
|
Handler Handler[ChatCommandContext]
|
2024-11-21 21:25:29 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *ChatCommand) ApplicationCommand() *discordgo.ApplicationCommand {
|
|
|
|
|
requiredOpts := []*discordgo.ApplicationCommandOption{}
|
|
|
|
|
opts := []*discordgo.ApplicationCommandOption{}
|
|
|
|
|
|
|
|
|
|
for _, o := range c.Options {
|
|
|
|
|
opt := o.ApplicationCommandOption()
|
|
|
|
|
if opt.Required {
|
|
|
|
|
requiredOpts = append(requiredOpts, opt)
|
|
|
|
|
} else {
|
|
|
|
|
opts = append(opts, opt)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &discordgo.ApplicationCommand{
|
|
|
|
|
Type: discordgo.ChatApplicationCommand,
|
|
|
|
|
Name: c.Name,
|
|
|
|
|
NameLocalizations: c.NameLocalizations,
|
|
|
|
|
DefaultMemberPermissions: c.DefaultMemberPermissions,
|
|
|
|
|
NSFW: c.NSFW,
|
|
|
|
|
Description: c.Description,
|
|
|
|
|
DescriptionLocalizations: c.DescriptionLocalizations,
|
|
|
|
|
Options: slices.Concat(requiredOpts, opts),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *ChatCommand) Validate() (bool, error) {
|
|
|
|
|
switch {
|
|
|
|
|
case c.Name == "":
|
2024-11-22 18:50:33 -03:00
|
|
|
return false, errors.New("required field \"Name\" is empty")
|
2024-11-21 21:25:29 -03:00
|
|
|
case c.Description == "":
|
2024-11-22 18:50:33 -03:00
|
|
|
return false, errors.New("required field \"Description\" is empty")
|
2024-11-21 21:25:29 -03:00
|
|
|
case c.Handler == nil:
|
2024-11-22 18:50:33 -03:00
|
|
|
return false, errors.New("required field \"Handler\" is empty")
|
2024-11-21 21:25:29 -03:00
|
|
|
}
|
2024-11-21 21:32:36 -03:00
|
|
|
|
|
|
|
|
for _, opt := range c.Options {
|
|
|
|
|
if ok, err := opt.Validate(); !ok {
|
|
|
|
|
return false, errors.Join(
|
2024-11-22 18:50:33 -03:00
|
|
|
fmt.Errorf("option %q is not valid", opt.ApplicationCommandOption().Name),
|
2024-11-21 21:32:36 -03:00
|
|
|
err,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-21 21:25:29 -03:00
|
|
|
return true, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ChatCommandOption interface {
|
|
|
|
|
ApplicationCommandOption() *discordgo.ApplicationCommandOption
|
|
|
|
|
Validate() (bool, error)
|
|
|
|
|
}
|
2024-11-21 21:32:36 -03:00
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
type ChatCommandAttachmentOption struct {
|
2024-11-21 21:32:36 -03:00
|
|
|
Name string
|
2024-11-22 10:38:22 -03:00
|
|
|
Value string
|
2024-11-21 21:32:36 -03:00
|
|
|
NameLocalizations map[discordgo.Locale]string
|
|
|
|
|
Description string
|
|
|
|
|
DescriptionLocalizations map[discordgo.Locale]string
|
|
|
|
|
Required bool
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandAttachmentOption) ApplicationCommandOption() *discordgo.ApplicationCommandOption {
|
2024-11-21 21:32:36 -03:00
|
|
|
return &discordgo.ApplicationCommandOption{
|
2024-11-22 10:45:08 -03:00
|
|
|
Type: discordgo.ApplicationCommandOptionAttachment,
|
2024-11-21 21:32:36 -03:00
|
|
|
Name: o.Name,
|
|
|
|
|
NameLocalizations: o.NameLocalizations,
|
|
|
|
|
Description: o.Description,
|
|
|
|
|
DescriptionLocalizations: o.DescriptionLocalizations,
|
|
|
|
|
Required: o.Required,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandAttachmentOption) Validate() (bool, error) {
|
2024-11-21 21:32:36 -03:00
|
|
|
return validateOption(o)
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
type ChatCommandBooleanOption struct {
|
2024-11-21 21:33:18 -03:00
|
|
|
Name string
|
2024-11-22 10:45:08 -03:00
|
|
|
Value bool
|
2024-11-21 21:33:18 -03:00
|
|
|
NameLocalizations map[discordgo.Locale]string
|
|
|
|
|
Description string
|
|
|
|
|
DescriptionLocalizations map[discordgo.Locale]string
|
|
|
|
|
Required bool
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandBooleanOption) ApplicationCommandOption() *discordgo.ApplicationCommandOption {
|
2024-11-21 21:33:18 -03:00
|
|
|
return &discordgo.ApplicationCommandOption{
|
2024-11-22 10:45:08 -03:00
|
|
|
Type: discordgo.ApplicationCommandOptionBoolean,
|
2024-11-21 21:33:18 -03:00
|
|
|
Name: o.Name,
|
|
|
|
|
NameLocalizations: o.NameLocalizations,
|
|
|
|
|
Description: o.Description,
|
|
|
|
|
DescriptionLocalizations: o.DescriptionLocalizations,
|
|
|
|
|
Required: o.Required,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandBooleanOption) Validate() (bool, error) {
|
2024-11-21 21:33:18 -03:00
|
|
|
return validateOption(o)
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
type ChatCommandChannelOption struct {
|
2024-11-21 21:33:36 -03:00
|
|
|
Name string
|
2024-11-22 10:45:08 -03:00
|
|
|
Value string
|
2024-11-21 21:33:36 -03:00
|
|
|
NameLocalizations map[discordgo.Locale]string
|
|
|
|
|
Description string
|
|
|
|
|
DescriptionLocalizations map[discordgo.Locale]string
|
|
|
|
|
Required bool
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandChannelOption) ApplicationCommandOption() *discordgo.ApplicationCommandOption {
|
2024-11-21 21:33:36 -03:00
|
|
|
return &discordgo.ApplicationCommandOption{
|
2024-11-22 10:45:08 -03:00
|
|
|
Type: discordgo.ApplicationCommandOptionChannel,
|
2024-11-21 21:33:36 -03:00
|
|
|
Name: o.Name,
|
|
|
|
|
NameLocalizations: o.NameLocalizations,
|
|
|
|
|
Description: o.Description,
|
|
|
|
|
DescriptionLocalizations: o.DescriptionLocalizations,
|
|
|
|
|
Required: o.Required,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandChannelOption) Validate() (bool, error) {
|
2024-11-21 21:33:36 -03:00
|
|
|
return validateOption(o)
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
type ChatCommandIntegerOption struct {
|
2024-11-21 21:33:55 -03:00
|
|
|
Name string
|
2024-11-22 10:45:08 -03:00
|
|
|
Value int
|
2024-11-21 21:33:55 -03:00
|
|
|
NameLocalizations map[discordgo.Locale]string
|
|
|
|
|
Description string
|
|
|
|
|
DescriptionLocalizations map[discordgo.Locale]string
|
|
|
|
|
Required bool
|
2024-11-22 10:45:08 -03:00
|
|
|
Autocomplete bool
|
2024-11-22 18:46:16 -03:00
|
|
|
Choices []*ChatCommandOptionChoice[int]
|
2024-11-22 10:45:08 -03:00
|
|
|
MinValue int
|
|
|
|
|
MaxValue int
|
2024-11-21 21:33:55 -03:00
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandIntegerOption) ApplicationCommandOption() *discordgo.ApplicationCommandOption {
|
2024-11-21 21:33:55 -03:00
|
|
|
choices := make([]*discordgo.ApplicationCommandOptionChoice, len(o.Choices))
|
|
|
|
|
for i, v := range o.Choices {
|
|
|
|
|
choices[i] = &discordgo.ApplicationCommandOptionChoice{
|
|
|
|
|
Name: v.Name,
|
|
|
|
|
NameLocalizations: v.NameLocalizations,
|
|
|
|
|
Value: any(v.Value),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
minValue := float64(o.MinValue)
|
|
|
|
|
|
2024-11-21 21:33:55 -03:00
|
|
|
return &discordgo.ApplicationCommandOption{
|
2024-11-22 10:45:08 -03:00
|
|
|
Type: discordgo.ApplicationCommandOptionInteger,
|
2024-11-21 21:33:55 -03:00
|
|
|
Name: o.Name,
|
|
|
|
|
NameLocalizations: o.NameLocalizations,
|
|
|
|
|
Description: o.Description,
|
|
|
|
|
DescriptionLocalizations: o.DescriptionLocalizations,
|
|
|
|
|
Required: o.Required,
|
2024-11-22 10:45:08 -03:00
|
|
|
Autocomplete: o.Autocomplete,
|
|
|
|
|
MinValue: &minValue,
|
|
|
|
|
MaxValue: float64(o.MaxValue),
|
2024-11-21 21:33:55 -03:00
|
|
|
Choices: choices,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandIntegerOption) Validate() (bool, error) {
|
2024-11-22 18:35:17 -03:00
|
|
|
for _, c := range o.Choices {
|
|
|
|
|
if c.Value < o.MinValue {
|
|
|
|
|
return false, fmt.Errorf(
|
2024-11-22 18:50:33 -03:00
|
|
|
"choice %q has value (%v) smaller than allowed by field \"MinValue\" (%v)",
|
2024-11-22 18:35:17 -03:00
|
|
|
c.Name,
|
|
|
|
|
c.Value,
|
|
|
|
|
o.MinValue,
|
|
|
|
|
)
|
|
|
|
|
} else if c.Value > o.MaxValue {
|
|
|
|
|
return false, fmt.Errorf(
|
2024-11-22 18:50:33 -03:00
|
|
|
"choice %q has value (%v) bigger than allowed by field \"MaxValue\" (%v)",
|
2024-11-22 18:35:17 -03:00
|
|
|
c.Name,
|
|
|
|
|
c.Value,
|
|
|
|
|
o.MaxValue,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-21 21:33:55 -03:00
|
|
|
return validateOption(o)
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
type ChatCommandMentionableOption struct {
|
2024-11-21 21:34:12 -03:00
|
|
|
Name string
|
2024-11-22 10:38:22 -03:00
|
|
|
Value string
|
2024-11-21 21:34:12 -03:00
|
|
|
NameLocalizations map[discordgo.Locale]string
|
|
|
|
|
Description string
|
|
|
|
|
DescriptionLocalizations map[discordgo.Locale]string
|
|
|
|
|
Required bool
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandMentionableOption) ApplicationCommandOption() *discordgo.ApplicationCommandOption {
|
2024-11-21 21:34:12 -03:00
|
|
|
return &discordgo.ApplicationCommandOption{
|
2024-11-22 10:45:08 -03:00
|
|
|
Type: discordgo.ApplicationCommandOptionMentionable,
|
2024-11-21 21:34:12 -03:00
|
|
|
Name: o.Name,
|
|
|
|
|
NameLocalizations: o.NameLocalizations,
|
|
|
|
|
Description: o.Description,
|
|
|
|
|
DescriptionLocalizations: o.DescriptionLocalizations,
|
|
|
|
|
Required: o.Required,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandMentionableOption) Validate() (bool, error) {
|
2024-11-21 21:34:38 -03:00
|
|
|
return validateOption(o)
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
type ChatCommandNumberOption struct {
|
2024-11-21 21:34:38 -03:00
|
|
|
Name string
|
2024-11-22 10:45:08 -03:00
|
|
|
Value float64
|
2024-11-21 21:34:38 -03:00
|
|
|
NameLocalizations map[discordgo.Locale]string
|
|
|
|
|
Description string
|
|
|
|
|
DescriptionLocalizations map[discordgo.Locale]string
|
|
|
|
|
Required bool
|
2024-11-22 10:45:08 -03:00
|
|
|
Autocomplete bool
|
2024-11-22 18:46:16 -03:00
|
|
|
Choices []*ChatCommandOptionChoice[float64]
|
2024-11-22 10:45:08 -03:00
|
|
|
MinValue float64
|
|
|
|
|
MaxValue float64
|
2024-11-21 21:34:38 -03:00
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandNumberOption) ApplicationCommandOption() *discordgo.ApplicationCommandOption {
|
2024-11-21 21:34:38 -03:00
|
|
|
choices := make([]*discordgo.ApplicationCommandOptionChoice, len(o.Choices))
|
|
|
|
|
for i, v := range o.Choices {
|
|
|
|
|
choices[i] = &discordgo.ApplicationCommandOptionChoice{
|
|
|
|
|
Name: v.Name,
|
|
|
|
|
NameLocalizations: v.NameLocalizations,
|
|
|
|
|
Value: any(v.Value),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &discordgo.ApplicationCommandOption{
|
2024-11-22 10:45:08 -03:00
|
|
|
Type: discordgo.ApplicationCommandOptionNumber,
|
2024-11-21 21:34:38 -03:00
|
|
|
Name: o.Name,
|
|
|
|
|
NameLocalizations: o.NameLocalizations,
|
|
|
|
|
Description: o.Description,
|
|
|
|
|
DescriptionLocalizations: o.DescriptionLocalizations,
|
|
|
|
|
Required: o.Required,
|
2024-11-22 10:45:08 -03:00
|
|
|
Autocomplete: o.Autocomplete,
|
|
|
|
|
MinValue: &o.MinValue,
|
|
|
|
|
MaxValue: o.MaxValue,
|
2024-11-21 21:34:38 -03:00
|
|
|
Choices: choices,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandNumberOption) Validate() (bool, error) {
|
2024-11-22 18:35:17 -03:00
|
|
|
for _, c := range o.Choices {
|
|
|
|
|
if c.Value < o.MinValue {
|
|
|
|
|
return false, fmt.Errorf(
|
2024-11-22 18:50:33 -03:00
|
|
|
"choice %q has value (%v) smaller than allowed by field \"MinValue\" (%v)",
|
2024-11-22 18:35:17 -03:00
|
|
|
c.Name,
|
|
|
|
|
c.Value,
|
|
|
|
|
o.MinValue,
|
|
|
|
|
)
|
|
|
|
|
} else if c.Value > o.MaxValue {
|
|
|
|
|
return false, fmt.Errorf(
|
2024-11-22 18:50:33 -03:00
|
|
|
"choice %q has value (%v) bigger than allowed by field \"MaxValue\" (%v)",
|
2024-11-22 18:35:17 -03:00
|
|
|
c.Name,
|
|
|
|
|
c.Value,
|
|
|
|
|
o.MaxValue,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-21 21:35:05 -03:00
|
|
|
return validateOption(o)
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
type ChatCommandRoleOption struct {
|
2024-11-21 21:35:05 -03:00
|
|
|
Name string
|
2024-11-22 10:38:22 -03:00
|
|
|
Value string
|
2024-11-21 21:35:05 -03:00
|
|
|
NameLocalizations map[discordgo.Locale]string
|
|
|
|
|
Description string
|
|
|
|
|
DescriptionLocalizations map[discordgo.Locale]string
|
|
|
|
|
Required bool
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandRoleOption) ApplicationCommandOption() *discordgo.ApplicationCommandOption {
|
2024-11-21 21:35:05 -03:00
|
|
|
return &discordgo.ApplicationCommandOption{
|
2024-11-22 10:45:08 -03:00
|
|
|
Type: discordgo.ApplicationCommandOptionRole,
|
2024-11-21 21:35:05 -03:00
|
|
|
Name: o.Name,
|
|
|
|
|
NameLocalizations: o.NameLocalizations,
|
|
|
|
|
Description: o.Description,
|
|
|
|
|
DescriptionLocalizations: o.DescriptionLocalizations,
|
|
|
|
|
Required: o.Required,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandRoleOption) Validate() (bool, error) {
|
2024-11-21 21:35:05 -03:00
|
|
|
return validateOption(o)
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
type ChatCommandStringOption struct {
|
2024-11-21 21:35:18 -03:00
|
|
|
Name string
|
2024-11-22 10:45:08 -03:00
|
|
|
Value string
|
2024-11-21 21:35:18 -03:00
|
|
|
NameLocalizations map[discordgo.Locale]string
|
|
|
|
|
Description string
|
|
|
|
|
DescriptionLocalizations map[discordgo.Locale]string
|
|
|
|
|
Required bool
|
|
|
|
|
Autocomplete bool
|
2024-11-22 18:46:16 -03:00
|
|
|
Choices []*ChatCommandOptionChoice[string]
|
2024-11-22 10:45:08 -03:00
|
|
|
MinLength int
|
|
|
|
|
MaxLength int
|
2024-11-21 21:35:18 -03:00
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandStringOption) ApplicationCommandOption() *discordgo.ApplicationCommandOption {
|
2024-11-21 21:35:18 -03:00
|
|
|
choices := make([]*discordgo.ApplicationCommandOptionChoice, len(o.Choices))
|
|
|
|
|
for i, v := range o.Choices {
|
|
|
|
|
choices[i] = &discordgo.ApplicationCommandOptionChoice{
|
|
|
|
|
Name: v.Name,
|
|
|
|
|
NameLocalizations: v.NameLocalizations,
|
|
|
|
|
Value: any(v.Value),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &discordgo.ApplicationCommandOption{
|
2024-11-22 10:45:08 -03:00
|
|
|
Type: discordgo.ApplicationCommandOptionString,
|
2024-11-21 21:35:18 -03:00
|
|
|
Name: o.Name,
|
|
|
|
|
NameLocalizations: o.NameLocalizations,
|
|
|
|
|
Description: o.Description,
|
|
|
|
|
DescriptionLocalizations: o.DescriptionLocalizations,
|
|
|
|
|
Required: o.Required,
|
|
|
|
|
Autocomplete: o.Autocomplete,
|
2024-11-22 10:45:08 -03:00
|
|
|
MinLength: &o.MinLength,
|
|
|
|
|
MaxLength: o.MaxLength,
|
2024-11-21 21:35:18 -03:00
|
|
|
Choices: choices,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandStringOption) Validate() (bool, error) {
|
|
|
|
|
if o.MinLength > 6000 {
|
|
|
|
|
return false, errors.New(
|
2024-11-22 18:50:33 -03:00
|
|
|
"field \"MinLength\" has value that exceeds the allowed limit of 6000",
|
2024-11-22 10:45:08 -03:00
|
|
|
)
|
|
|
|
|
} else if o.MaxLength > 6000 {
|
|
|
|
|
return false, errors.New(
|
2024-11-22 18:50:33 -03:00
|
|
|
"field \"MaxLength\" has value that exceeds the allowed limit of 6000",
|
2024-11-22 10:45:08 -03:00
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 18:35:17 -03:00
|
|
|
for _, c := range o.Choices {
|
|
|
|
|
l := utf8.RuneCountInString(c.Value)
|
|
|
|
|
if l < o.MinLength {
|
|
|
|
|
return false, fmt.Errorf(
|
2024-11-22 18:50:33 -03:00
|
|
|
"choice %q has value (%q) with length (%v) smaller than allowed by \"MinLength\" field (%v)",
|
2024-11-22 18:35:17 -03:00
|
|
|
c.Name,
|
|
|
|
|
l,
|
|
|
|
|
c.Value,
|
|
|
|
|
o.MinLength,
|
|
|
|
|
)
|
|
|
|
|
} else if l > o.MaxLength {
|
|
|
|
|
return false, fmt.Errorf(
|
2024-11-22 18:50:33 -03:00
|
|
|
"choice %q has value (%q) with length (%v) bigger than allowed by \"MaxLength\" field (%v)",
|
2024-11-22 18:35:17 -03:00
|
|
|
c.Name,
|
|
|
|
|
l,
|
|
|
|
|
c.Value,
|
|
|
|
|
o.MaxLength,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-21 21:35:18 -03:00
|
|
|
return validateOption(o)
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
type ChatCommandUserOption struct {
|
2024-11-21 21:35:34 -03:00
|
|
|
Name string
|
2024-11-22 10:38:22 -03:00
|
|
|
Value string
|
2024-11-21 21:35:34 -03:00
|
|
|
NameLocalizations map[discordgo.Locale]string
|
|
|
|
|
Description string
|
|
|
|
|
DescriptionLocalizations map[discordgo.Locale]string
|
|
|
|
|
Required bool
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandUserOption) ApplicationCommandOption() *discordgo.ApplicationCommandOption {
|
2024-11-21 21:35:34 -03:00
|
|
|
return &discordgo.ApplicationCommandOption{
|
2024-11-22 10:45:08 -03:00
|
|
|
Type: discordgo.ApplicationCommandOptionUser,
|
2024-11-21 21:35:34 -03:00
|
|
|
Name: o.Name,
|
|
|
|
|
NameLocalizations: o.NameLocalizations,
|
|
|
|
|
Description: o.Description,
|
|
|
|
|
DescriptionLocalizations: o.DescriptionLocalizations,
|
|
|
|
|
Required: o.Required,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-22 10:45:08 -03:00
|
|
|
func (o *ChatCommandUserOption) Validate() (bool, error) {
|
2024-11-21 21:35:34 -03:00
|
|
|
return validateOption(o)
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-21 21:32:36 -03:00
|
|
|
func validateOption(opt interface {
|
|
|
|
|
ApplicationCommandOption() *discordgo.ApplicationCommandOption
|
|
|
|
|
},
|
|
|
|
|
) (bool, error) {
|
|
|
|
|
o := opt.ApplicationCommandOption()
|
|
|
|
|
|
|
|
|
|
switch {
|
|
|
|
|
case o.Name == "":
|
2024-11-22 18:50:33 -03:00
|
|
|
return false, errors.New("required field \"Name\" is empty")
|
2024-11-21 21:32:36 -03:00
|
|
|
case o.Description == "":
|
2024-11-22 18:50:33 -03:00
|
|
|
return false, errors.New("required field \"Description\" is empty")
|
2024-11-22 09:31:57 -03:00
|
|
|
case len(o.Choices) > 0 && o.Autocomplete:
|
|
|
|
|
return false, errors.New(
|
2024-11-22 18:50:33 -03:00
|
|
|
"mutually exclusive fields \"Choices\" and \"Autocomplete\" are setted",
|
2024-11-22 09:31:57 -03:00
|
|
|
)
|
2024-11-21 21:32:36 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
|
}
|
2024-11-22 18:46:16 -03:00
|
|
|
|
|
|
|
|
type (
|
|
|
|
|
optionTypes interface{ string | int | float64 }
|
|
|
|
|
ChatCommandOptionChoice[T optionTypes] struct {
|
|
|
|
|
Name string
|
|
|
|
|
NameLocalizations map[discordgo.Locale]string
|
|
|
|
|
Value T
|
|
|
|
|
}
|
|
|
|
|
)
|