-
Notifications
You must be signed in to change notification settings - Fork 921
/
pageinatedmessage.go
88 lines (71 loc) · 2.07 KB
/
pageinatedmessage.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
package paginatedmessages
import (
"errors"
"sync"
"time"
"github.com/botlabs-gg/yagpdb/v2/bot"
"github.com/botlabs-gg/yagpdb/v2/bot/eventsystem"
"github.com/botlabs-gg/yagpdb/v2/common"
"github.com/botlabs-gg/yagpdb/v2/common/pubsub"
"github.com/botlabs-gg/yagpdb/v2/lib/discordgo"
)
var (
logger = common.GetPluginLogger(&Plugin{})
activePaginatedMessages []*PaginatedMessage
menusLock sync.Mutex
)
var ErrNoResults = errors.New("no results")
type Plugin struct{}
func (p *Plugin) PluginInfo() *common.PluginInfo {
return &common.PluginInfo{
Name: "Paginated Messages",
SysName: "paginatedmessages",
Category: common.PluginCategoryMisc,
}
}
func RegisterPlugin() {
common.RegisterPlugin(&Plugin{})
}
var _ bot.BotInitHandler = (*Plugin)(nil)
func (p *Plugin) BotInit() {
eventsystem.AddHandlerAsyncLastLegacy(p, handleInteractionCreate, eventsystem.EventInteractionCreate)
// this just handles interaction events from DMS
pubsub.AddHandler("dm_interaction", func(evt *pubsub.Event) {
dataCast := evt.Data.(*discordgo.InteractionCreate)
if dataCast.Type != discordgo.InteractionMessageComponent {
return
}
switch dataCast.MessageComponentData().CustomID {
case paginationNext:
handlePageChange(dataCast, 1)
case paginationPrev:
handlePageChange(dataCast, -1)
}
}, discordgo.InteractionCreate{})
}
type PaginatedMessage struct {
// immutable fields, safe to access without a lock, don't write to these, i dont see why you would need to either...
MessageID int64
ChannelID int64
GuildID int64
// mutable fields
CurrentPage int
MaxPage int
LastResponse *discordgo.MessageEmbed
Navigate func(p *PaginatedMessage, newPage int) (*discordgo.MessageEmbed, error)
Broken bool
stopped bool
stopCh chan bool
lastUpdateTime time.Time
mu sync.Mutex
}
type PagerFunc func(p *PaginatedMessage, page int) (*discordgo.MessageEmbed, error)
func (p *PaginatedMessage) Stop() {
p.mu.Lock()
defer p.mu.Unlock()
if p.stopped {
return
}
p.stopped = true
close(p.stopCh)
}