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 }