/
cache_sticker.go
137 lines (118 loc) · 3.6 KB
/
cache_sticker.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
package core
import "github.com/DisgoOrg/snowflake"
type (
StickerFindFunc func(sticker *Sticker) bool
StickerCache interface {
Get(guildID snowflake.Snowflake, stickerID snowflake.Snowflake) *Sticker
GetCopy(guildID snowflake.Snowflake, stickerID snowflake.Snowflake) *Sticker
Set(sticker *Sticker) *Sticker
Remove(guildID snowflake.Snowflake, stickerID snowflake.Snowflake)
Cache() map[snowflake.Snowflake]map[snowflake.Snowflake]*Sticker
All() map[snowflake.Snowflake][]*Sticker
GuildCache(guildID snowflake.Snowflake) map[snowflake.Snowflake]*Sticker
GuildAll(guildID snowflake.Snowflake) []*Sticker
FindFirst(stickerFindFunc StickerFindFunc) *Sticker
FindAll(stickerFindFunc StickerFindFunc) []*Sticker
}
stickerCacheImpl struct {
cacheFlags CacheFlags
stickers map[snowflake.Snowflake]map[snowflake.Snowflake]*Sticker
}
)
func NewStickerCache(cacheFlags CacheFlags) StickerCache {
return &stickerCacheImpl{
cacheFlags: cacheFlags,
stickers: map[snowflake.Snowflake]map[snowflake.Snowflake]*Sticker{},
}
}
func (c *stickerCacheImpl) Get(guildID snowflake.Snowflake, stickerID snowflake.Snowflake) *Sticker {
if _, ok := c.stickers[guildID]; !ok {
return nil
}
return c.stickers[guildID][stickerID]
}
func (c *stickerCacheImpl) GetCopy(guildID snowflake.Snowflake, stickerID snowflake.Snowflake) *Sticker {
if sticker := c.Get(guildID, stickerID); sticker != nil {
st := *sticker
return &st
}
return nil
}
func (c *stickerCacheImpl) Set(sticker *Sticker) *Sticker {
if sticker.GuildID == nil {
return sticker
}
if c.cacheFlags.Missing(CacheFlagStickers) {
return sticker
}
if _, ok := c.stickers[*sticker.GuildID]; !ok {
c.stickers[*sticker.GuildID] = map[snowflake.Snowflake]*Sticker{}
}
st, ok := c.stickers[*sticker.GuildID][sticker.ID]
if ok {
*st = *sticker
return st
}
c.stickers[*sticker.GuildID][sticker.ID] = sticker
return sticker
}
func (c *stickerCacheImpl) Remove(guildID snowflake.Snowflake, stickerID snowflake.Snowflake) {
if _, ok := c.stickers[guildID]; !ok {
return
}
delete(c.stickers[guildID], stickerID)
}
func (c *stickerCacheImpl) Cache() map[snowflake.Snowflake]map[snowflake.Snowflake]*Sticker {
return c.stickers
}
func (c *stickerCacheImpl) All() map[snowflake.Snowflake][]*Sticker {
stickers := make(map[snowflake.Snowflake][]*Sticker, len(c.stickers))
for guildID, guildStickers := range c.stickers {
stickers[guildID] = make([]*Sticker, len(guildStickers))
i := 0
for _, guildSticker := range guildStickers {
stickers[guildID] = append(stickers[guildID], guildSticker)
}
i++
}
return stickers
}
func (c *stickerCacheImpl) GuildCache(guildID snowflake.Snowflake) map[snowflake.Snowflake]*Sticker {
if _, ok := c.stickers[guildID]; !ok {
return nil
}
return c.stickers[guildID]
}
func (c *stickerCacheImpl) GuildAll(guildID snowflake.Snowflake) []*Sticker {
if _, ok := c.stickers[guildID]; !ok {
return nil
}
stickers := make([]*Sticker, len(c.stickers[guildID]))
i := 0
for _, sticker := range c.stickers[guildID] {
stickers = append(stickers, sticker)
i++
}
return stickers
}
func (c *stickerCacheImpl) FindFirst(stickerFindFunc StickerFindFunc) *Sticker {
for _, guildStickers := range c.stickers {
for _, sticker := range guildStickers {
if stickerFindFunc(sticker) {
return sticker
}
}
}
return nil
}
func (c *stickerCacheImpl) FindAll(stickerFindFunc StickerFindFunc) []*Sticker {
var stickers []*Sticker
for _, guildStickers := range c.stickers {
for _, sticker := range guildStickers {
if stickerFindFunc(sticker) {
stickers = append(stickers, sticker)
}
}
}
return stickers
}