From 58f0feb14341654888f7d530a77e1a6a931627dd Mon Sep 17 00:00:00 2001 From: "diamondburned (Forefront)" Date: Mon, 6 Apr 2020 12:16:32 -0700 Subject: [PATCH] State: Unavailable guilds are no longer added into the state --- state/state_events.go | 62 +++++++++++++++++++++++++++++++++++++++++-- state/store.go | 37 -------------------------- 2 files changed, 60 insertions(+), 39 deletions(-) diff --git a/state/state_events.go b/state/state_events.go index 8b43e82..89978d2 100644 --- a/state/state_events.go +++ b/state/state_events.go @@ -37,7 +37,7 @@ func (s *State) onEvent(iface interface{}) { // Handle guilds for i := range ev.Guilds { - handleGuildCreate(s, &ev.Guilds[i]) + s.batchLog(handleGuildCreate(s.Store, &ev.Guilds[i])...) } // Handle private channels @@ -53,7 +53,7 @@ func (s *State) onEvent(iface interface{}) { } case *gateway.GuildCreateEvent: - handleGuildCreate(s, ev) + s.batchLog(handleGuildCreate(s.Store, ev)...) case *gateway.GuildUpdateEvent: if err := s.Store.GuildSet((*discord.Guild)(ev)); err != nil { @@ -193,3 +193,61 @@ func (s *State) onEvent(iface interface{}) { func (s *State) stateErr(err error, wrap string) { s.StateLog(errors.Wrap(err, wrap)) } +func (s *State) batchLog(errors ...error) { + for _, err := range errors { + s.StateLog(err) + } +} + +// Helper functions + +func handleGuildCreate(store Store, guild *gateway.GuildCreateEvent) []error { + // If a guild is unavailable, don't populate it in the state, as the guild + // data is very incomplete. + if guild.Unavailable { + return nil + } + + stack, error := newErrorStack() + + if err := store.GuildSet(&guild.Guild); err != nil { + error(err, "Failed to set guild in Ready") + } + + // Handle guild emojis + if guild.Emojis != nil { + if err := store.EmojiSet(guild.ID, guild.Emojis); err != nil { + error(err, "Failed to set guild emojis") + } + } + + // Handle guild member + for i := range guild.Members { + if err := store.MemberSet(guild.ID, &guild.Members[i]); err != nil { + error(err, "Failed to set guild member in Ready") + } + } + + // Handle guild channels + for i := range guild.Channels { + if err := store.ChannelSet(&guild.Channels[i]); err != nil { + error(err, "Failed to set guild channel in Ready") + } + } + + // Handle guild presences + for i := range guild.Presences { + if err := store.PresenceSet(guild.ID, &guild.Presences[i]); err != nil { + error(err, "Failed to set guild presence in Ready") + } + } + + return *stack +} + +func newErrorStack() (*[]error, func(error, string)) { + var errs = new([]error) + return errs, func(err error, wrap string) { + *errs = append(*errs, errors.Wrap(err, wrap)) + } +} diff --git a/state/store.go b/state/store.go index 5bbcf4b..4979e8b 100644 --- a/state/store.go +++ b/state/store.go @@ -4,7 +4,6 @@ import ( "errors" "github.com/diamondburned/arikawa/discord" - "github.com/diamondburned/arikawa/gateway" ) // Store is the state storage. It should handle mutex itself, and it should only @@ -85,39 +84,3 @@ type StoreModifier interface { // isn't in the storage. There is no strict restrictions on what uses this (the // default one does, though), so be advised. var ErrStoreNotFound = errors.New("item not found in store") - -// Helper functions - -func handleGuildCreate(s *State, guild *gateway.GuildCreateEvent) { - if err := s.Store.GuildSet(&guild.Guild); err != nil { - s.stateErr(err, "Failed to set guild in Ready") - } - - // Handle guild emojis - if guild.Emojis != nil { - if err := s.Store.EmojiSet(guild.ID, guild.Emojis); err != nil { - s.stateErr(err, "Failed to set guild emojis") - } - } - - // Handle guild member - for i := range guild.Members { - if err := s.Store.MemberSet(guild.ID, &guild.Members[i]); err != nil { - s.stateErr(err, "Failed to set guild member in Ready") - } - } - - // Handle guild channels - for i := range guild.Channels { - if err := s.Store.ChannelSet(&guild.Channels[i]); err != nil { - s.stateErr(err, "Failed to set guild channel in Ready") - } - } - - // Handle guild presences - for i := range guild.Presences { - if err := s.Store.PresenceSet(guild.ID, &guild.Presences[i]); err != nil { - s.stateErr(err, "Failed to set guild presence in Ready") - } - } -}