Mercurial > public > pacobot
comparison cmd/socket.go @ 6:4deabe76bd7f
cmd: add CMD package
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Wed, 12 Mar 2025 14:13:24 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
5:8cf3011fc949 | 6:4deabe76bd7f |
---|---|
1 package cmd | |
2 | |
3 import ( | |
4 "encoding/json" | |
5 "log" | |
6 "net/url" | |
7 "os" | |
8 "os/signal" | |
9 "time" | |
10 | |
11 "github.com/gorilla/websocket" | |
12 ) | |
13 | |
14 type MetadataRes struct { | |
15 Metadata struct { | |
16 MsgType string `json:"message_type"` | |
17 SubType string `json:"subscription_type"` | |
18 } `json:"metadata"` | |
19 } | |
20 | |
21 type WelcomeMsgPayload struct { | |
22 Payload struct { | |
23 Session struct { | |
24 Id string `json:"id"` | |
25 } `json:"session"` | |
26 } `json:"payload"` | |
27 } | |
28 | |
29 func ConnSocket(authToken string) { | |
30 interrupt := make(chan os.Signal, 1) | |
31 signal.Notify(interrupt, os.Interrupt) | |
32 | |
33 baseUrl := url.URL{Scheme: "wss", Host: "eventsub.wss.twitch.tv", Path: "/ws"} | |
34 | |
35 conn, _, err := websocket.DefaultDialer.Dial(baseUrl.String(), nil) | |
36 | |
37 if err != nil { | |
38 log.Fatal(err) | |
39 } | |
40 | |
41 defer conn.Close() | |
42 | |
43 done := make(chan struct{}) | |
44 | |
45 ticker := time.NewTicker(time.Second * 15) | |
46 defer ticker.Stop() | |
47 | |
48 go func() { | |
49 defer close(done) | |
50 | |
51 for { | |
52 _, msg, err := conn.ReadMessage() | |
53 | |
54 if err != nil { | |
55 log.Fatal(err) | |
56 } | |
57 | |
58 var metadataRes MetadataRes | |
59 | |
60 if err := json.Unmarshal(msg, &metadataRes); err != nil { | |
61 log.Fatal(err) | |
62 } | |
63 | |
64 switch msgType := metadataRes.Metadata.MsgType; msgType { | |
65 case "session_welcome": | |
66 var welcomeMsgRes WelcomeMsgPayload | |
67 | |
68 if err := json.Unmarshal(msg, &welcomeMsgRes); err != nil { | |
69 log.Fatal(err) | |
70 } | |
71 | |
72 ChannelChatMsgSub(authToken, welcomeMsgRes.Payload.Session.Id) | |
73 case "session_keepalive": | |
74 ticker.Reset(time.Second * 15) | |
75 case "notification": | |
76 switch subType := metadataRes.Metadata.SubType; subType { | |
77 case "channel.chat.message": | |
78 var channelChatMsgSubPayload ChannelChatMsgSubPayload | |
79 | |
80 if err := json.Unmarshal(msg, &channelChatMsgSubPayload); err != nil { | |
81 log.Fatal(err) | |
82 } | |
83 | |
84 log.Println(string(msg)) | |
85 log.Println(channelChatMsgSubPayload.Payload.Event.Msg.Text) | |
86 | |
87 } | |
88 default: | |
89 log.Fatalf("%s: message type not implemented", msgType) | |
90 } | |
91 | |
92 } | |
93 }() | |
94 | |
95 for { | |
96 select { | |
97 case <-done: | |
98 return | |
99 case <-interrupt: | |
100 err := conn.WriteMessage( | |
101 websocket.CloseMessage, | |
102 websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) | |
103 | |
104 if err != nil { | |
105 log.Fatal(err) | |
106 } | |
107 | |
108 select { | |
109 case <-done: | |
110 case <-time.After(time.Second): | |
111 } | |
112 return | |
113 case <-ticker.C: | |
114 // TODO: Replace this with logic to reconnect | |
115 log.Fatal("connection closed: timeout") | |
116 } | |
117 } | |
118 } |