diff --git a/state.go b/state.go index e9eb4d6..45202ac 100644 --- a/state.go +++ b/state.go @@ -98,17 +98,35 @@ func (s *State) GuildAdd(guild *Guild) error { s.channelMap[c.ID] = c } - // If the guild exists, replace it. if g, ok := s.guildMap[guild.ID]; ok { - // If this guild already exists with data, don't stomp on props. - if g.Unavailable != nil && !*g.Unavailable { - guild.Members = g.Members - guild.Presences = g.Presences - guild.Channels = g.Channels - guild.VoiceStates = g.VoiceStates + // The guild already exists in state. + if guild.Unavailable { + // If the new guild is unavailable, just update the `unavailable` property on the + // current guild. + g.Unavailable = guild.Unavailable + } else { + // We are about to replace `g` in the state with `guild`, but first we need to + // make sure we preserve any fields that the `guild` doesn't contain from `g`. + if guild.Roles == nil { + guild.Roles = g.Roles + } + if guild.Emojis == nil { + guild.Emojis = g.Emojis + } + if guild.Members == nil { + guild.Members = g.Members + } + if guild.Presences == nil { + guild.Presences = g.Presences + } + if guild.Channels == nil { + guild.Channels = g.Channels + } + if guild.VoiceStates == nil { + guild.VoiceStates = g.VoiceStates + } + *g = *guild } - - *g = *guild return nil } diff --git a/structs.go b/structs.go index b782432..270427a 100644 --- a/structs.go +++ b/structs.go @@ -217,7 +217,7 @@ type Guild struct { Presences []*Presence `json:"presences"` Channels []*Channel `json:"channels"` VoiceStates []*VoiceState `json:"voice_states"` - Unavailable *bool `json:"unavailable"` + Unavailable bool `json:"unavailable"` } // A GuildParams stores all the data needed to update discord guild settings