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: