From f1fc2f09961ded71eba299e39677ec426d93b617 Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Thu, 31 Dec 2015 12:33:46 -0800 Subject: [PATCH 1/4] Add GuildBan handling in wsapi. Closes #24. Also refactor event handling so error logging is unified. --- structs.go | 8 +++ wsapi.go | 199 ++++++++++++++++++++--------------------------------- 2 files changed, 83 insertions(+), 124 deletions(-) diff --git a/structs.go b/structs.go index 3715c90..0795f49 100644 --- a/structs.go +++ b/structs.go @@ -53,6 +53,8 @@ type Session struct { OnGuildRoleUpdate func(*Session, GuildRole) OnGuildRoleDelete func(*Session, GuildRoleDelete) OnGuildIntegrationsUpdate func(*Session, GuildIntegrationsUpdate) + OnGuildBanAdd func(*Session, GuildBan) + OnGuildBanRemove func(*Session, GuildBan) OnUserSettingsUpdate func(*Session, map[string]interface{}) // TODO: Find better way? // Exposed but should not be modified by User. @@ -340,3 +342,9 @@ type GuildRoleDelete struct { RoleID string `json:"role_id"` GuildID string `json:"guild_id"` } + +// A GuildBan stores data for a guild ban. +type GuildBan struct { + User User `json:"user"` + GuildID string `json:"guild_id"` +} diff --git a/wsapi.go b/wsapi.go index 5e41657..0c2b86d 100644 --- a/wsapi.go +++ b/wsapi.go @@ -123,6 +123,14 @@ func (s *Session) Close() { s.wsConn.Close() } +func unmarshalEvent(event Event, i interface{}) (err error) { + if err = json.Unmarshal(event.RawData, i); err != nil { + fmt.Println(event.Type, err) + printJSON(event.RawData) // TODO: Better error loggingEvent. + } + return err +} + // Front line handler for all Websocket Events. Determines the // event type and passes the message along to the next handler. @@ -143,68 +151,50 @@ func (s *Session) event(messageType int, message []byte) (err error) { switch e.Type { case "READY": - var st Ready - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logging - return err - } if s.OnReady != nil { - s.OnReady(s, st) + var st Ready + if err = unmarshalEvent(e, &st); err == nil { + s.OnReady(s, st) + go s.Heartbeat(st.HeartbeatInterval) + } return } - go s.Heartbeat(st.HeartbeatInterval) case "VOICE_SERVER_UPDATE": // TEMP CODE FOR TESTING VOICE var st VoiceServerUpdate - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logging - return err + if err = unmarshalEvent(e, &st); err == nil { + s.onVoiceServerUpdate(st) } - s.onVoiceServerUpdate(st) return case "VOICE_STATE_UPDATE": // TEMP CODE FOR TESTING VOICE var st VoiceState - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logging - return err + if err = unmarshalEvent(e, &st); err == nil { + s.onVoiceStateUpdate(st) } - s.onVoiceStateUpdate(st) return case "USER_UPDATE": if s.OnUserUpdate != nil { var st User - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logging - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnUserUpdate(s, st) } - s.OnUserUpdate(s, st) return } case "PRESENCE_UPDATE": if s.OnPresenceUpdate != nil { var st PresenceUpdate - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logging - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnPresenceUpdate(s, st) } - s.OnPresenceUpdate(s, st) return } case "TYPING_START": if s.OnTypingStart != nil { var st TypingStart - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logging - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnTypingStart(s, st) } - s.OnTypingStart(s, st) return } /* // Never seen this come in but saw it in another Library. @@ -215,200 +205,161 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "MESSAGE_CREATE": if s.OnMessageCreate != nil { var st Message - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logging - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnMessageCreate(s, st) } - s.OnMessageCreate(s, st) return } case "MESSAGE_UPDATE": if s.OnMessageUpdate != nil { var st Message - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logging - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnMessageUpdate(s, st) } - s.OnMessageUpdate(s, st) return } case "MESSAGE_DELETE": if s.OnMessageDelete != nil { var st MessageDelete - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logging - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnMessageDelete(s, st) } - s.OnMessageDelete(s, st) return } case "MESSAGE_ACK": if s.OnMessageAck != nil { var st MessageAck - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logging - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnMessageAck(s, st) } - s.OnMessageAck(s, st) return } case "CHANNEL_CREATE": if s.OnChannelCreate != nil { var st Channel - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnChannelCreate(s, st) } - s.OnChannelCreate(s, st) return } case "CHANNEL_UPDATE": if s.OnChannelUpdate != nil { var st Channel - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnChannelUpdate(s, st) } - s.OnChannelUpdate(s, st) return } case "CHANNEL_DELETE": if s.OnChannelDelete != nil { var st Channel - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnChannelDelete(s, st) } - s.OnChannelDelete(s, st) return } case "GUILD_CREATE": if s.OnGuildCreate != nil { var st Guild - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildCreate(s, st) } - s.OnGuildCreate(s, st) return } case "GUILD_UPDATE": if s.OnGuildCreate != nil { var st Guild - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildUpdate(s, st) } - s.OnGuildUpdate(s, st) return } case "GUILD_DELETE": if s.OnGuildDelete != nil { var st Guild - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildDelete(s, st) } - s.OnGuildDelete(s, st) return } case "GUILD_MEMBER_ADD": if s.OnGuildMemberAdd != nil { var st Member - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildMemberAdd(s, st) } - s.OnGuildMemberAdd(s, st) return } case "GUILD_MEMBER_REMOVE": if s.OnGuildMemberRemove != nil { var st Member - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildMemberRemove(s, st) } - s.OnGuildMemberRemove(s, st) return } case "GUILD_MEMBER_UPDATE": if s.OnGuildMemberUpdate != nil { var st Member - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildMemberUpdate(s, st) } - s.OnGuildMemberUpdate(s, st) return } case "GUILD_ROLE_CREATE": if s.OnGuildRoleCreate != nil { var st GuildRole - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildRoleCreate(s, st) } - s.OnGuildRoleCreate(s, st) return } case "GUILD_ROLE_UPDATE": if s.OnGuildRoleUpdate != nil { var st GuildRole - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildRoleUpdate(s, st) } - s.OnGuildRoleUpdate(s, st) return } case "GUILD_ROLE_DELETE": if s.OnGuildRoleDelete != nil { var st GuildRoleDelete - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildRoleDelete(s, st) } - s.OnGuildRoleDelete(s, st) return } case "GUILD_INTEGRATIONS_UPDATE": if s.OnGuildIntegrationsUpdate != nil { var st GuildIntegrationsUpdate - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildIntegrationsUpdate(s, st) + } + return + } + case "GUILD_BAN_ADD": + if s.OnGuildBanAdd != nil { + var st GuildBan + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildBanAdd(s, st) + } + return + } + case "GUILD_BAN_REMOVE": + if s.OnGuildBanRemove != nil { + var st GuildBan + if err = unmarshalEvent(e, &st); err == nil { + s.OnGuildBanRemove(s, st) } - s.OnGuildIntegrationsUpdate(s, st) return } - case "USER_SETTINGS_UPDATE": if s.OnUserSettingsUpdate != nil { var st map[string]interface{} - if err := json.Unmarshal(e.RawData, &st); err != nil { - fmt.Println(e.Type, err) - printJSON(e.RawData) // TODO: Better error logginEventg - return err + if err = unmarshalEvent(e, &st); err == nil { + s.OnUserSettingsUpdate(s, st) } - s.OnUserSettingsUpdate(s, st) return } default: From 03379f7128a598be5770eb5ace068ed9a9d5bcbc Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Thu, 31 Dec 2015 12:40:36 -0800 Subject: [PATCH 2/4] Fix OnReady. --- wsapi.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/wsapi.go b/wsapi.go index 0c2b86d..2baaeab 100644 --- a/wsapi.go +++ b/wsapi.go @@ -151,14 +151,14 @@ func (s *Session) event(messageType int, message []byte) (err error) { switch e.Type { case "READY": - if s.OnReady != nil { - var st Ready - if err = unmarshalEvent(e, &st); err == nil { + var st Ready + if err = unmarshalEvent(e, &st); err == nil { + if s.OnReady != nil { s.OnReady(s, st) - go s.Heartbeat(st.HeartbeatInterval) } - return + go s.Heartbeat(st.HeartbeatInterval) } + return case "VOICE_SERVER_UPDATE": // TEMP CODE FOR TESTING VOICE var st VoiceServerUpdate @@ -197,7 +197,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { } return } - /* // Never seen this come in but saw it in another Library. + /* Never seen this come in but saw it in another Library. case "MESSAGE_ACK": if s.OnMessageAck != nil { } From 0e9b8b8714bfcf4bfbf54db3e9ec7a760deb4b8b Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Thu, 31 Dec 2015 12:44:02 -0800 Subject: [PATCH 3/4] Small cleanup for initial error handling. --- wsapi.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wsapi.go b/wsapi.go index 2baaeab..49f9867 100644 --- a/wsapi.go +++ b/wsapi.go @@ -143,9 +143,9 @@ func (s *Session) event(messageType int, message []byte) (err error) { } var e Event - if err := json.Unmarshal(message, &e); err != nil { + if err = json.Unmarshal(message, &e); err != nil { fmt.Println(err) - return err + return } switch e.Type { From 3aaa95d4f953de026404a8e05f91f70b1b4ebd98 Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Thu, 31 Dec 2015 12:46:35 -0800 Subject: [PATCH 4/4] Tiny cleanup :ok_hand: --- wsapi.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wsapi.go b/wsapi.go index 49f9867..2070df4 100644 --- a/wsapi.go +++ b/wsapi.go @@ -128,7 +128,7 @@ func unmarshalEvent(event Event, i interface{}) (err error) { fmt.Println(event.Type, err) printJSON(event.RawData) // TODO: Better error loggingEvent. } - return err + return } // Front line handler for all Websocket Events. Determines the