annotate socket/conn.go @ 12:aaf85ae1f942

add very simple html template
author Dennis C. M. <dennis@denniscm.com>
date Thu, 20 Mar 2025 11:12:21 +0000
parents 6d91c612310a
children
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
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
72 var metadataMsg MetadataMsg
8
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
73
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
74 if err := json.Unmarshal(msg, &metadataMsg); err != nil {
8
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
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
78 msgType := metadataMsg.Metadata.MsgType
8
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":
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
83 var welcomeMsg WelcomeMsg
8
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
84
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
85 if err := json.Unmarshal(msg, &welcomeMsg); err != nil {
8
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
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
89 timeout_secs = time.Duration(welcomeMsg.Payload.Session.KeepaliveTimeoutSecs+3) * time.Second
8
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
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
93 event.SubChannelChatMsg(authToken, welcomeMsg.Payload.Session.Id)
8
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":
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
100 var metadataEvent MetadataEvent
8
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
101
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
102 if err := json.Unmarshal(msg, &metadataEvent); err != nil {
8
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
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
106 subType := metadataEvent.Metadata.SubType
8
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":
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
111 var channelChatMsgEvent ChannelChatMsgEvent
8
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
112
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
113 if err := json.Unmarshal(msg, &channelChatMsgEvent); err != nil {
8
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
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
117 chatMsg := channelChatMsgEvent.Payload.Event.Msg.Text
8
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, "!") {
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
120 if channelChatMsgEvent.Payload.Event.ChatterUserName == "denniscmartin" {
11
6d91c612310a add some permissions
Dennis C. M. <dennis@denniscm.com>
parents: 10
diff changeset
121 go bot.HandleCmd(strings.Split(chatMsg[1:], " "))
6d91c612310a add some permissions
Dennis C. M. <dennis@denniscm.com>
parents: 10
diff changeset
122 }
8
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
123 }
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
124 }
12
aaf85ae1f942 add very simple html template
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
125
8
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
126 default:
10
5c124578fed2 fix timer bug
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
127 log.Fatalf("socket: %s message type not implemented", msgType)
8
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 }
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
130 }
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
131
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
132 func closeConn(conn *websocket.Conn) {
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
133 err := conn.WriteMessage(
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
134 websocket.CloseMessage,
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
135 websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
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 if err != nil {
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
138 log.Fatal(err)
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 log.Println("socket: connection closed")
e9df3bb010f4 fix issues
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
142 }