|
@@ -50,6 +50,11 @@ func (s *State) GuildAdd(guild *Guild) error {
|
|
// If the guild exists, replace it.
|
|
// If the guild exists, replace it.
|
|
for i, g := range s.Guilds {
|
|
for i, g := range s.Guilds {
|
|
if g.ID == guild.ID {
|
|
if g.ID == guild.ID {
|
|
|
|
+ // Don't stomp on properties that don't come in updates.
|
|
|
|
+ guild.Members = g.Members
|
|
|
|
+ guild.Presences = g.Presences
|
|
|
|
+ guild.Channels = g.Channels
|
|
|
|
+ guild.VoiceStates = g.VoiceStates
|
|
s.Guilds[i] = guild
|
|
s.Guilds[i] = guild
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
@@ -105,14 +110,15 @@ func (s *State) MemberAdd(member *Member) error {
|
|
if s == nil {
|
|
if s == nil {
|
|
return nilError
|
|
return nilError
|
|
}
|
|
}
|
|
- s.Lock()
|
|
|
|
- defer s.Unlock()
|
|
|
|
|
|
|
|
guild, err := s.Guild(member.GuildID)
|
|
guild, err := s.Guild(member.GuildID)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ s.Lock()
|
|
|
|
+ defer s.Unlock()
|
|
|
|
+
|
|
for i, m := range guild.Members {
|
|
for i, m := range guild.Members {
|
|
if m.User.ID == member.User.ID {
|
|
if m.User.ID == member.User.ID {
|
|
guild.Members[i] = member
|
|
guild.Members[i] = member
|
|
@@ -129,14 +135,15 @@ func (s *State) MemberRemove(member *Member) error {
|
|
if s == nil {
|
|
if s == nil {
|
|
return nilError
|
|
return nilError
|
|
}
|
|
}
|
|
- s.Lock()
|
|
|
|
- defer s.Unlock()
|
|
|
|
|
|
|
|
guild, err := s.Guild(member.GuildID)
|
|
guild, err := s.Guild(member.GuildID)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ s.Lock()
|
|
|
|
+ defer s.Unlock()
|
|
|
|
+
|
|
for i, m := range guild.Members {
|
|
for i, m := range guild.Members {
|
|
if m.User.ID == member.User.ID {
|
|
if m.User.ID == member.User.ID {
|
|
guild.Members = append(guild.Members[:i], guild.Members[i+1:]...)
|
|
guild.Members = append(guild.Members[:i], guild.Members[i+1:]...)
|
|
@@ -152,14 +159,15 @@ func (s *State) Member(guildID, userID string) (*Member, error) {
|
|
if s == nil {
|
|
if s == nil {
|
|
return nil, nilError
|
|
return nil, nilError
|
|
}
|
|
}
|
|
- s.RLock()
|
|
|
|
- defer s.RUnlock()
|
|
|
|
|
|
|
|
guild, err := s.Guild(guildID)
|
|
guild, err := s.Guild(guildID)
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ s.RLock()
|
|
|
|
+ defer s.RUnlock()
|
|
|
|
+
|
|
for _, m := range guild.Members {
|
|
for _, m := range guild.Members {
|
|
if m.User.ID == userID {
|
|
if m.User.ID == userID {
|
|
return m, nil
|
|
return m, nil
|
|
@@ -177,13 +185,16 @@ func (s *State) ChannelAdd(channel *Channel) error {
|
|
if s == nil {
|
|
if s == nil {
|
|
return nilError
|
|
return nilError
|
|
}
|
|
}
|
|
- s.Lock()
|
|
|
|
- defer s.Unlock()
|
|
|
|
|
|
|
|
if channel.IsPrivate {
|
|
if channel.IsPrivate {
|
|
|
|
+ s.Lock()
|
|
|
|
+ defer s.Unlock()
|
|
|
|
+
|
|
// If the channel exists, replace it.
|
|
// If the channel exists, replace it.
|
|
for i, c := range s.PrivateChannels {
|
|
for i, c := range s.PrivateChannels {
|
|
if c.ID == channel.ID {
|
|
if c.ID == channel.ID {
|
|
|
|
+ // Don't stomp on messages.
|
|
|
|
+ channel.Messages = c.Messages
|
|
s.PrivateChannels[i] = channel
|
|
s.PrivateChannels[i] = channel
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
@@ -196,9 +207,14 @@ func (s *State) ChannelAdd(channel *Channel) error {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ s.Lock()
|
|
|
|
+ defer s.Unlock()
|
|
|
|
+
|
|
// If the channel exists, replace it.
|
|
// If the channel exists, replace it.
|
|
for i, c := range guild.Channels {
|
|
for i, c := range guild.Channels {
|
|
if c.ID == channel.ID {
|
|
if c.ID == channel.ID {
|
|
|
|
+ // Don't stomp on messages.
|
|
|
|
+ channel.Messages = c.Messages
|
|
guild.Channels[i] = channel
|
|
guild.Channels[i] = channel
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
@@ -215,8 +231,6 @@ func (s *State) ChannelRemove(channel *Channel) error {
|
|
if s == nil {
|
|
if s == nil {
|
|
return nilError
|
|
return nilError
|
|
}
|
|
}
|
|
- s.Lock()
|
|
|
|
- defer s.Unlock()
|
|
|
|
|
|
|
|
if channel.IsPrivate {
|
|
if channel.IsPrivate {
|
|
for i, c := range s.PrivateChannels {
|
|
for i, c := range s.PrivateChannels {
|
|
@@ -231,6 +245,9 @@ func (s *State) ChannelRemove(channel *Channel) error {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ s.Lock()
|
|
|
|
+ defer s.Unlock()
|
|
|
|
+
|
|
for i, c := range guild.Channels {
|
|
for i, c := range guild.Channels {
|
|
if c.ID == channel.ID {
|
|
if c.ID == channel.ID {
|
|
guild.Channels = append(guild.Channels[:i], guild.Channels[i+1:]...)
|
|
guild.Channels = append(guild.Channels[:i], guild.Channels[i+1:]...)
|
|
@@ -247,14 +264,15 @@ func (s *State) GuildChannel(guildID, channelID string) (*Channel, error) {
|
|
if s == nil {
|
|
if s == nil {
|
|
return nil, nilError
|
|
return nil, nilError
|
|
}
|
|
}
|
|
- s.RLock()
|
|
|
|
- defer s.RUnlock()
|
|
|
|
|
|
|
|
guild, err := s.Guild(guildID)
|
|
guild, err := s.Guild(guildID)
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ s.RLock()
|
|
|
|
+ defer s.RUnlock()
|
|
|
|
+
|
|
for _, c := range guild.Channels {
|
|
for _, c := range guild.Channels {
|
|
if c.ID == channelID {
|
|
if c.ID == channelID {
|
|
return c, nil
|
|
return c, nil
|
|
@@ -307,14 +325,15 @@ func (s *State) Emoji(guildID, emojiID string) (*Emoji, error) {
|
|
if s == nil {
|
|
if s == nil {
|
|
return nil, nilError
|
|
return nil, nilError
|
|
}
|
|
}
|
|
- s.RLock()
|
|
|
|
- defer s.RUnlock()
|
|
|
|
|
|
|
|
guild, err := s.Guild(guildID)
|
|
guild, err := s.Guild(guildID)
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ s.RLock()
|
|
|
|
+ defer s.RUnlock()
|
|
|
|
+
|
|
for _, e := range guild.Emojis {
|
|
for _, e := range guild.Emojis {
|
|
if e.ID == emojiID {
|
|
if e.ID == emojiID {
|
|
return e, nil
|
|
return e, nil
|
|
@@ -329,14 +348,15 @@ func (s *State) EmojiAdd(guildID string, emoji *Emoji) error {
|
|
if s == nil {
|
|
if s == nil {
|
|
return nilError
|
|
return nilError
|
|
}
|
|
}
|
|
- s.Lock()
|
|
|
|
- defer s.Unlock()
|
|
|
|
|
|
|
|
guild, err := s.Guild(guildID)
|
|
guild, err := s.Guild(guildID)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ s.Lock()
|
|
|
|
+ defer s.Unlock()
|
|
|
|
+
|
|
for i, e := range guild.Emojis {
|
|
for i, e := range guild.Emojis {
|
|
if e.ID == emoji.ID {
|
|
if e.ID == emoji.ID {
|
|
guild.Emojis[i] = emoji
|
|
guild.Emojis[i] = emoji
|