Mercurial > public > pacobot
diff socket/conn.go @ 8:e9df3bb010f4
fix issues
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Thu, 13 Mar 2025 17:41:42 +0000 |
parents | |
children | 5c124578fed2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/socket/conn.go Thu Mar 13 17:41:42 2025 +0000 @@ -0,0 +1,173 @@ +package socket + +import ( + "encoding/json" + "fmt" + "log" + "net/url" + "os" + "os/signal" + "strings" + "time" + + "github.com/denniscmcom/pacobot/bot" + "github.com/denniscmcom/pacobot/event" + "github.com/gorilla/websocket" +) + +func Connect(authToken string) { + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt) + + baseUrl := url.URL{Scheme: "wss", Host: "eventsub.wss.twitch.tv", Path: "/ws"} + + log.Println("socket: connecting...") + conn, _, err := websocket.DefaultDialer.Dial(baseUrl.String(), nil) + + if err != nil { + log.Fatal(err) + } + + defer conn.Close() + + log.Println("socket: connected") + + var timeout time.Ticker + done := make(chan bool) + + go readMsg(done, conn, &timeout, authToken) + + for { + select { + case <-interrupt: + closeConn(conn) + + select { + case <-done: + case <-time.After(time.Second): + } + return + case <-done: + log.Println("socket: connection closed by server") + Connect(authToken) + case <-timeout.C: + log.Println("socket: connection lost") + timeout.Stop() + Connect(authToken) + } + } +} + +func readMsg(done chan bool, conn *websocket.Conn, timeout *time.Ticker, authToken string) { + var timeout_secs time.Duration + + for { + log.Println("socket: waiting for msg...") + _, msg, err := conn.ReadMessage() + + if err != nil { + break + } + + var resMetadata Res_Metadata + + if err := json.Unmarshal(msg, &resMetadata); err != nil { + log.Fatal(err) + } + + msgType := resMetadata.Metadata.MsgType + log.Printf("socket: %s msg received", msgType) + + switch msgType { + case "session_welcome": + var resWelcome Res_Welcome + + if err := json.Unmarshal(msg, &resWelcome); err != nil { + log.Fatal(err) + } + + timeout_secs = time.Duration(resWelcome.Payload.Session.KeepaliveTimeout+3) * time.Second + timeout = time.NewTicker(timeout_secs) + defer timeout.Stop() + + event.ChannelChatMsgSub(authToken, resWelcome.Payload.Session.Id) + + case "session_keepalive": + timeout.Reset(timeout_secs) + log.Println("socket: timeout resetted") + + case "notification": + var resMetadataNotif Res_Metadata_Notif + + if err := json.Unmarshal(msg, &resMetadataNotif); err != nil { + log.Fatal(err) + } + + subType := resMetadataNotif.Metadata.SubType + log.Printf("socket: %s event received", subType) + + switch subType { + case "channel.chat.message": + var resNotifChannelChatMsg Res_Notif_ChannelChatMsg + + if err := json.Unmarshal(msg, &resNotifChannelChatMsg); err != nil { + log.Fatal(err) + } + + // TODO: Add to a function + jsonFormatted, err := json.MarshalIndent(resNotifChannelChatMsg, "", " ") + + if err != nil { + log.Fatalf("socket: error al formatear") + } + + // log.Println(resNotifChannelChatMsg.Payload.Event) + fmt.Print(string(jsonFormatted)) + + chatMsg := resNotifChannelChatMsg.Payload.Event.Msg.Text + log.Println(chatMsg) + + if strings.HasPrefix(chatMsg, "!") { + bot.HandleCmd(strings.Split(chatMsg[1:], " ")) + } + } + default: + log.Fatalf("%s: message type not implemented", msgType) + } + } + + done <- true +} + +func closeConn(conn *websocket.Conn) { + err := conn.WriteMessage( + websocket.CloseMessage, + websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) + + if err != nil { + log.Fatal(err) + } + + log.Println("socket: connection closed") +} + +// func test() { +// var res Response + +// // Deserializas +// err := json.Unmarshal([]byte(jsonData), &res) + +// if err != nil { +// fmt.Println("Error al deserializar:", err) +// return +// } + +// // Conviertes la estructura nuevamente a JSON formateado + +// formattedJSON, err := json.MarshalIndent(res, "", " ") + +// if err != nil { +// fmt.Println("Error al formatear JSON:", err) +// return +// } +// }