package revoltgo import ( "encoding/json" "fmt" "net/http" "time" "github.com/sacOO7/gowebsocket" ) func (c *Client) Start() { // Create new socket c.Socket = gowebsocket.New(WS_URL) c.HTTP = &http.Client{} // Auth the user if self-bot. // if c.SelfBot != nil { // c.Auth() // } // Send auth when connected c.Socket.OnConnected = func(_ gowebsocket.Socket) { c.handleWebsocketAuth() } c.Socket.OnTextMessage = func(message string, _ gowebsocket.Socket) { // Parse data rawData := &struct { Type string `json:"type"` }{} err := json.Unmarshal([]byte(message), rawData) if err != nil { c.Destroy() panic(err) } if rawData.Type == "Authenticated" { go c.ping() } // Handle events c.handleEvents(rawData, message) // fmt.Println(message) } // Start connection c.Socket.Connect() } // Handle on connected. func (c *Client) handleWebsocketAuth() { if c.SelfBot == nil { c.Socket.SendText(fmt.Sprintf("{\"type\":\"Authenticate\",\"token\":\"%s\"}", c.Token)) } else { c.Socket.SendText(fmt.Sprintf("{\"type\":\"Authenticate\",\"id\":\"%s\",\"session_token\":\"%s\",\"user_id\":\"%s\"}", c.SelfBot.Id, c.SelfBot.SessionToken, c.SelfBot.UserId)) } } // Destroy the websocket. func (c *Client) Destroy() { c.Socket.Close() } // Ping websocket. func (c *Client) ping() { for { time.Sleep(30 * time.Second) c.Socket.SendText(fmt.Sprintf("{\"type\":\"Ping\",\"time\":%d}", time.Now().Unix())) } } // Handle events. func (c *Client) handleEvents(rawData *struct { Type string `json:"type"` }, message string) { if rawData.Type == "Ready" { // Add cache c.handleCache(message) // Ready Event if c.OnReadyFunctions != nil { for _, i := range c.OnReadyFunctions { i() } } } 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) } for _, i := range c.OnMessageFunctions { i(msgData) } } else if rawData.Type == "MessageUpdate" && c.OnMessageUpdateFunctions != nil { // Message Update Event data := &struct { ChannelId string `json:"channel"` MessageId string `json:"id"` 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.OnMessageUpdateFunctions { i(data.ChannelId, data.MessageId, data.Payload) } } else if rawData.Type == "MessageDelete" && c.OnMessageDeleteFunctions != nil { // Message Delete Event data := &map[string]string{} err := json.Unmarshal([]byte(message), data) if err != nil { fmt.Printf("Unexcepted Error: %s", err) } for _, i := range c.OnMessageDeleteFunctions { 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) if err != nil { fmt.Printf("Unexcepted Error: %s", err) } for _, i := range c.OnChannelCreateFunctions { i(channelData) } } else if rawData.Type == "ChannelUpdate" && c.OnChannelUpdateFunctions != nil { // Channel update event. data := &struct { ChannelId 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.OnChannelUpdateFunctions { i(data.ChannelId, data.Clear, data.Payload) } } else if rawData.Type == "ChannelDelete" && c.OnChannelDeleteFunctions != nil { // Channel delete event. data := &map[string]string{} err := json.Unmarshal([]byte(message), data) if err != nil { fmt.Printf("Unexcepted Error: %s", err) } for _, i := range c.OnChannelDeleteFunctions { i((*data)["id"]) } } else if rawData.Type == "ChannelStartTyping" && c.OnChannelStartTypingFunctions != nil { // Channel start typing event. data := &map[string]string{} err := json.Unmarshal([]byte(message), data) if err != nil { fmt.Printf("Unexcepted Error: %s", err) } for _, i := range c.OnChannelStartTypingFunctions { i((*data)["id"], (*data)["user"]) } } else if rawData.Type == "ChannelStopTyping" && c.OnChannelStopTypingFunctions != nil { // Channel stop typing event. data := &map[string]string{} err := json.Unmarshal([]byte(message), data) if err != nil { fmt.Printf("Unexcepted Error: %s", err) } for _, i := range c.OnChannelStopTypingFunctions { i((*data)["id"], (*data)["user"]) } } else if rawData.Type == "ServerUpdate" && c.OnServerUpdateFunctions != nil { // Server 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.OnServerUpdateFunctions { i(data.ServerId, data.Clear, data.Payload) } } else if rawData.Type == "ServerDelete" && c.OnServerDeleteFunctions != nil { // Server delete event. data := &map[string]string{} err := json.Unmarshal([]byte(message), data) if err != nil { fmt.Printf("Unexcepted Error: %s", err) } for _, i := range c.OnServerDeleteFunctions { 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. if c.OnUnknownEventFunctions != nil { for _, i := range c.OnUnknownEventFunctions { i(message) } } } } func (c *Client) handleCache(data string) { cache := &Cache{} err := json.Unmarshal([]byte(data), cache) if err != nil { fmt.Printf("Unexcepted Error: %s", err) } // Add client to users. for _, i := range cache.Users { i.Client = c } for _, i := range cache.Servers { i.Client = c } for _, i := range cache.Channels { i.Client = c } c.Cache = cache }