-
Notifications
You must be signed in to change notification settings - Fork 942
/
Copy pathbuiltinevents.go
140 lines (110 loc) · 4.07 KB
/
builtinevents.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
package scheduledevents2
import (
"context"
"time"
"github.com/jonas747/yagpdb/bot"
"github.com/jonas747/yagpdb/common"
"github.com/jonas747/yagpdb/common/scheduledevents2/models"
"github.com/volatiletech/sqlboiler/queries/qm"
)
type DeleteMessagesEvent struct {
GuildID int64
ChannelID int64
Messages []int64
}
func registerBuiltinEvents() {
RegisterHandler("delete_messages", DeleteMessagesEvent{}, handleDeleteMessagesEvent)
RegisterHandler("std_remove_member_role", RmoveRoleData{}, handleRemoveMemberRole)
RegisterHandler("std_add_member_role", AddRoleData{}, handleAddMemberRole)
}
func ScheduleDeleteMessages(guildID, channelID int64, when time.Time, messages ...int64) error {
msgs := messages
if len(messages) > 100 {
msgs = messages[:100]
}
err := ScheduleEvent("delete_messages", guildID, when, &DeleteMessagesEvent{
GuildID: guildID,
ChannelID: channelID,
Messages: msgs,
})
if err != nil {
return err
}
if len(messages) > 100 {
return ScheduleDeleteMessages(guildID, channelID, when, messages[100:]...)
}
return nil
}
func handleDeleteMessagesEvent(evt *models.ScheduledEvent, data interface{}) (retry bool, err error) {
dataCast := data.(*DeleteMessagesEvent)
bot.MessageDeleteQueue.DeleteMessages(dataCast.GuildID, dataCast.ChannelID, dataCast.Messages...)
return false, nil
}
type RmoveRoleData struct {
GuildID int64 `json:"guild_id"`
UserID int64 `json:"user_id"`
RoleID int64 `json:"role_id"`
}
func ScheduleRemoveRole(ctx context.Context, guildID, userID, roleID int64, when time.Time) error {
// remove existing role removal events for this role, this may not be the desired outcome in all cases, but for now it is like this
_, err := models.ScheduledEvents(qm.Where("event_name='std_remove_member_role' AND guild_id = ? AND (data->>'user_id')::bigint = ? AND (data->>'role_id')::bigint = ? AND processed = false", guildID, userID, roleID)).DeleteAll(ctx, common.PQ)
if err != nil {
return err
}
// add the scheduled event for it
err = ScheduleEvent("std_remove_member_role", guildID, when, &RmoveRoleData{
GuildID: guildID,
UserID: userID,
RoleID: roleID,
})
if err != nil {
return err
}
return nil
}
func CancelRemoveRole(ctx context.Context, guildID, userID, roleID int64) error {
_, err := models.ScheduledEvents(qm.Where("event_name='std_remove_member_role' AND guild_id = ? AND (data->>'user_id')::bigint = ? AND (data->>'role_id')::bigint = ? AND processed = false",
guildID, userID, roleID)).DeleteAll(ctx, common.PQ)
return err
}
func handleRemoveMemberRole(evt *models.ScheduledEvent, data interface{}) (retry bool, err error) {
dataCast := data.(*RmoveRoleData)
err = common.BotSession.GuildMemberRoleRemove(dataCast.GuildID, dataCast.UserID, dataCast.RoleID)
if err != nil {
return CheckDiscordErrRetry(err), err
}
return CheckDiscordErrRetry(err), err
}
type AddRoleData struct {
UserID int64 `json:"user_id"`
RoleID int64 `json:"role_id"`
}
func ScheduleAddRole(ctx context.Context, guildID, userID, roleID int64, when time.Time) error {
// remove existing role addition events for this role, this may not be the desired outcome in all cases, but for now it is like this
err := CancelAddRole(ctx, guildID, userID, roleID)
if err != nil {
return err
}
// add the scheduled event for it
err = ScheduleEvent("std_add_member_role", guildID, when, &AddRoleData{
UserID: userID,
RoleID: roleID,
})
if err != nil {
return err
}
return nil
}
func CancelAddRole(ctx context.Context, guildID, userID, roleID int64) error {
_, err := models.ScheduledEvents(qm.Where("event_name='std_add_member_role' AND guild_id = ? AND (data->>'user_id')::bigint = ? AND (data->>'role_id')::bigint = ? AND processed = false",
guildID, userID, roleID)).DeleteAll(ctx, common.PQ)
return err
}
func handleAddMemberRole(evt *models.ScheduledEvent, data interface{}) (retry bool, err error) {
dataCast := data.(*AddRoleData)
err = common.BotSession.GuildMemberRoleAdd(evt.GuildID, dataCast.UserID, dataCast.RoleID)
if err != nil {
return CheckDiscordErrRetry(err), err
}
return CheckDiscordErrRetry(err), err
}