comparison 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
comparison
equal deleted inserted replaced
7:a8aab75f68c9 8:e9df3bb010f4
1 package socket
2
3 import (
4 "encoding/json"
5 "fmt"
6 "log"
7 "net/url"
8 "os"
9 "os/signal"
10 "strings"
11 "time"
12
13 "github.com/denniscmcom/pacobot/bot"
14 "github.com/denniscmcom/pacobot/event"
15 "github.com/gorilla/websocket"
16 )
17
18 func Connect(authToken string) {
19 interrupt := make(chan os.Signal, 1)
20 signal.Notify(interrupt, os.Interrupt)
21
22 baseUrl := url.URL{Scheme: "wss", Host: "eventsub.wss.twitch.tv", Path: "/ws"}
23
24 log.Println("socket: connecting...")
25 conn, _, err := websocket.DefaultDialer.Dial(baseUrl.String(), nil)
26
27 if err != nil {
28 log.Fatal(err)
29 }
30
31 defer conn.Close()
32
33 log.Println("socket: connected")
34
35 var timeout time.Ticker
36 done := make(chan bool)
37
38 go readMsg(done, conn, &timeout, authToken)
39
40 for {
41 select {
42 case <-interrupt:
43 closeConn(conn)
44
45 select {
46 case <-done:
47 case <-time.After(time.Second):
48 }
49 return
50 case <-done:
51 log.Println("socket: connection closed by server")
52 Connect(authToken)
53 case <-timeout.C:
54 log.Println("socket: connection lost")
55 timeout.Stop()
56 Connect(authToken)
57 }
58 }
59 }
60
61 func readMsg(done chan bool, conn *websocket.Conn, timeout *time.Ticker, authToken string) {
62 var timeout_secs time.Duration
63
64 for {
65 log.Println("socket: waiting for msg...")
66 _, msg, err := conn.ReadMessage()
67
68 if err != nil {
69 break
70 }
71
72 var resMetadata Res_Metadata
73
74 if err := json.Unmarshal(msg, &resMetadata); err != nil {
75 log.Fatal(err)
76 }
77
78 msgType := resMetadata.Metadata.MsgType
79 log.Printf("socket: %s msg received", msgType)
80
81 switch msgType {
82 case "session_welcome":
83 var resWelcome Res_Welcome
84
85 if err := json.Unmarshal(msg, &resWelcome); err != nil {
86 log.Fatal(err)
87 }
88
89 timeout_secs = time.Duration(resWelcome.Payload.Session.KeepaliveTimeout+3) * time.Second
90 timeout = time.NewTicker(timeout_secs)
91 defer timeout.Stop()
92
93 event.ChannelChatMsgSub(authToken, resWelcome.Payload.Session.Id)
94
95 case "session_keepalive":
96 timeout.Reset(timeout_secs)
97 log.Println("socket: timeout resetted")
98
99 case "notification":
100 var resMetadataNotif Res_Metadata_Notif
101
102 if err := json.Unmarshal(msg, &resMetadataNotif); err != nil {
103 log.Fatal(err)
104 }
105
106 subType := resMetadataNotif.Metadata.SubType
107 log.Printf("socket: %s event received", subType)
108
109 switch subType {
110 case "channel.chat.message":
111 var resNotifChannelChatMsg Res_Notif_ChannelChatMsg
112
113 if err := json.Unmarshal(msg, &resNotifChannelChatMsg); err != nil {
114 log.Fatal(err)
115 }
116
117 // TODO: Add to a function
118 jsonFormatted, err := json.MarshalIndent(resNotifChannelChatMsg, "", " ")
119
120 if err != nil {
121 log.Fatalf("socket: error al formatear")
122 }
123
124 // log.Println(resNotifChannelChatMsg.Payload.Event)
125 fmt.Print(string(jsonFormatted))
126
127 chatMsg := resNotifChannelChatMsg.Payload.Event.Msg.Text
128 log.Println(chatMsg)
129
130 if strings.HasPrefix(chatMsg, "!") {
131 bot.HandleCmd(strings.Split(chatMsg[1:], " "))
132 }
133 }
134 default:
135 log.Fatalf("%s: message type not implemented", msgType)
136 }
137 }
138
139 done <- true
140 }
141
142 func closeConn(conn *websocket.Conn) {
143 err := conn.WriteMessage(
144 websocket.CloseMessage,
145 websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
146
147 if err != nil {
148 log.Fatal(err)
149 }
150
151 log.Println("socket: connection closed")
152 }
153
154 // func test() {
155 // var res Response
156
157 // // Deserializas
158 // err := json.Unmarshal([]byte(jsonData), &res)
159
160 // if err != nil {
161 // fmt.Println("Error al deserializar:", err)
162 // return
163 // }
164
165 // // Conviertes la estructura nuevamente a JSON formateado
166
167 // formattedJSON, err := json.MarshalIndent(res, "", " ")
168
169 // if err != nil {
170 // fmt.Println("Error al formatear JSON:", err)
171 // return
172 // }
173 // }