State: Unavailable guilds are no longer added into the state
This commit is contained in:
parent
9f5c2ac958
commit
58f0feb143
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue