goMuffin/utils/interactions.go

119 lines
3.5 KiB
Go

package utils
import (
"github.com/bwmarrin/discordgo"
)
type ModalData struct {
CustomId string `json:"custom_id"`
Title string `json:"title"`
Components []discordgo.MessageComponent `json:"components"`
}
type InteractionEdit struct {
Content *string `json:"content,omitempty"`
Components *[]discordgo.MessageComponent `json:"components,omitempty"`
Embeds *[]*discordgo.MessageEmbed `json:"embeds,omitempty"`
Flags *discordgo.MessageFlags `json:"flags,omitempty"`
Attachments *[]*discordgo.MessageAttachment `json:"attachments,omitempty"`
AllowedMentions *discordgo.MessageAllowedMentions `json:"allowed_mentions,omitempty"`
}
// InteractionCreate custom data of discordgo.InteractionCreate
type InteractionCreate struct {
*discordgo.InteractionCreate
Session *discordgo.Session
// NOTE: It's only can ApplicationCommand
Options map[string]*discordgo.ApplicationCommandInteractionDataOption
Deferred bool
Replied bool
}
// Reply to this interaction.
func (i *InteractionCreate) Reply(data *discordgo.InteractionResponseData) error {
err := i.Session.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: data,
})
if err != nil {
return err
}
i.Replied = true
return nil
}
// GetInteractionOptions to this interaction.
// NOTE: It's only can ApplicationCommand
func GetInteractionOptions(i *discordgo.InteractionCreate) map[string]*discordgo.ApplicationCommandInteractionDataOption {
optsMap := map[string]*discordgo.ApplicationCommandInteractionDataOption{}
for _, opt := range i.ApplicationCommandData().Options {
optsMap[opt.Name] = opt
}
return optsMap
}
// DeferReply to this interaction.
func (i *InteractionCreate) DeferReply(data *discordgo.InteractionResponseData) error {
err := i.Session.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseDeferredChannelMessageWithSource,
Data: data,
})
if err != nil {
return err
}
i.Deferred = true
return err
}
// DeferUpdate to this interaction.
func (i *InteractionCreate) DeferUpdate() error {
err := i.Session.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseDeferredMessageUpdate,
})
if err != nil {
return err
}
i.Deferred = true
return err
}
// EditReply to this interaction.
func (i *InteractionCreate) EditReply(data *InteractionEdit) error {
endpoint := discordgo.EndpointWebhookMessage(i.AppID, i.Token, "@original")
_, err := i.Session.RequestWithBucketID("PATCH", endpoint, *data, discordgo.EndpointWebhookToken("", ""))
i.Replied = true
return err
}
// Update to this interaction.
func (i *InteractionCreate) Update(data *discordgo.InteractionResponseData) error {
err := i.Session.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseUpdateMessage,
Data: data,
})
if err != nil {
return err
}
i.Replied = true
return err
}
func (i *InteractionCreate) ShowModal(data *ModalData) error {
var reqData struct {
Type discordgo.InteractionResponseType `json:"type"`
Data ModalData `json:"data"`
}
reqData.Type = discordgo.InteractionResponseModal
reqData.Data = *data
endpoint := discordgo.EndpointInteractionResponse(i.ID, i.Token)
_, err := i.Session.RequestWithBucketID("POST", endpoint, reqData, endpoint)
return err
}