annotate socket/conn.go @ 10:5c124578fed2

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