From 4e23e5fc35e9dc4328930d5cfb92b361b471c86f Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Thu, 31 Dec 2015 17:29:16 -0800 Subject: [PATCH 1/5] Implement state tracking. Currently maintains a list of Guilds (Members/Channels) and PrivateChannels. --- discord.go | 4 +- state.go | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++ structs.go | 22 +++--- wsapi.go | 83 +++++++++++++---------- 4 files changed, 257 insertions(+), 47 deletions(-) create mode 100644 state.go diff --git a/discord.go b/discord.go index 2f7c97d..799e725 100644 --- a/discord.go +++ b/discord.go @@ -61,7 +61,9 @@ type voiceUDP struct { func New(args ...interface{}) (s *Session, err error) { // Create an empty Session interface. - s = &Session{} + s = &Session{ + State: NewState(), + } // If no arguments are passed return the empty Session interface. // Later I will add default values, if appropriate. diff --git a/state.go b/state.go new file mode 100644 index 0000000..5645aa3 --- /dev/null +++ b/state.go @@ -0,0 +1,195 @@ +package discordgo + +import "errors" + +// NewState creates an empty state. +func NewState() *State { + return &State{ + Ready: Ready{ + PrivateChannels: []Channel{}, + Guilds: []Guild{}, + }, + } +} + +// OnReady takes a Ready event and updates all internal state. +func (s *State) OnReady(r *Ready) { + s.Ready = *r +} + +// AddGuild adds a guild to the current world state, or +// updates it if it already exists. +func (s *State) AddGuild(guild *Guild) { + for _, g := range s.Guilds { + if g.ID == guild.ID { + // This could be a little faster ;) + for _, m := range guild.Members { + s.AddMember(&m) + } + for _, c := range guild.Channels { + s.AddChannel(&c) + } + return + } + } + s.Guilds = append(s.Guilds, *guild) +} + +// RemoveGuild removes a guild from current world state. +func (s *State) RemoveGuild(guild *Guild) error { + for i, g := range s.Guilds { + if g.ID == guild.ID { + s.Guilds = append(s.Guilds[:i], s.Guilds[i+1:]...) + return nil + } + } + return errors.New("Guild not found.") +} + +// GetGuildByID gets a guild by ID. +// Useful for querying if @me is in a guild: +// _, err := discordgo.Session.State.GetGuildById(guildID) +// isInGuild := err == nil +func (s *State) GetGuildByID(guildID string) (*Guild, error) { + for _, g := range s.Guilds { + if g.ID == guildID { + return &g, nil + } + } + return nil, errors.New("Guild not found.") +} + +// TODO: Consider moving Guild state update methods onto *Guild. + +// AddMember adds a member to the current world state, or +// updates it if it already exists. +func (s *State) AddMember(member *Member) error { + guild, err := s.GetGuildByID(member.GuildID) + if err != nil { + return err + } + + for i, m := range guild.Members { + if m.User.ID == member.User.ID { + guild.Members[i] = *member + return nil + } + } + + guild.Members = append(guild.Members, *member) + return nil +} + +// RemoveMember removes a member from current world state. +func (s *State) RemoveMember(member *Member) error { + guild, err := s.GetGuildByID(member.GuildID) + if err != nil { + return err + } + + for i, m := range guild.Members { + if m.User.ID == member.User.ID { + guild.Members = append(guild.Members[:i], guild.Members[i+1:]...) + return nil + } + } + return errors.New("Member not found.") +} + +// GetMemberByID gets a member by ID from a guild. +func (s *State) GetMemberByID(guildID string, userID string) (*Member, error) { + guild, err := s.GetGuildByID(guildID) + if err != nil { + return nil, err + } + + for _, m := range guild.Members { + if m.User.ID == userID { + return &m, nil + } + } + return nil, errors.New("Member not found.") +} + +// AddChannel adds a guild to the current world state, or +// updates it if it already exists. +// Channels may exist either as PrivateChannels or inside +// a guild. +func (s *State) AddChannel(channel *Channel) error { + if channel.IsPrivate { + for i, c := range s.PrivateChannels { + if c.ID == channel.ID { + s.PrivateChannels[i] = *channel + return nil + } + } + + s.PrivateChannels = append(s.PrivateChannels, *channel) + } else { + guild, err := s.GetGuildByID(channel.GuildID) + if err != nil { + return err + } + + for i, c := range guild.Channels { + if c.ID == channel.ID { + guild.Channels[i] = *channel + return nil + } + } + + guild.Channels = append(guild.Channels, *channel) + } + return nil +} + +// RemoveChannel removes a channel from current world state. +func (s *State) RemoveChannel(channel *Channel) error { + if channel.IsPrivate { + for i, c := range s.PrivateChannels { + if c.ID == channel.ID { + s.PrivateChannels = append(s.PrivateChannels[:i], s.PrivateChannels[i+1:]...) + return nil + } + } + } else { + guild, err := s.GetGuildByID(channel.GuildID) + if err != nil { + return err + } + + for i, c := range guild.Channels { + if c.ID == channel.ID { + guild.Channels = append(guild.Channels[:i], guild.Channels[i+1:]...) + return nil + } + } + } + + return errors.New("Channel not found.") +} + +// GetGuildChannelById gets a channel by ID from a guild. +func (s *State) GetGuildChannelByID(guildID string, channelID string) (*Channel, error) { + guild, err := s.GetGuildByID(guildID) + if err != nil { + return nil, err + } + + for _, c := range guild.Channels { + if c.ID == channelID { + return &c, nil + } + } + return nil, errors.New("Channel not found.") +} + +// GetPrivateChannelByID gets a private channel by ID. +func (s *State) GetPrivateChannelByID(channelID string) (*Channel, error) { + for _, c := range s.PrivateChannels { + if c.ID == channelID { + return &c, nil + } + } + return nil, errors.New("Channel not found.") +} diff --git a/structs.go b/structs.go index d51fcf2..4d78151 100644 --- a/structs.go +++ b/structs.go @@ -84,6 +84,9 @@ type Session struct { VChannelID string Vop2 VoiceOP2 UDPConn *net.UDPConn + + // Managed state object, updated with events. + State *State } // A Message stores all data related to a specific Discord message. @@ -262,14 +265,6 @@ type User struct { // it just doesn't seem able to handle this one // field correctly. Need to research this more. -// A PrivateChannel stores all data for a specific user private channel. -type PrivateChannel struct { - ID string `json:"id"` - IsPrivate bool `json:"is_private"` - LastMessageID string `json:"last_message_id"` - Recipient User `json:"recipient"` -} // merge with channel? - // A Settings stores data for a specific users Discord client settings. type Settings struct { RenderEmbeds bool `json:"render_embeds"` @@ -298,8 +293,8 @@ type Ready struct { HeartbeatInterval time.Duration `json:"heartbeat_interval"` User User `json:"user"` ReadState []ReadState - PrivateChannels []PrivateChannel - Guilds []Guild + PrivateChannels []Channel `json:"private_channels"` + Guilds []Guild `json:"guilds"` } // A ReadState stores data on the read state of channels. @@ -360,3 +355,10 @@ type GuildBan struct { User User `json:"user"` GuildID string `json:"guild_id"` } + +// A State contains the current known state, as discord sends this in a +// READY blob, it seems reasonable to simply use that message type as the +// data store. +type State struct { + Ready +} diff --git a/wsapi.go b/wsapi.go index 2070df4..3a7374b 100644 --- a/wsapi.go +++ b/wsapi.go @@ -153,6 +153,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "READY": var st Ready if err = unmarshalEvent(e, &st); err == nil { + s.State.OnReady(&st) if s.OnReady != nil { s.OnReady(s, st) } @@ -235,77 +236,87 @@ func (s *Session) event(messageType int, message []byte) (err error) { return } case "CHANNEL_CREATE": - if s.OnChannelCreate != nil { - var st Channel - if err = unmarshalEvent(e, &st); err == nil { + var st Channel + if err = unmarshalEvent(e, &st); err == nil { + fmt.Println("channel create", st) + s.State.AddChannel(&st) + if s.OnChannelCreate != nil { s.OnChannelCreate(s, st) } - return } + return case "CHANNEL_UPDATE": - if s.OnChannelUpdate != nil { - var st Channel - if err = unmarshalEvent(e, &st); err == nil { + var st Channel + if err = unmarshalEvent(e, &st); err == nil { + s.State.AddChannel(&st) + if s.OnChannelUpdate != nil { s.OnChannelUpdate(s, st) } - return } + return case "CHANNEL_DELETE": - if s.OnChannelDelete != nil { - var st Channel - if err = unmarshalEvent(e, &st); err == nil { + var st Channel + if err = unmarshalEvent(e, &st); err == nil { + s.State.RemoveChannel(&st) + if s.OnChannelDelete != nil { s.OnChannelDelete(s, st) } - return } + return case "GUILD_CREATE": - if s.OnGuildCreate != nil { - var st Guild - if err = unmarshalEvent(e, &st); err == nil { + var st Guild + if err = unmarshalEvent(e, &st); err == nil { + s.State.AddGuild(&st) + if s.OnGuildCreate != nil { s.OnGuildCreate(s, st) } - return } + return case "GUILD_UPDATE": - if s.OnGuildCreate != nil { - var st Guild - if err = unmarshalEvent(e, &st); err == nil { + var st Guild + if err = unmarshalEvent(e, &st); err == nil { + s.State.AddGuild(&st) + if s.OnGuildCreate != nil { s.OnGuildUpdate(s, st) } - return } + return case "GUILD_DELETE": - if s.OnGuildDelete != nil { - var st Guild - if err = unmarshalEvent(e, &st); err == nil { + var st Guild + if err = unmarshalEvent(e, &st); err == nil { + s.State.RemoveGuild(&st) + if s.OnGuildDelete != nil { s.OnGuildDelete(s, st) } - return } + return case "GUILD_MEMBER_ADD": - if s.OnGuildMemberAdd != nil { - var st Member - if err = unmarshalEvent(e, &st); err == nil { + var st Member + if err = unmarshalEvent(e, &st); err == nil { + s.State.AddMember(&st) + if s.OnGuildMemberAdd != nil { s.OnGuildMemberAdd(s, st) } - return } + return case "GUILD_MEMBER_REMOVE": - if s.OnGuildMemberRemove != nil { - var st Member - if err = unmarshalEvent(e, &st); err == nil { + var st Member + if err = unmarshalEvent(e, &st); err == nil { + s.State.RemoveMember(&st) + if s.OnGuildMemberRemove != nil { s.OnGuildMemberRemove(s, st) } - return } + return case "GUILD_MEMBER_UPDATE": - if s.OnGuildMemberUpdate != nil { - var st Member - if err = unmarshalEvent(e, &st); err == nil { + var st Member + if err = unmarshalEvent(e, &st); err == nil { + s.State.AddMember(&st) + if s.OnGuildMemberUpdate != nil { s.OnGuildMemberUpdate(s, st) } - return } + return case "GUILD_ROLE_CREATE": if s.OnGuildRoleCreate != nil { var st GuildRole From b2ef55ae9cba305cbb93edf171d8d4a5a9ed6cdb Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Fri, 1 Jan 2016 22:56:32 -0800 Subject: [PATCH 2/5] Cleanup before mailing. --- structs.go | 6 +++--- wsapi.go | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/structs.go b/structs.go index 4d78151..b716624 100644 --- a/structs.go +++ b/structs.go @@ -356,9 +356,9 @@ type GuildBan struct { GuildID string `json:"guild_id"` } -// A State contains the current known state, as discord sends this in a -// READY blob, it seems reasonable to simply use that message type as the -// data store. +// A State contains the current known state. +// As discord sends this in a READY blob, it seems reasonable to simply +// use that struct as the data store. type State struct { Ready } diff --git a/wsapi.go b/wsapi.go index 3a7374b..7b40eda 100644 --- a/wsapi.go +++ b/wsapi.go @@ -238,7 +238,6 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "CHANNEL_CREATE": var st Channel if err = unmarshalEvent(e, &st); err == nil { - fmt.Println("channel create", st) s.State.AddChannel(&st) if s.OnChannelCreate != nil { s.OnChannelCreate(s, st) From 9ba6d5b7c12d846894cd727984228b7a129e1daa Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Sat, 2 Jan 2016 12:01:03 -0800 Subject: [PATCH 3/5] Make state tracking optional. --- discord.go | 3 +- state.go | 88 +++++++++++++++++++++++++++++++++++++++++++----------- structs.go | 3 +- wsapi.go | 40 ++++++++++++++++++------- 4 files changed, 104 insertions(+), 30 deletions(-) diff --git a/discord.go b/discord.go index 799e725..50d3686 100644 --- a/discord.go +++ b/discord.go @@ -62,7 +62,8 @@ func New(args ...interface{}) (s *Session, err error) { // Create an empty Session interface. s = &Session{ - State: NewState(), + State: NewState(), + StateEnabled: true, } // If no arguments are passed return the empty Session interface. diff --git a/state.go b/state.go index 5645aa3..69d3746 100644 --- a/state.go +++ b/state.go @@ -2,6 +2,8 @@ package discordgo import "errors" +var nilError error = errors.New("State not instantiated, please use discordgo.New() or assign session.State.") + // NewState creates an empty state. func NewState() *State { return &State{ @@ -13,13 +15,22 @@ func NewState() *State { } // OnReady takes a Ready event and updates all internal state. -func (s *State) OnReady(r *Ready) { +func (s *State) OnReady(r *Ready) error { + if s == nil { + return nilError + } + s.Ready = *r + return nil } // AddGuild adds a guild to the current world state, or // updates it if it already exists. -func (s *State) AddGuild(guild *Guild) { +func (s *State) AddGuild(guild *Guild) error { + if s == nil { + return nilError + } + for _, g := range s.Guilds { if g.ID == guild.ID { // This could be a little faster ;) @@ -29,14 +40,19 @@ func (s *State) AddGuild(guild *Guild) { for _, c := range guild.Channels { s.AddChannel(&c) } - return + return nil } } s.Guilds = append(s.Guilds, *guild) + return nil } // RemoveGuild removes a guild from current world state. func (s *State) RemoveGuild(guild *Guild) error { + if s == nil { + return nilError + } + for i, g := range s.Guilds { if g.ID == guild.ID { s.Guilds = append(s.Guilds[:i], s.Guilds[i+1:]...) @@ -46,11 +62,15 @@ func (s *State) RemoveGuild(guild *Guild) error { return errors.New("Guild not found.") } -// GetGuildByID gets a guild by ID. +// Guild gets a guild by ID. // Useful for querying if @me is in a guild: -// _, err := discordgo.Session.State.GetGuildById(guildID) +// _, err := discordgo.Session.State.Guild(guildID) // isInGuild := err == nil -func (s *State) GetGuildByID(guildID string) (*Guild, error) { +func (s *State) Guild(guildID string) (*Guild, error) { + if s == nil { + return nil, nilError + } + for _, g := range s.Guilds { if g.ID == guildID { return &g, nil @@ -64,7 +84,11 @@ func (s *State) GetGuildByID(guildID string) (*Guild, error) { // AddMember adds a member to the current world state, or // updates it if it already exists. func (s *State) AddMember(member *Member) error { - guild, err := s.GetGuildByID(member.GuildID) + if s == nil { + return nilError + } + + guild, err := s.Guild(member.GuildID) if err != nil { return err } @@ -82,7 +106,11 @@ func (s *State) AddMember(member *Member) error { // RemoveMember removes a member from current world state. func (s *State) RemoveMember(member *Member) error { - guild, err := s.GetGuildByID(member.GuildID) + if s == nil { + return nilError + } + + guild, err := s.Guild(member.GuildID) if err != nil { return err } @@ -93,12 +121,17 @@ func (s *State) RemoveMember(member *Member) error { return nil } } + return errors.New("Member not found.") } -// GetMemberByID gets a member by ID from a guild. -func (s *State) GetMemberByID(guildID string, userID string) (*Member, error) { - guild, err := s.GetGuildByID(guildID) +// Member gets a member by ID from a guild. +func (s *State) Member(guildID string, userID string) (*Member, error) { + if s == nil { + return nil, nilError + } + + guild, err := s.Guild(guildID) if err != nil { return nil, err } @@ -108,6 +141,7 @@ func (s *State) GetMemberByID(guildID string, userID string) (*Member, error) { return &m, nil } } + return nil, errors.New("Member not found.") } @@ -116,6 +150,10 @@ func (s *State) GetMemberByID(guildID string, userID string) (*Member, error) { // Channels may exist either as PrivateChannels or inside // a guild. func (s *State) AddChannel(channel *Channel) error { + if s == nil { + return nilError + } + if channel.IsPrivate { for i, c := range s.PrivateChannels { if c.ID == channel.ID { @@ -126,7 +164,7 @@ func (s *State) AddChannel(channel *Channel) error { s.PrivateChannels = append(s.PrivateChannels, *channel) } else { - guild, err := s.GetGuildByID(channel.GuildID) + guild, err := s.Guild(channel.GuildID) if err != nil { return err } @@ -145,6 +183,10 @@ func (s *State) AddChannel(channel *Channel) error { // RemoveChannel removes a channel from current world state. func (s *State) RemoveChannel(channel *Channel) error { + if s == nil { + return nilError + } + if channel.IsPrivate { for i, c := range s.PrivateChannels { if c.ID == channel.ID { @@ -153,7 +195,7 @@ func (s *State) RemoveChannel(channel *Channel) error { } } } else { - guild, err := s.GetGuildByID(channel.GuildID) + guild, err := s.Guild(channel.GuildID) if err != nil { return err } @@ -169,9 +211,13 @@ func (s *State) RemoveChannel(channel *Channel) error { return errors.New("Channel not found.") } -// GetGuildChannelById gets a channel by ID from a guild. -func (s *State) GetGuildChannelByID(guildID string, channelID string) (*Channel, error) { - guild, err := s.GetGuildByID(guildID) +// GuildChannel gets a channel by ID from a guild. +func (s *State) GuildChannel(guildID string, channelID string) (*Channel, error) { + if s == nil { + return nil, nilError + } + + guild, err := s.Guild(guildID) if err != nil { return nil, err } @@ -181,15 +227,21 @@ func (s *State) GetGuildChannelByID(guildID string, channelID string) (*Channel, return &c, nil } } + return nil, errors.New("Channel not found.") } -// GetPrivateChannelByID gets a private channel by ID. -func (s *State) GetPrivateChannelByID(channelID string) (*Channel, error) { +// PrivateChannel gets a private channel by ID. +func (s *State) PrivateChannel(channelID string) (*Channel, error) { + if s == nil { + return nil, nilError + } + for _, c := range s.PrivateChannels { if c.ID == channelID { return &c, nil } } + return nil, errors.New("Channel not found.") } diff --git a/structs.go b/structs.go index b716624..c1b3e14 100644 --- a/structs.go +++ b/structs.go @@ -86,7 +86,8 @@ type Session struct { UDPConn *net.UDPConn // Managed state object, updated with events. - State *State + State *State + StateEnabled bool } // A Message stores all data related to a specific Discord message. diff --git a/wsapi.go b/wsapi.go index 7b40eda..cbe3332 100644 --- a/wsapi.go +++ b/wsapi.go @@ -153,7 +153,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "READY": var st Ready if err = unmarshalEvent(e, &st); err == nil { - s.State.OnReady(&st) + if s.StateEnabled { + s.State.OnReady(&st) + } if s.OnReady != nil { s.OnReady(s, st) } @@ -238,7 +240,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "CHANNEL_CREATE": var st Channel if err = unmarshalEvent(e, &st); err == nil { - s.State.AddChannel(&st) + if s.StateEnabled { + s.State.AddChannel(&st) + } if s.OnChannelCreate != nil { s.OnChannelCreate(s, st) } @@ -247,7 +251,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "CHANNEL_UPDATE": var st Channel if err = unmarshalEvent(e, &st); err == nil { - s.State.AddChannel(&st) + if s.StateEnabled { + s.State.AddChannel(&st) + } if s.OnChannelUpdate != nil { s.OnChannelUpdate(s, st) } @@ -256,7 +262,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "CHANNEL_DELETE": var st Channel if err = unmarshalEvent(e, &st); err == nil { - s.State.RemoveChannel(&st) + if s.StateEnabled { + s.State.RemoveChannel(&st) + } if s.OnChannelDelete != nil { s.OnChannelDelete(s, st) } @@ -265,7 +273,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "GUILD_CREATE": var st Guild if err = unmarshalEvent(e, &st); err == nil { - s.State.AddGuild(&st) + if s.StateEnabled { + s.State.AddGuild(&st) + } if s.OnGuildCreate != nil { s.OnGuildCreate(s, st) } @@ -274,7 +284,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "GUILD_UPDATE": var st Guild if err = unmarshalEvent(e, &st); err == nil { - s.State.AddGuild(&st) + if s.StateEnabled { + s.State.AddGuild(&st) + } if s.OnGuildCreate != nil { s.OnGuildUpdate(s, st) } @@ -283,7 +295,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "GUILD_DELETE": var st Guild if err = unmarshalEvent(e, &st); err == nil { - s.State.RemoveGuild(&st) + if s.StateEnabled { + s.State.RemoveGuild(&st) + } if s.OnGuildDelete != nil { s.OnGuildDelete(s, st) } @@ -292,7 +306,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "GUILD_MEMBER_ADD": var st Member if err = unmarshalEvent(e, &st); err == nil { - s.State.AddMember(&st) + if s.StateEnabled { + s.State.AddMember(&st) + } if s.OnGuildMemberAdd != nil { s.OnGuildMemberAdd(s, st) } @@ -301,7 +317,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "GUILD_MEMBER_REMOVE": var st Member if err = unmarshalEvent(e, &st); err == nil { - s.State.RemoveMember(&st) + if s.StateEnabled { + s.State.RemoveMember(&st) + } if s.OnGuildMemberRemove != nil { s.OnGuildMemberRemove(s, st) } @@ -310,7 +328,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "GUILD_MEMBER_UPDATE": var st Member if err = unmarshalEvent(e, &st); err == nil { - s.State.AddMember(&st) + if s.StateEnabled { + s.State.AddMember(&st) + } if s.OnGuildMemberUpdate != nil { s.OnGuildMemberUpdate(s, st) } From 14c18b22868be203b301c0760449ca5a30804f6a Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Sat, 2 Jan 2016 12:32:18 -0800 Subject: [PATCH 4/5] Add generic Channel method which is slower. --- state.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/state.go b/state.go index 69d3746..5b22480 100644 --- a/state.go +++ b/state.go @@ -245,3 +245,24 @@ func (s *State) PrivateChannel(channelID string) (*Channel, error) { return nil, errors.New("Channel not found.") } + +// Channel gets a channel by ID, it will look in all guilds an private channels. +func (s *State) Channel(channelID string) (*Channel, error) { + if s == nil { + return nil, nilError + } + + c, err := s.PrivateChannel(channelID) + if err == nil { + return c, nil + } + + for _, g := range s.Guilds { + c, err := s.GuildChannel(g.ID, channelID) + if err == nil { + return c, nil + } + } + + return nil, errors.New("Channel not found.") +} From 66052d0a9ce40170bfc46134df10c7d5e348ae4b Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Sat, 2 Jan 2016 13:09:20 -0800 Subject: [PATCH 5/5] Rename methods. --- state.go | 28 ++++++++++++++-------------- wsapi.go | 18 +++++++++--------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/state.go b/state.go index 5b22480..88b30f5 100644 --- a/state.go +++ b/state.go @@ -24,9 +24,9 @@ func (s *State) OnReady(r *Ready) error { return nil } -// AddGuild adds a guild to the current world state, or +// GuildAdd adds a guild to the current world state, or // updates it if it already exists. -func (s *State) AddGuild(guild *Guild) error { +func (s *State) GuildAdd(guild *Guild) error { if s == nil { return nilError } @@ -35,10 +35,10 @@ func (s *State) AddGuild(guild *Guild) error { if g.ID == guild.ID { // This could be a little faster ;) for _, m := range guild.Members { - s.AddMember(&m) + s.MemberAdd(&m) } for _, c := range guild.Channels { - s.AddChannel(&c) + s.ChannelAdd(&c) } return nil } @@ -47,8 +47,8 @@ func (s *State) AddGuild(guild *Guild) error { return nil } -// RemoveGuild removes a guild from current world state. -func (s *State) RemoveGuild(guild *Guild) error { +// GuildRemove removes a guild from current world state. +func (s *State) GuildRemove(guild *Guild) error { if s == nil { return nilError } @@ -81,9 +81,9 @@ func (s *State) Guild(guildID string) (*Guild, error) { // TODO: Consider moving Guild state update methods onto *Guild. -// AddMember adds a member to the current world state, or +// MemberAdd adds a member to the current world state, or // updates it if it already exists. -func (s *State) AddMember(member *Member) error { +func (s *State) MemberAdd(member *Member) error { if s == nil { return nilError } @@ -104,8 +104,8 @@ func (s *State) AddMember(member *Member) error { return nil } -// RemoveMember removes a member from current world state. -func (s *State) RemoveMember(member *Member) error { +// MemberRemove removes a member from current world state. +func (s *State) MemberRemove(member *Member) error { if s == nil { return nilError } @@ -145,11 +145,11 @@ func (s *State) Member(guildID string, userID string) (*Member, error) { return nil, errors.New("Member not found.") } -// AddChannel adds a guild to the current world state, or +// ChannelAdd adds a guild to the current world state, or // updates it if it already exists. // Channels may exist either as PrivateChannels or inside // a guild. -func (s *State) AddChannel(channel *Channel) error { +func (s *State) ChannelAdd(channel *Channel) error { if s == nil { return nilError } @@ -181,8 +181,8 @@ func (s *State) AddChannel(channel *Channel) error { return nil } -// RemoveChannel removes a channel from current world state. -func (s *State) RemoveChannel(channel *Channel) error { +// ChannelRemove removes a channel from current world state. +func (s *State) ChannelRemove(channel *Channel) error { if s == nil { return nilError } diff --git a/wsapi.go b/wsapi.go index cbe3332..b8fbd76 100644 --- a/wsapi.go +++ b/wsapi.go @@ -241,7 +241,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { var st Channel if err = unmarshalEvent(e, &st); err == nil { if s.StateEnabled { - s.State.AddChannel(&st) + s.State.ChannelAdd(&st) } if s.OnChannelCreate != nil { s.OnChannelCreate(s, st) @@ -252,7 +252,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { var st Channel if err = unmarshalEvent(e, &st); err == nil { if s.StateEnabled { - s.State.AddChannel(&st) + s.State.ChannelAdd(&st) } if s.OnChannelUpdate != nil { s.OnChannelUpdate(s, st) @@ -263,7 +263,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { var st Channel if err = unmarshalEvent(e, &st); err == nil { if s.StateEnabled { - s.State.RemoveChannel(&st) + s.State.ChannelRemove(&st) } if s.OnChannelDelete != nil { s.OnChannelDelete(s, st) @@ -274,7 +274,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { var st Guild if err = unmarshalEvent(e, &st); err == nil { if s.StateEnabled { - s.State.AddGuild(&st) + s.State.GuildAdd(&st) } if s.OnGuildCreate != nil { s.OnGuildCreate(s, st) @@ -285,7 +285,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { var st Guild if err = unmarshalEvent(e, &st); err == nil { if s.StateEnabled { - s.State.AddGuild(&st) + s.State.GuildAdd(&st) } if s.OnGuildCreate != nil { s.OnGuildUpdate(s, st) @@ -296,7 +296,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { var st Guild if err = unmarshalEvent(e, &st); err == nil { if s.StateEnabled { - s.State.RemoveGuild(&st) + s.State.GuildRemove(&st) } if s.OnGuildDelete != nil { s.OnGuildDelete(s, st) @@ -307,7 +307,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { var st Member if err = unmarshalEvent(e, &st); err == nil { if s.StateEnabled { - s.State.AddMember(&st) + s.State.MemberAdd(&st) } if s.OnGuildMemberAdd != nil { s.OnGuildMemberAdd(s, st) @@ -318,7 +318,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { var st Member if err = unmarshalEvent(e, &st); err == nil { if s.StateEnabled { - s.State.RemoveMember(&st) + s.State.MemberRemove(&st) } if s.OnGuildMemberRemove != nil { s.OnGuildMemberRemove(s, st) @@ -329,7 +329,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { var st Member if err = unmarshalEvent(e, &st); err == nil { if s.StateEnabled { - s.State.AddMember(&st) + s.State.MemberAdd(&st) } if s.OnGuildMemberUpdate != nil { s.OnGuildMemberUpdate(s, st)