Skip to content

Commit

Permalink
add caches
Browse files Browse the repository at this point in the history
  • Loading branch information
mlnrDev committed May 16, 2024
1 parent 540af44 commit 48ee79e
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 27 deletions.
38 changes: 26 additions & 12 deletions cache/cache_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,19 @@ import (
// DefaultConfig returns a Config with sensible defaults.
func DefaultConfig() *Config {
return &Config{
GuildCachePolicy: PolicyAll[discord.Guild],
ChannelCachePolicy: PolicyAll[discord.GuildChannel],
StageInstanceCachePolicy: PolicyAll[discord.StageInstance],
GuildScheduledEventCachePolicy: PolicyAll[discord.GuildScheduledEvent],
RoleCachePolicy: PolicyAll[discord.Role],
MemberCachePolicy: PolicyAll[discord.Member],
ThreadMemberCachePolicy: PolicyAll[discord.ThreadMember],
PresenceCachePolicy: PolicyAll[discord.Presence],
VoiceStateCachePolicy: PolicyAll[discord.VoiceState],
MessageCachePolicy: PolicyAll[discord.Message],
EmojiCachePolicy: PolicyAll[discord.Emoji],
StickerCachePolicy: PolicyAll[discord.Sticker],
GuildCachePolicy: PolicyAll[discord.Guild],
ChannelCachePolicy: PolicyAll[discord.GuildChannel],
StageInstanceCachePolicy: PolicyAll[discord.StageInstance],
GuildScheduledEventCachePolicy: PolicyAll[discord.GuildScheduledEvent],
GuildSoundboardSoundCachePolicy: PolicyAll[discord.SoundboardSound],
RoleCachePolicy: PolicyAll[discord.Role],
MemberCachePolicy: PolicyAll[discord.Member],
ThreadMemberCachePolicy: PolicyAll[discord.ThreadMember],
PresenceCachePolicy: PolicyAll[discord.Presence],
VoiceStateCachePolicy: PolicyAll[discord.VoiceState],
MessageCachePolicy: PolicyAll[discord.Message],
EmojiCachePolicy: PolicyAll[discord.Emoji],
StickerCachePolicy: PolicyAll[discord.Sticker],
}
}

Expand All @@ -42,6 +43,9 @@ type Config struct {
GuildScheduledEventCache GuildScheduledEventCache
GuildScheduledEventCachePolicy Policy[discord.GuildScheduledEvent]

GuildSoundboardSoundCache GuildSoundboardSoundCache
GuildSoundboardSoundCachePolicy Policy[discord.SoundboardSound]

RoleCache RoleCache
RoleCachePolicy Policy[discord.Role]

Expand Down Expand Up @@ -90,6 +94,9 @@ func (c *Config) Apply(opts []ConfigOpt) {
if c.GuildScheduledEventCache == nil {
c.GuildScheduledEventCache = NewGuildScheduledEventCache(NewGroupedCache[discord.GuildScheduledEvent](c.CacheFlags, FlagGuildScheduledEvents, c.GuildScheduledEventCachePolicy))
}
if c.GuildSoundboardSoundCache == nil {
c.GuildSoundboardSoundCache = NewGuildSoundboardSoundCache(NewGroupedCache[discord.SoundboardSound](c.CacheFlags, FlagGuildSoundboardSounds, c.GuildSoundboardSoundCachePolicy))
}
if c.RoleCache == nil {
c.RoleCache = NewRoleCache(NewGroupedCache[discord.Role](c.CacheFlags, FlagRoles, c.RoleCachePolicy))
}
Expand Down Expand Up @@ -179,6 +186,13 @@ func WithGuildScheduledEventCache(guildScheduledEventCache GuildScheduledEventCa
}
}

// WithGuildSoundboardSoundCache sets the GuildSoundboardSoundCache of the Config.
func WithGuildSoundboardSoundCache(guildSoundboardSoundCache GuildSoundboardSoundCache) ConfigOpt {
return func(config *Config) {
config.GuildSoundboardSoundCache = guildSoundboardSoundCache
}
}

// WithRoleCachePolicy sets the Policy[discord.Role] of the Config.
func WithRoleCachePolicy(policy Policy[discord.Role]) ConfigOpt {
return func(config *Config) {
Expand Down
4 changes: 3 additions & 1 deletion cache/cache_flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const (
FlagStickers
FlagVoiceStates
FlagStageInstances
FlagGuildSoundboardSounds

FlagsNone Flags = 0
FlagsAll = FlagGuilds |
Expand All @@ -32,7 +33,8 @@ const (
FlagEmojis |
FlagStickers |
FlagVoiceStates |
FlagStageInstances
FlagStageInstances |
FlagGuildSoundboardSounds
)

// Add allows you to add multiple bits together, producing a new bit
Expand Down
79 changes: 65 additions & 14 deletions cache/caches.go
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,54 @@ func (c *guildScheduledEventCacheImpl) RemoveGuildScheduledEventsByGuildID(guild
c.cache.GroupRemove(guildID)
}

type GuildSoundboardSoundCache interface {
GuildSoundboardSound(guildID snowflake.ID, soundID snowflake.ID) (discord.SoundboardSound, bool)
GuildSoundboardSoundsForEach(guildID snowflake.ID, fn func(sound discord.SoundboardSound))
GuildSoundboardSoundsAllLen() int
GuildSoundboardSoundsLen(guildID snowflake.ID) int
AddGuildSoundboardSound(sound discord.SoundboardSound)
RemoveGuildSoundboardSound(guildID snowflake.ID, sound snowflake.ID) (discord.SoundboardSound, bool)
RemoveGuildSoundboardSoundsByGuildID(guildID snowflake.ID)
}

func NewGuildSoundboardSoundCache(cache GroupedCache[discord.SoundboardSound]) GuildSoundboardSoundCache {
return &guildSoundboardSoundCacheImpl{
cache: cache,
}
}

type guildSoundboardSoundCacheImpl struct {
cache GroupedCache[discord.SoundboardSound]
}

func (c *guildSoundboardSoundCacheImpl) GuildSoundboardSound(guildID snowflake.ID, soundID snowflake.ID) (discord.SoundboardSound, bool) {
return c.cache.Get(guildID, soundID)
}

func (c *guildSoundboardSoundCacheImpl) GuildSoundboardSoundsForEach(guildID snowflake.ID, fn func(sound discord.SoundboardSound)) {
c.cache.GroupForEach(guildID, fn)
}

func (c *guildSoundboardSoundCacheImpl) GuildSoundboardSoundsAllLen() int {
return c.cache.Len()
}

func (c *guildSoundboardSoundCacheImpl) GuildSoundboardSoundsLen(guildID snowflake.ID) int {
return c.cache.GroupLen(guildID)
}

func (c *guildSoundboardSoundCacheImpl) AddGuildSoundboardSound(sound discord.SoundboardSound) {
c.cache.Put(*sound.GuildID, sound.SoundID, sound)
}

func (c *guildSoundboardSoundCacheImpl) RemoveGuildSoundboardSound(guildID snowflake.ID, soundID snowflake.ID) (discord.SoundboardSound, bool) {
return c.cache.Remove(guildID, soundID)
}

func (c *guildSoundboardSoundCacheImpl) RemoveGuildSoundboardSoundsByGuildID(guildID snowflake.ID) {
c.cache.GroupRemove(guildID)
}

type RoleCache interface {
Role(guildID snowflake.ID, roleID snowflake.ID) (discord.Role, bool)
RolesForEach(guildID snowflake.ID, fn func(role discord.Role))
Expand Down Expand Up @@ -678,6 +726,7 @@ type Caches interface {
ChannelCache
StageInstanceCache
GuildScheduledEventCache
GuildSoundboardSoundCache
RoleCache
MemberCache
ThreadMemberCache
Expand Down Expand Up @@ -759,20 +808,21 @@ func New(opts ...ConfigOpt) Caches {
config.Apply(opts)

return &cachesImpl{
config: *config,
SelfUserCache: config.SelfUserCache,
GuildCache: config.GuildCache,
ChannelCache: config.ChannelCache,
StageInstanceCache: config.StageInstanceCache,
GuildScheduledEventCache: config.GuildScheduledEventCache,
RoleCache: config.RoleCache,
MemberCache: config.MemberCache,
ThreadMemberCache: config.ThreadMemberCache,
PresenceCache: config.PresenceCache,
VoiceStateCache: config.VoiceStateCache,
MessageCache: config.MessageCache,
EmojiCache: config.EmojiCache,
StickerCache: config.StickerCache,
config: *config,
SelfUserCache: config.SelfUserCache,
GuildCache: config.GuildCache,
ChannelCache: config.ChannelCache,
StageInstanceCache: config.StageInstanceCache,
GuildScheduledEventCache: config.GuildScheduledEventCache,
GuildSoundboardSoundCache: config.GuildSoundboardSoundCache,
RoleCache: config.RoleCache,
MemberCache: config.MemberCache,
ThreadMemberCache: config.ThreadMemberCache,
PresenceCache: config.PresenceCache,
VoiceStateCache: config.VoiceStateCache,
MessageCache: config.MessageCache,
EmojiCache: config.EmojiCache,
StickerCache: config.StickerCache,
}
}

Expand All @@ -783,6 +833,7 @@ type cachesImpl struct {
ChannelCache
StageInstanceCache
GuildScheduledEventCache
GuildSoundboardSoundCache
RoleCache
MemberCache
ThreadMemberCache
Expand Down
1 change: 1 addition & 0 deletions events/guild_soundboard_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type GuildSoundboardSoundCreate struct {
// GuildSoundboardSoundUpdate indicates that a discord.SoundboardSound was updated in a discord.Guild
type GuildSoundboardSoundUpdate struct {
*GenericGuildSoundboardSound
OldGuildSoundboardSound discord.SoundboardSound
}

// GuildSoundboardSoundDelete indicates that a discord.SoundboardSound was deleted in a discord.Guild
Expand Down
5 changes: 5 additions & 0 deletions handlers/guild_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ func gatewayHandlerGuildCreate(client bot.Client, sequenceNumber int, shardID in
client.Caches().AddGuildScheduledEvent(guildScheduledEvent)
}

for _, soundboardSound := range event.SoundboardSounds {
client.Caches().AddGuildSoundboardSound(soundboardSound)
}

for _, presence := range event.Presences {
presence.GuildID = event.ID // populate unset field
client.Caches().AddPresence(presence)
Expand Down Expand Up @@ -128,6 +132,7 @@ func gatewayHandlerGuildDelete(client bot.Client, sequenceNumber int, shardID in
client.Caches().RemoveStickersByGuildID(event.ID)
client.Caches().RemoveRolesByGuildID(event.ID)
client.Caches().RemoveStageInstancesByGuildID(event.ID)
client.Caches().RemoveGuildSoundboardSoundsByGuildID(event.ID)
client.Caches().RemoveMessagesByGuildID(event.ID)

if event.Unavailable {
Expand Down
8 changes: 8 additions & 0 deletions handlers/guild_soundboard_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
)

func gatewayHandlerGuildSoundboardSoundCreate(client bot.Client, sequenceNumber int, shardID int, event gateway.EventGuildSoundboardSoundCreate) {
client.Caches().AddGuildSoundboardSound(event.SoundboardSound)

client.EventManager().DispatchEvent(&events.GuildSoundboardSoundCreate{
GenericGuildSoundboardSound: &events.GenericGuildSoundboardSound{
GenericEvent: events.NewGenericEvent(client, sequenceNumber, shardID),
Expand All @@ -16,15 +18,21 @@ func gatewayHandlerGuildSoundboardSoundCreate(client bot.Client, sequenceNumber
}

func gatewayHandlerGuildSoundboardSoundUpdate(client bot.Client, sequenceNumber int, shardID int, event gateway.EventGuildSoundboardSoundUpdate) {
oldSound, _ := client.Caches().GuildSoundboardSound(*event.GuildID, event.SoundID)
client.Caches().AddGuildSoundboardSound(event.SoundboardSound)

client.EventManager().DispatchEvent(&events.GuildSoundboardSoundUpdate{
GenericGuildSoundboardSound: &events.GenericGuildSoundboardSound{
GenericEvent: events.NewGenericEvent(client, sequenceNumber, shardID),
SoundboardSound: event.SoundboardSound,
},
OldGuildSoundboardSound: oldSound,
})
}

func gatewayHandlerGuildSoundboardSoundDelete(client bot.Client, sequenceNumber int, shardID int, event gateway.EventGuildSoundboardSoundDelete) {
client.Caches().RemoveGuildSoundboardSound(event.GuildID, event.SoundID)

client.EventManager().DispatchEvent(&events.GuildSoundboardSoundDelete{
GenericEvent: events.NewGenericEvent(client, sequenceNumber, shardID),
SoundID: event.SoundID,
Expand Down

0 comments on commit 48ee79e

Please sign in to comment.