Merge pull request #38 from iopred/develop

Implement GuildBanAdd/Remove events, closes #24.  Refactor websock event func to remove some redundant code.
This commit is contained in:
Bruce 2016-01-01 15:53:43 -06:00
commit f14a62ded2
2 changed files with 87 additions and 128 deletions

View file

@ -53,6 +53,8 @@ type Session struct {
OnGuildRoleUpdate func(*Session, GuildRole) OnGuildRoleUpdate func(*Session, GuildRole)
OnGuildRoleDelete func(*Session, GuildRoleDelete) OnGuildRoleDelete func(*Session, GuildRoleDelete)
OnGuildIntegrationsUpdate func(*Session, GuildIntegrationsUpdate) OnGuildIntegrationsUpdate func(*Session, GuildIntegrationsUpdate)
OnGuildBanAdd func(*Session, GuildBan)
OnGuildBanRemove func(*Session, GuildBan)
OnUserSettingsUpdate func(*Session, map[string]interface{}) // TODO: Find better way? OnUserSettingsUpdate func(*Session, map[string]interface{}) // TODO: Find better way?
// Exposed but should not be modified by User. // Exposed but should not be modified by User.
@ -340,3 +342,9 @@ type GuildRoleDelete struct {
RoleID string `json:"role_id"` RoleID string `json:"role_id"`
GuildID string `json:"guild_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"`
}

207
wsapi.go
View file

@ -123,6 +123,14 @@ func (s *Session) Close() {
s.wsConn.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
}
// Front line handler for all Websocket Events. Determines the // Front line handler for all Websocket Events. Determines the
// event type and passes the message along to the next handler. // event type and passes the message along to the next handler.
@ -135,79 +143,61 @@ func (s *Session) event(messageType int, message []byte) (err error) {
} }
var e Event var e Event
if err := json.Unmarshal(message, &e); err != nil { if err = json.Unmarshal(message, &e); err != nil {
fmt.Println(err) fmt.Println(err)
return err return
} }
switch e.Type { switch e.Type {
case "READY": case "READY":
var st Ready var st Ready
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) if s.OnReady != nil {
printJSON(e.RawData) // TODO: Better error logging s.OnReady(s, st)
return err }
go s.Heartbeat(st.HeartbeatInterval)
} }
if s.OnReady != nil { return
s.OnReady(s, st)
return
}
go s.Heartbeat(st.HeartbeatInterval)
case "VOICE_SERVER_UPDATE": case "VOICE_SERVER_UPDATE":
// TEMP CODE FOR TESTING VOICE // TEMP CODE FOR TESTING VOICE
var st VoiceServerUpdate var st VoiceServerUpdate
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.onVoiceServerUpdate(st)
printJSON(e.RawData) // TODO: Better error logging
return err
} }
s.onVoiceServerUpdate(st)
return return
case "VOICE_STATE_UPDATE": case "VOICE_STATE_UPDATE":
// TEMP CODE FOR TESTING VOICE // TEMP CODE FOR TESTING VOICE
var st VoiceState var st VoiceState
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.onVoiceStateUpdate(st)
printJSON(e.RawData) // TODO: Better error logging
return err
} }
s.onVoiceStateUpdate(st)
return return
case "USER_UPDATE": case "USER_UPDATE":
if s.OnUserUpdate != nil { if s.OnUserUpdate != nil {
var st User var st User
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnUserUpdate(s, st)
printJSON(e.RawData) // TODO: Better error logging
return err
} }
s.OnUserUpdate(s, st)
return return
} }
case "PRESENCE_UPDATE": case "PRESENCE_UPDATE":
if s.OnPresenceUpdate != nil { if s.OnPresenceUpdate != nil {
var st PresenceUpdate var st PresenceUpdate
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnPresenceUpdate(s, st)
printJSON(e.RawData) // TODO: Better error logging
return err
} }
s.OnPresenceUpdate(s, st)
return return
} }
case "TYPING_START": case "TYPING_START":
if s.OnTypingStart != nil { if s.OnTypingStart != nil {
var st TypingStart var st TypingStart
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnTypingStart(s, st)
printJSON(e.RawData) // TODO: Better error logging
return err
} }
s.OnTypingStart(s, st)
return 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": case "MESSAGE_ACK":
if s.OnMessageAck != nil { if s.OnMessageAck != nil {
} }
@ -215,200 +205,161 @@ func (s *Session) event(messageType int, message []byte) (err error) {
case "MESSAGE_CREATE": case "MESSAGE_CREATE":
if s.OnMessageCreate != nil { if s.OnMessageCreate != nil {
var st Message var st Message
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnMessageCreate(s, st)
printJSON(e.RawData) // TODO: Better error logging
return err
} }
s.OnMessageCreate(s, st)
return return
} }
case "MESSAGE_UPDATE": case "MESSAGE_UPDATE":
if s.OnMessageUpdate != nil { if s.OnMessageUpdate != nil {
var st Message var st Message
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnMessageUpdate(s, st)
printJSON(e.RawData) // TODO: Better error logging
return err
} }
s.OnMessageUpdate(s, st)
return return
} }
case "MESSAGE_DELETE": case "MESSAGE_DELETE":
if s.OnMessageDelete != nil { if s.OnMessageDelete != nil {
var st MessageDelete var st MessageDelete
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnMessageDelete(s, st)
printJSON(e.RawData) // TODO: Better error logging
return err
} }
s.OnMessageDelete(s, st)
return return
} }
case "MESSAGE_ACK": case "MESSAGE_ACK":
if s.OnMessageAck != nil { if s.OnMessageAck != nil {
var st MessageAck var st MessageAck
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnMessageAck(s, st)
printJSON(e.RawData) // TODO: Better error logging
return err
} }
s.OnMessageAck(s, st)
return return
} }
case "CHANNEL_CREATE": case "CHANNEL_CREATE":
if s.OnChannelCreate != nil { if s.OnChannelCreate != nil {
var st Channel var st Channel
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnChannelCreate(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnChannelCreate(s, st)
return return
} }
case "CHANNEL_UPDATE": case "CHANNEL_UPDATE":
if s.OnChannelUpdate != nil { if s.OnChannelUpdate != nil {
var st Channel var st Channel
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnChannelUpdate(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnChannelUpdate(s, st)
return return
} }
case "CHANNEL_DELETE": case "CHANNEL_DELETE":
if s.OnChannelDelete != nil { if s.OnChannelDelete != nil {
var st Channel var st Channel
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnChannelDelete(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnChannelDelete(s, st)
return return
} }
case "GUILD_CREATE": case "GUILD_CREATE":
if s.OnGuildCreate != nil { if s.OnGuildCreate != nil {
var st Guild var st Guild
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnGuildCreate(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnGuildCreate(s, st)
return return
} }
case "GUILD_UPDATE": case "GUILD_UPDATE":
if s.OnGuildCreate != nil { if s.OnGuildCreate != nil {
var st Guild var st Guild
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnGuildUpdate(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnGuildUpdate(s, st)
return return
} }
case "GUILD_DELETE": case "GUILD_DELETE":
if s.OnGuildDelete != nil { if s.OnGuildDelete != nil {
var st Guild var st Guild
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnGuildDelete(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnGuildDelete(s, st)
return return
} }
case "GUILD_MEMBER_ADD": case "GUILD_MEMBER_ADD":
if s.OnGuildMemberAdd != nil { if s.OnGuildMemberAdd != nil {
var st Member var st Member
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnGuildMemberAdd(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnGuildMemberAdd(s, st)
return return
} }
case "GUILD_MEMBER_REMOVE": case "GUILD_MEMBER_REMOVE":
if s.OnGuildMemberRemove != nil { if s.OnGuildMemberRemove != nil {
var st Member var st Member
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnGuildMemberRemove(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnGuildMemberRemove(s, st)
return return
} }
case "GUILD_MEMBER_UPDATE": case "GUILD_MEMBER_UPDATE":
if s.OnGuildMemberUpdate != nil { if s.OnGuildMemberUpdate != nil {
var st Member var st Member
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnGuildMemberUpdate(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnGuildMemberUpdate(s, st)
return return
} }
case "GUILD_ROLE_CREATE": case "GUILD_ROLE_CREATE":
if s.OnGuildRoleCreate != nil { if s.OnGuildRoleCreate != nil {
var st GuildRole var st GuildRole
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnGuildRoleCreate(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnGuildRoleCreate(s, st)
return return
} }
case "GUILD_ROLE_UPDATE": case "GUILD_ROLE_UPDATE":
if s.OnGuildRoleUpdate != nil { if s.OnGuildRoleUpdate != nil {
var st GuildRole var st GuildRole
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnGuildRoleUpdate(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnGuildRoleUpdate(s, st)
return return
} }
case "GUILD_ROLE_DELETE": case "GUILD_ROLE_DELETE":
if s.OnGuildRoleDelete != nil { if s.OnGuildRoleDelete != nil {
var st GuildRoleDelete var st GuildRoleDelete
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnGuildRoleDelete(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnGuildRoleDelete(s, st)
return return
} }
case "GUILD_INTEGRATIONS_UPDATE": case "GUILD_INTEGRATIONS_UPDATE":
if s.OnGuildIntegrationsUpdate != nil { if s.OnGuildIntegrationsUpdate != nil {
var st GuildIntegrationsUpdate var st GuildIntegrationsUpdate
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnGuildIntegrationsUpdate(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg }
return err 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 return
} }
case "USER_SETTINGS_UPDATE": case "USER_SETTINGS_UPDATE":
if s.OnUserSettingsUpdate != nil { if s.OnUserSettingsUpdate != nil {
var st map[string]interface{} var st map[string]interface{}
if err := json.Unmarshal(e.RawData, &st); err != nil { if err = unmarshalEvent(e, &st); err == nil {
fmt.Println(e.Type, err) s.OnUserSettingsUpdate(s, st)
printJSON(e.RawData) // TODO: Better error logginEventg
return err
} }
s.OnUserSettingsUpdate(s, st)
return return
} }
default: default: