feat: Add interaction's reply method

This commit is contained in:
Siwoo Jeon 2025-04-05 14:04:54 +09:00
parent ed81d98623
commit d3ba8fbbf1
Signed by: migan
GPG key ID: 036E9A8C5E8E48DA
10 changed files with 133 additions and 117 deletions

View file

@ -66,8 +66,6 @@ func getLength(data dataType, coll *mongo.Collection, filter bson.D) {
}
func dataLengthRun(s *discordgo.Session, m any) {
var i *discordgo.Interaction
var referance *discordgo.MessageReference
var username, userId, channelId string
var textLength,
muffinLength,
@ -80,19 +78,11 @@ func dataLengthRun(s *discordgo.Session, m any) {
username = m.Author.Username
userId = m.Author.ID
channelId = m.ChannelID
referance = m.Reference()
case *discordgo.InteractionCreate:
case *utils.InteractionCreate:
m.DeferReply(true)
username = m.Member.User.Username
userId = m.Member.User.ID
channelId = m.ChannelID
i = m.Interaction
s.InteractionRespond(i,
&discordgo.InteractionResponse{
Type: discordgo.InteractionResponseDeferredChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Flags: discordgo.MessageFlagsEphemeral,
},
})
}
go getLength(text, databases.Texts, bson.D{{}})
@ -161,11 +151,11 @@ func dataLengthRun(s *discordgo.Session, m any) {
},
}
switch m.(type) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(channelId, embed, referance)
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(i, &discordgo.WebhookEdit{
s.ChannelMessageSendEmbedReply(channelId, embed, m.Reference())
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
})
}

View file

@ -67,19 +67,10 @@ func deleteLearnedDataRun(c *Command, s *discordgo.Session, m any, args *[]strin
Color: utils.EmbedFail,
}, m.Reference())
}
case *discordgo.InteractionCreate:
s.InteractionRespond(m.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseDeferredChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Flags: discordgo.MessageFlagsEphemeral,
},
})
case *utils.InteractionCreate:
m.DeferReply(true)
optsMap := map[string]*discordgo.ApplicationCommandInteractionDataOption{}
for _, opt := range m.ApplicationCommandData().Options {
optsMap[opt.Name] = opt
}
if opt, ok := optsMap["단어"]; ok {
if opt, ok := m.Options["단어"]; ok {
command = opt.StringValue()
}
userId = m.Member.User.ID
@ -96,8 +87,8 @@ func deleteLearnedDataRun(c *Command, s *discordgo.Session, m any, args *[]strin
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(m.Interaction, &discordgo.WebhookEdit{
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
})
}
@ -108,8 +99,8 @@ func deleteLearnedDataRun(c *Command, s *discordgo.Session, m any, args *[]strin
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(m.Interaction, &discordgo.WebhookEdit{
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
})
}
@ -165,8 +156,8 @@ func deleteLearnedDataRun(c *Command, s *discordgo.Session, m any, args *[]strin
Components: components,
Reference: m.Reference(),
})
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(m.Interaction, &discordgo.WebhookEdit{
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
Components: &components,
})

View file

@ -3,6 +3,7 @@ package commands
import (
"sync"
"git.wh64.net/muffin/goMuffin/utils"
"github.com/bwmarrin/discordgo"
)
@ -42,13 +43,13 @@ type MsgContext struct {
type ChatInputContext struct {
Session *discordgo.Session
Inter *discordgo.InteractionCreate
Inter *utils.InteractionCreate
Command *Command
}
type ComponentContext struct {
Session *discordgo.Session
Inter *discordgo.InteractionCreate
Inter *utils.InteractionCreate
Component *Component
}
@ -104,16 +105,26 @@ func (d *DiscommandStruct) ChatInputRun(name string, s *discordgo.Session, i *di
if command == nil {
return
}
command.ChatInputRun(&ChatInputContext{s, i, command})
command.ChatInputRun(&ChatInputContext{s, &utils.InteractionCreate{
InteractionCreate: i,
Session: s,
Options: utils.GetInteractionOptions(i),
}, command})
}
func (d *DiscommandStruct) ComponentRun(s *discordgo.Session, i *discordgo.InteractionCreate) {
for _, c := range d.Components {
if (!c.Parse(&ComponentContext{s, i, c})) {
if (!c.Parse(&ComponentContext{s, &utils.InteractionCreate{
InteractionCreate: i,
Session: s,
}, c})) {
continue
}
c.Run(&ComponentContext{s, i, c})
c.Run(&ComponentContext{s, &utils.InteractionCreate{
InteractionCreate: i,
Session: s,
}, c})
break
}
}

View file

@ -72,13 +72,11 @@ func helpRun(c *Command, s *discordgo.Session, m any, args *[]string) {
switch m := m.(type) {
case *discordgo.MessageCreate:
commandName = Discommand.Aliases[strings.Join(*args, " ")]
case *discordgo.InteractionCreate:
optsMap := map[string]*discordgo.ApplicationCommandInteractionDataOption{}
for _, opt := range m.ApplicationCommandData().Options {
optsMap[opt.Name] = opt
}
if opt, ok := optsMap["명령어"]; ok {
case *utils.InteractionCreate:
if opt, ok := m.Options["도움말"]; ok {
commandName = opt.StringValue()
} else {
commandName = ""
}
}
@ -94,12 +92,9 @@ func helpRun(c *Command, s *discordgo.Session, m any, args *[]string) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionRespond(m.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Embeds: []*discordgo.MessageEmbed{embed},
},
case *utils.InteractionCreate:
m.Reply(&discordgo.InteractionResponseData{
Embeds: []*discordgo.MessageEmbed{embed},
})
}
return
@ -148,12 +143,9 @@ func helpRun(c *Command, s *discordgo.Session, m any, args *[]string) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionRespond(m.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Embeds: []*discordgo.MessageEmbed{embed},
},
case *utils.InteractionCreate:
m.Reply(&discordgo.InteractionResponseData{
Embeds: []*discordgo.MessageEmbed{embed},
})
}
}

View file

@ -63,12 +63,9 @@ func informationRun(s *discordgo.Session, m any) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionRespond(m.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Embeds: []*discordgo.MessageEmbed{embed},
},
case *utils.InteractionCreate:
m.Reply(&discordgo.InteractionResponseData{
Embeds: []*discordgo.MessageEmbed{embed},
})
}
}

View file

@ -107,26 +107,16 @@ func learnRun(c *Command, s *discordgo.Session, m any, args *[]string) {
command = strings.ReplaceAll((*args)[0], "_", " ")
result = strings.ReplaceAll((*args)[1], "_", " ")
case *discordgo.InteractionCreate:
s.InteractionRespond(m.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseDeferredChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Flags: discordgo.MessageFlagsEphemeral,
},
})
case *utils.InteractionCreate:
m.DeferReply(true)
userId = m.Member.User.ID
optsMap := map[string]*discordgo.ApplicationCommandInteractionDataOption{}
for _, opt := range m.ApplicationCommandData().Options {
optsMap[opt.Name] = opt
}
if opt, ok := optsMap["단어"]; ok {
if opt, ok := m.Options["단어"]; ok {
command = opt.StringValue()
}
if opt, ok := optsMap["대답"]; ok {
if opt, ok := m.Options["대답"]; ok {
result = opt.StringValue()
}
}
@ -156,8 +146,8 @@ func learnRun(c *Command, s *discordgo.Session, m any, args *[]string) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(m.Interaction, &discordgo.WebhookEdit{
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
})
}
@ -176,8 +166,8 @@ func learnRun(c *Command, s *discordgo.Session, m any, args *[]string) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(m.Interaction, &discordgo.WebhookEdit{
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
})
}
@ -201,8 +191,8 @@ func learnRun(c *Command, s *discordgo.Session, m any, args *[]string) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(m.Interaction, &discordgo.WebhookEdit{
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
})
}
@ -218,8 +208,8 @@ func learnRun(c *Command, s *discordgo.Session, m any, args *[]string) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(m.Interaction, &discordgo.WebhookEdit{
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
})
}

View file

@ -47,13 +47,8 @@ func learnedDataListRun(s *discordgo.Session, m any) {
userId = m.Author.ID
globalName = m.Author.GlobalName
avatarUrl = m.Author.AvatarURL("512")
case *discordgo.InteractionCreate:
s.InteractionRespond(m.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseDeferredChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Flags: discordgo.MessageFlagsEphemeral,
},
})
case *utils.InteractionCreate:
m.DeferReply(true)
userId = m.Member.User.ID
globalName = m.Member.User.GlobalName
@ -72,8 +67,8 @@ func learnedDataListRun(s *discordgo.Session, m any) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(m.Interaction, &discordgo.WebhookEdit{
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
})
}
@ -90,8 +85,8 @@ func learnedDataListRun(s *discordgo.Session, m any) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(m.Interaction, &discordgo.WebhookEdit{
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
})
}
@ -114,8 +109,8 @@ func learnedDataListRun(s *discordgo.Session, m any) {
switch m := m.(type) {
case *discordgo.MessageCreate:
s.ChannelMessageSendEmbedReply(m.ChannelID, embed, m.Reference())
case *discordgo.InteractionCreate:
s.InteractionResponseEdit(m.Interaction, &discordgo.WebhookEdit{
case *utils.InteractionCreate:
m.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{embed},
})
}

View file

@ -16,7 +16,6 @@ var DeleteLearnedDataComponent *commands.Component = &commands.Component{
Parse: func(ctx *commands.ComponentContext) bool {
var userId string
i := ctx.Inter
s := ctx.Session
customId := i.MessageComponentData().CustomID
if i.MessageComponentData().ComponentType == discordgo.ButtonComponent {
@ -34,38 +33,33 @@ var DeleteLearnedDataComponent *commands.Component = &commands.Component{
}
if i.Member.User.ID != userId {
s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Flags: discordgo.MessageFlagsEphemeral,
Embeds: []*discordgo.MessageEmbed{
{
Title: "❌ 오류",
Description: "당신은 해당 권한이 없ㅇ어요.",
Color: int(utils.EmbedFail),
},
i.Reply(&discordgo.InteractionResponseData{
Flags: discordgo.MessageFlagsEphemeral,
Embeds: []*discordgo.MessageEmbed{
{
Title: "❌ 오류",
Description: "당신은 해당 권한이 없ㅇ어요.",
Color: int(utils.EmbedFail),
},
Components: []discordgo.MessageComponent{},
},
})
Components: []discordgo.MessageComponent{},
},
)
return false
}
return true
},
Run: func(ctx *commands.ComponentContext) {
i := ctx.Inter
s := ctx.Session
s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseDeferredMessageUpdate,
})
i.DeferUpdate()
id, _ := bson.ObjectIDFromHex(strings.ReplaceAll(utils.ItemIdRegexp.ReplaceAllString(i.MessageComponentData().Values[0][len(utils.DeleteLearnedData):], ""), "&", ""))
itemId := strings.ReplaceAll(utils.ItemIdRegexp.FindAllString(i.MessageComponentData().Values[0], 1)[0], "No.", "")
databases.Learns.DeleteOne(context.TODO(), bson.D{{Key: "_id", Value: id}})
s.InteractionResponseEdit(i.Interaction, &discordgo.WebhookEdit{
i.EditReply(&discordgo.WebhookEdit{
Embeds: &[]*discordgo.MessageEmbed{
{
Title: "✅ 삭제 완료",

View file

@ -7,7 +7,7 @@ import (
"git.wh64.net/muffin/goMuffin/utils"
)
const MUFFIN_VERSION = "5.0.0-gopher_dev.250404a"
const MUFFIN_VERSION = "5.0.0-gopher_preview.250405a"
var updatedString string = utils.Decimals.FindAllStringSubmatch(MUFFIN_VERSION, -1)[3][0]

56
utils/interactions.go Normal file
View file

@ -0,0 +1,56 @@
package utils
import "github.com/bwmarrin/discordgo"
// 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
}
// Reply to this interaction.
func (i *InteractionCreate) Reply(data *discordgo.InteractionResponseData) {
i.Session.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: data,
})
}
// 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(ephemeral bool) {
var flags discordgo.MessageFlags
if ephemeral {
flags = discordgo.MessageFlagsEphemeral
}
i.Session.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseDeferredChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Flags: flags,
},
})
}
// DeferUpdate to this interaction.
func (i *InteractionCreate) DeferUpdate() {
i.Session.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseDeferredMessageUpdate,
})
}
// EditReply to this interaction.
func (i *InteractionCreate) EditReply(data *discordgo.WebhookEdit) {
i.Session.InteractionResponseEdit(i.Interaction, data)
}