State: Unavailable guilds are no longer added into the state

This commit is contained in:
diamondburned (Forefront) 2020-04-06 12:16:32 -07:00
parent 9f5c2ac958
commit 58f0feb143
2 changed files with 60 additions and 39 deletions

View File

@ -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))
}
}

View File

@ -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")
}
}
}