diff --git a/events.go b/events.go index 0ff2cb4..01da1cb 100644 --- a/events.go +++ b/events.go @@ -60,6 +60,7 @@ type ChannelUpdate struct { // ChannelDelete is the data for a ChannelDelete event. type ChannelDelete struct { *Channel + BeforeDelete *Channel `json:"-"` } // ChannelPinsUpdate stores data for a ChannelPinsUpdate event. @@ -84,6 +85,7 @@ type ThreadUpdate struct { // ThreadDelete is the data for a ThreadDelete event. type ThreadDelete struct { *Channel + BeforeDelete *Channel `json:"-"` } // ThreadListSync is the data for a ThreadListSync event. @@ -158,6 +160,7 @@ type GuildMemberUpdate struct { // GuildMemberRemove is the data for a GuildMemberRemove event. type GuildMemberRemove struct { *Member + BeforeDelete *Member `json:"-"` } // GuildRoleCreate is the data for a GuildRoleCreate event. @@ -168,12 +171,14 @@ type GuildRoleCreate struct { // GuildRoleUpdate is the data for a GuildRoleUpdate event. type GuildRoleUpdate struct { *GuildRole + BeforeUpdate *Role `json:"-"` } // A GuildRoleDelete is the data for a GuildRoleDelete event. type GuildRoleDelete struct { - RoleID string `json:"role_id"` - GuildID string `json:"guild_id"` + RoleID string `json:"role_id"` + GuildID string `json:"guild_id"` + BeforeDelete *Role `json:"-"` } // A GuildEmojisUpdate is the data for a guild emoji update event. diff --git a/state.go b/state.go index d1fbb38..94b0ba2 100644 --- a/state.go +++ b/state.go @@ -1014,6 +1014,12 @@ func (s *State) OnInterface(se *Session, i interface{}) (err error) { // Removes member from the cache if tracking is enabled. if s.TrackMembers { + old, err := s.Member(t.Member.GuildID, t.Member.User.ID) + if err == nil { + oldCopy := *old + t.BeforeDelete = &oldCopy + } + err = s.MemberRemove(t.Member) } case *GuildMembersChunk: @@ -1035,10 +1041,22 @@ func (s *State) OnInterface(se *Session, i interface{}) (err error) { } case *GuildRoleUpdate: if s.TrackRoles { + old, err := s.Role(t.GuildID, t.Role.ID) + if err == nil { + oldCopy := *old + t.BeforeUpdate = &oldCopy + } + err = s.RoleAdd(t.GuildID, t.Role) } case *GuildRoleDelete: if s.TrackRoles { + old, err := s.Role(t.GuildID, t.RoleID) + if err == nil { + oldCopy := *old + t.BeforeDelete = &oldCopy + } + err = s.RoleRemove(t.GuildID, t.RoleID) } case *GuildEmojisUpdate: @@ -1078,6 +1096,11 @@ func (s *State) OnInterface(se *Session, i interface{}) (err error) { } case *ChannelDelete: if s.TrackChannels { + old, err := s.Channel(t.ID) + if err == nil { + oldCopy := *old + t.BeforeDelete = &oldCopy + } err = s.ChannelRemove(t.Channel) } case *ThreadCreate: @@ -1095,6 +1118,11 @@ func (s *State) OnInterface(se *Session, i interface{}) (err error) { } case *ThreadDelete: if s.TrackThreads { + old, err := s.Channel(t.ID) + if err == nil { + oldCopy := *old + t.BeforeDelete = &oldCopy + } err = s.ChannelRemove(t.Channel) } case *ThreadMemberUpdate: