瀏覽代碼

Add GuildBan handling in wsapi. Closes #24.

Also refactor event handling so error logging is unified.
Chris Rhodes 9 年之前
父節點
當前提交
f1fc2f0996
共有 2 個文件被更改,包括 83 次插入124 次删除
  1. 8 0
      structs.go
  2. 75 124
      wsapi.go

+ 8 - 0
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"`
+}

+ 75 - 124
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: