diff --git a/client.go b/client.go index e685555..5154ae9 100644 --- a/client.go +++ b/client.go @@ -34,6 +34,9 @@ type Client struct { OnChannelStopTypingFunctions []func(channel_id, user_id string) OnServerUpdateFunctions []func(server_id, clear string, payload map[string]interface{}) OnServerDeleteFunctions []func(server_id string) + OnServerMemberUpdateFunctions []func(server_id, clear string, payload map[string]interface{}) + OnServerMemberJoinFunctions []func(server_id, user_id string) + OnServerMemberLeaveFunctions []func(server_id, user_id string) } // Self bot struct. @@ -105,6 +108,21 @@ func (c *Client) OnServerDelete(fn func(server_id string)) { c.OnServerDeleteFunctions = append(c.OnServerDeleteFunctions, fn) } +// On server member update will run when a server member updates. +func (c *Client) OnServerMemberUpdate(fn func(server_id, clear string, payload map[string]interface{})) { + c.OnServerMemberUpdateFunctions = append(c.OnServerMemberUpdateFunctions, fn) +} + +// On server member join will run when someone joins to the server. +func (c *Client) OnServerMemberJoin(fn func(server_id string, user_id string)) { + c.OnServerMemberJoinFunctions = append(c.OnServerMemberJoinFunctions, fn) +} + +// On server member leave will run when someone left from server. +func (c *Client) OnServerMemberLeave(fn func(server_id string, user_id string)) { + c.OnServerMemberLeaveFunctions = append(c.OnServerMemberLeaveFunctions, fn) +} + // Fetch a channel by Id. func (c *Client) FetchChannel(id string) (*Channel, error) { channel := &Channel{} diff --git a/websocket.go b/websocket.go index 8405298..2a28455 100644 --- a/websocket.go +++ b/websocket.go @@ -88,14 +88,14 @@ func (c *Client) handleEvents(rawData *struct { } else if rawData.Type == "Message" && c.OnMessageFunctions != nil { // Message Event msgData := &Message{} + msgData.Client = c + err := json.Unmarshal([]byte(message), msgData) if err != nil { fmt.Printf("Unexcepted Error: %s", err) } - msgData.Client = c - for _, i := range c.OnMessageFunctions { i(msgData) } @@ -118,10 +118,7 @@ func (c *Client) handleEvents(rawData *struct { } } else if rawData.Type == "MessageDelete" && c.OnMessageDeleteFunctions != nil { // Message Delete Event - data := &struct { - ChannelId string `json:"channel"` - MessageId string `json:"id"` - }{} + data := &map[string]string{} err := json.Unmarshal([]byte(message), data) @@ -130,11 +127,12 @@ func (c *Client) handleEvents(rawData *struct { } for _, i := range c.OnMessageDeleteFunctions { - i(data.ChannelId, data.MessageId) + i((*data)["channel"], (*data)["id"]) } } else if rawData.Type == "ChannelCreate" && c.OnChannelCreateFunctions != nil { // Channel create event. channelData := &Channel{} + channelData.Client = c err := json.Unmarshal([]byte(message), channelData) @@ -142,8 +140,6 @@ func (c *Client) handleEvents(rawData *struct { fmt.Printf("Unexcepted Error: %s", err) } - channelData.Client = c - for _, i := range c.OnChannelCreateFunctions { i(channelData) } @@ -166,9 +162,7 @@ func (c *Client) handleEvents(rawData *struct { } } else if rawData.Type == "ChannelDelete" && c.OnChannelDeleteFunctions != nil { // Channel delete event. - data := &struct { - ChannelId string `json:"id"` - }{} + data := &map[string]string{} err := json.Unmarshal([]byte(message), data) @@ -177,14 +171,11 @@ func (c *Client) handleEvents(rawData *struct { } for _, i := range c.OnChannelDeleteFunctions { - i(data.ChannelId) + i((*data)["id"]) } } else if rawData.Type == "ChannelStartTyping" && c.OnChannelStartTypingFunctions != nil { // Channel start typing event. - data := &struct { - ChannelId string `json:"id"` - UserId string `json:"user"` - }{} + data := &map[string]string{} err := json.Unmarshal([]byte(message), data) @@ -193,14 +184,11 @@ func (c *Client) handleEvents(rawData *struct { } for _, i := range c.OnChannelStartTypingFunctions { - i(data.ChannelId, data.UserId) + i((*data)["id"], (*data)["user"]) } } else if rawData.Type == "ChannelStopTyping" && c.OnChannelStopTypingFunctions != nil { // Channel stop typing event. - data := &struct { - ChannelId string `json:"id"` - UserId string `json:"user"` - }{} + data := &map[string]string{} err := json.Unmarshal([]byte(message), data) @@ -209,7 +197,7 @@ func (c *Client) handleEvents(rawData *struct { } for _, i := range c.OnChannelStopTypingFunctions { - i(data.ChannelId, data.UserId) + i((*data)["id"], (*data)["user"]) } } else if rawData.Type == "ServerUpdate" && c.OnServerUpdateFunctions != nil { // Server update event. @@ -230,9 +218,7 @@ func (c *Client) handleEvents(rawData *struct { } } else if rawData.Type == "ServerDelete" && c.OnServerDeleteFunctions != nil { // Server delete event. - data := &struct { - ServerId string `json:"id"` - }{} + data := &map[string]string{} err := json.Unmarshal([]byte(message), data) @@ -241,7 +227,50 @@ func (c *Client) handleEvents(rawData *struct { } for _, i := range c.OnServerDeleteFunctions { - i(data.ServerId) + i((*data)["id"]) + } + } else if rawData.Type == "ServerMemberUpdate" && c.OnServerMemberUpdateFunctions != nil { + // Member update event. + data := &struct { + ServerId string `json:"id"` + Clear string `json:"clear"` + Payload map[string]interface{} `json:"data"` + }{} + + err := json.Unmarshal([]byte(message), data) + + if err != nil { + fmt.Printf("Unexcepted Error: %s", err) + } + + for _, i := range c.OnServerMemberUpdateFunctions { + i(data.ServerId, data.Clear, data.Payload) + } + } else if rawData.Type == "ServerMemberJoin" && c.OnServerMemberJoinFunctions != nil { + // Member join event. + data := &map[string]string{} + + err := json.Unmarshal([]byte(message), data) + + if err != nil { + fmt.Printf("Unexcepted Error: %s", err) + } + + for _, i := range c.OnServerMemberJoinFunctions { + i((*data)["id"], (*data)["user"]) + } + } else if rawData.Type == "ServerMemberLeave" && c.OnServerMemberLeaveFunctions != nil { + // Member left event. + data := &map[string]string{} + + err := json.Unmarshal([]byte(message), data) + + if err != nil { + fmt.Printf("Unexcepted Error: %s", err) + } + + for _, i := range c.OnServerMemberLeaveFunctions { + i((*data)["id"], (*data)["user"]) } } else { // Unknown event.