aboutsummaryrefslogtreecommitdiff
path: root/dynamicid/handling.go
blob: 8369e2702400c0730297c3c00d663751671a1ba8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package dynamicid

import (
	"strings"

	"github.com/anhgelus/gokord"
	"github.com/anhgelus/gokord/cmd"
	"github.com/nyttikord/gokord/bot"
	"github.com/nyttikord/gokord/discord/types"
	"github.com/nyttikord/gokord/event"
	"github.com/nyttikord/gokord/interaction"
)

func HandleDynamicMessageComponent[DynamicData any](
	b *gokord.Bot,
	handler func(
		bot.Session,
		*event.InteractionCreate,
		*interaction.MessageComponentData,
		*DynamicData, *cmd.ResponseBuilder,
	),
	base string,
) {
	b.AddHandler(func(s bot.Session, i *event.InteractionCreate) {
		if i.Type != types.InteractionMessageComponent {
			return
		}
		data := i.MessageComponentData()
		if !strings.HasPrefix(data.CustomID, base+";") {
			return
		}
		dynamicID := data.CustomID[len(base)+1:]
		dynamicData := new(DynamicData)
		err := UnmarshallCSV(dynamicID, dynamicData)
		if err != nil {
			s.Logger().Error("Unable to parse CustomID", "error", err, "CustomID", data.CustomID, "base", base)
			return
		}
		handler(s, i, data, dynamicData, cmd.NewResponseBuilder(s, i))
	})
}

func HandleDynamicModalComponent[DynamicData any](
	b *gokord.Bot,
	handler func(
		bot.Session,
		*event.InteractionCreate,
		*interaction.ModalSubmitData,
		*DynamicData,
		*cmd.ResponseBuilder,
	),
	base string,
) {
	b.AddHandler(func(s bot.Session, i *event.InteractionCreate) {
		if i.Type != types.InteractionModalSubmit {
			return
		}
		data := i.ModalSubmitData()
		if strings.HasPrefix(data.CustomID, base+";") {
			dynamicID := data.CustomID[len(base)+1:]
			dynamicData := new(DynamicData)
			err := UnmarshallCSV(dynamicID, dynamicData)
			if err != nil {
				s.Logger().Error("Unable to parse CustomID", "error", err, "CustomID", data.CustomID, "base", base)
				return
			}
			handler(s, i, data, dynamicData, cmd.NewResponseBuilder(s, i))
		}
	})
}

func FormatCustomID(base string, dynamicData any) string {
	return base + ";" + MarshallCSV(dynamicData)
}