/
interaction.go
149 lines (124 loc) · 5.11 KB
/
interaction.go
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package core
import (
"time"
"github.com/DisgoOrg/disgo/discord"
"github.com/DisgoOrg/disgo/rest"
"github.com/DisgoOrg/snowflake"
)
type InteractionFilter func(interaction Interaction) bool
// Interaction represents a generic Interaction received from discord
type Interaction interface {
Type() discord.InteractionType
interaction()
Respond(callbackType discord.InteractionCallbackType, callbackData discord.InteractionCallbackData, opts ...rest.RequestOpt) error
}
type BaseInteraction struct {
ID snowflake.Snowflake
ApplicationID snowflake.Snowflake
Token string
Version int
GuildID *snowflake.Snowflake
ChannelID snowflake.Snowflake
Locale discord.Locale
GuildLocale *discord.Locale
Member *Member
User *User
ResponseChannel chan<- discord.InteractionResponse
Acknowledged bool
Bot *Bot
}
func (i *BaseInteraction) Respond(callbackType discord.InteractionCallbackType, callbackData discord.InteractionCallbackData, opts ...rest.RequestOpt) error {
if i.Acknowledged {
return discord.ErrInteractionAlreadyReplied
}
i.Acknowledged = true
if time.Now().After(i.ID.Time().Add(3 * time.Second)) {
return discord.ErrInteractionExpired
}
response := discord.InteractionResponse{
Type: callbackType,
Data: callbackData,
}
if i.ResponseChannel != nil {
i.ResponseChannel <- response
return nil
}
return i.Bot.RestServices.InteractionService().CreateInteractionResponse(i.ID, i.Token, response, opts...)
}
// Guild returns the Guild from the Caches
func (i *BaseInteraction) Guild() *Guild {
if i.GuildID == nil {
return nil
}
return i.Bot.Caches.Guilds().Get(*i.GuildID)
}
// Channel returns the Channel from the Caches
func (i *BaseInteraction) Channel() MessageChannel {
if ch := i.Bot.Caches.Channels().Get(i.ChannelID); ch != nil {
return ch.(MessageChannel)
}
return nil
}
type UpdateInteraction struct {
*BaseInteraction
}
func (i UpdateInteraction) UpdateMessage(messageUpdate discord.MessageUpdate, opts ...rest.RequestOpt) error {
return i.Respond(discord.InteractionCallbackTypeUpdateMessage, messageUpdate, opts...)
}
func (i UpdateInteraction) DeferUpdateMessage(opts ...rest.RequestOpt) error {
return i.Respond(discord.InteractionCallbackTypeDeferredUpdateMessage, nil, opts...)
}
type CreateInteraction struct {
*BaseInteraction
}
func (i CreateInteraction) CreateMessage(messageCreate discord.MessageCreate, opts ...rest.RequestOpt) error {
return i.Respond(discord.InteractionCallbackTypeChannelMessageWithSource, messageCreate, opts...)
}
func (i CreateInteraction) DeferCreateMessage(ephemeral bool, opts ...rest.RequestOpt) error {
var data discord.InteractionCallbackData
if ephemeral {
data = discord.MessageCreate{Flags: discord.MessageFlagEphemeral}
}
return i.Respond(discord.InteractionCallbackTypeDeferredChannelMessageWithSource, data, opts...)
}
func (i CreateInteraction) GetOriginalMessage(opts ...rest.RequestOpt) (*Message, error) {
message, err := i.Bot.RestServices.InteractionService().GetInteractionResponse(i.ApplicationID, i.Token, opts...)
if err != nil {
return nil, err
}
return i.Bot.EntityBuilder.CreateMessage(*message, CacheStrategyNoWs), nil
}
func (i CreateInteraction) UpdateOriginalMessage(messageUpdate discord.MessageUpdate, opts ...rest.RequestOpt) (*Message, error) {
message, err := i.Bot.RestServices.InteractionService().UpdateInteractionResponse(i.ApplicationID, i.Token, messageUpdate, opts...)
if err != nil {
return nil, err
}
return i.Bot.EntityBuilder.CreateMessage(*message, CacheStrategyNoWs), nil
}
func (i CreateInteraction) DeleteOriginalMessage(opts ...rest.RequestOpt) error {
return i.Bot.RestServices.InteractionService().DeleteInteractionResponse(i.ApplicationID, i.Token, opts...)
}
func (i CreateInteraction) GetFollowupMessage(messageID snowflake.Snowflake, opts ...rest.RequestOpt) (*Message, error) {
message, err := i.Bot.RestServices.InteractionService().GetFollowupMessage(i.ApplicationID, i.Token, messageID, opts...)
if err != nil {
return nil, err
}
return i.Bot.EntityBuilder.CreateMessage(*message, CacheStrategyNoWs), nil
}
func (i CreateInteraction) CreateFollowupMessage(messageCreate discord.MessageCreate, opts ...rest.RequestOpt) (*Message, error) {
message, err := i.Bot.RestServices.InteractionService().CreateFollowupMessage(i.ApplicationID, i.Token, messageCreate, opts...)
if err != nil {
return nil, err
}
return i.Bot.EntityBuilder.CreateMessage(*message, CacheStrategyNoWs), nil
}
func (i CreateInteraction) UpdateFollowupMessage(messageID snowflake.Snowflake, messageUpdate discord.MessageUpdate, opts ...rest.RequestOpt) (*Message, error) {
message, err := i.Bot.RestServices.InteractionService().UpdateFollowupMessage(i.ApplicationID, i.Token, messageID, messageUpdate, opts...)
if err != nil {
return nil, err
}
return i.Bot.EntityBuilder.CreateMessage(*message, CacheStrategyNoWs), nil
}
func (i CreateInteraction) DeleteFollowupMessage(messageID snowflake.Snowflake, opts ...rest.RequestOpt) error {
return i.Bot.RestServices.InteractionService().DeleteFollowupMessage(i.ApplicationID, i.Token, messageID, opts...)
}