Mercurial > public > pacobot
comparison cmd/auth.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 | a8aab75f68c9 |
comparison
equal
deleted
inserted
replaced
5:8cf3011fc949 | 6:4deabe76bd7f |
---|---|
1 package cmd | |
2 | |
3 import ( | |
4 "bytes" | |
5 "encoding/json" | |
6 "io" | |
7 "log" | |
8 "net/http" | |
9 "net/url" | |
10 ) | |
11 | |
12 // TODO: Change unmarshall to JSON DECODE | |
13 | |
14 func GetAuthUrl() string { | |
15 config := readConfig() | |
16 | |
17 baseUrl := &url.URL{ | |
18 Scheme: "https", | |
19 Host: "id.twitch.tv", | |
20 Path: "/oauth2/authorize", | |
21 } | |
22 | |
23 params := url.Values{} | |
24 params.Add("client_id", config.ClientId) | |
25 params.Add("force_verify", "true") | |
26 params.Add("redirect_uri", "http://localhost:8080/twitch-auth-code-callback") | |
27 params.Add("response_type", "code") | |
28 params.Add("scope", "channel:bot user:read:chat") | |
29 params.Add("state", "c3ab8aa609ea11e793ae92361f002671") | |
30 | |
31 baseUrl.RawQuery = params.Encode() | |
32 | |
33 return baseUrl.String() | |
34 } | |
35 | |
36 type AuthRes struct { | |
37 AccessToken string `json:"access_token"` | |
38 RefreshToken string `json:"refresh_token"` | |
39 Scope []string `json:"scope"` | |
40 } | |
41 | |
42 func GetAuthToken(authCode string) AuthRes { | |
43 config := readConfig() | |
44 | |
45 baseUrl := &url.URL{ | |
46 Scheme: "https", | |
47 Host: "id.twitch.tv", | |
48 Path: "/oauth2/token", | |
49 } | |
50 | |
51 formData := url.Values{} | |
52 formData.Add("client_id", config.ClientId) | |
53 formData.Add("client_secret", config.ClientSecret) | |
54 formData.Add("code", authCode) | |
55 formData.Add("grant_type", "authorization_code") | |
56 formData.Add("redirect_uri", "http://localhost:8080/twitch-auth-code-callback") | |
57 | |
58 res, err := http.PostForm(baseUrl.String(), formData) | |
59 | |
60 if err != nil { | |
61 log.Fatal(err) | |
62 } | |
63 | |
64 defer res.Body.Close() | |
65 | |
66 if res.StatusCode != 200 { | |
67 log.Fatal("GetAuthToken") | |
68 } | |
69 | |
70 var authRes AuthRes | |
71 | |
72 err = json.NewDecoder(res.Body).Decode(&authRes) | |
73 | |
74 if err != nil { | |
75 log.Fatal(err) | |
76 } | |
77 | |
78 log.Println(authRes.Scope) | |
79 | |
80 return authRes | |
81 } | |
82 | |
83 func IsAuthTokenValid(authToken string) bool { | |
84 endpoint := "https://id.twitch.tv/oauth2/validate" | |
85 req, err := http.NewRequest("GET", endpoint, nil) | |
86 | |
87 if err != nil { | |
88 log.Fatalf("Error creating request: %v\n", err) | |
89 } | |
90 | |
91 req.Header.Set("Authorization", "OAuth "+authToken) | |
92 | |
93 client := &http.Client{} | |
94 resp, err := client.Do(req) | |
95 | |
96 if err != nil { | |
97 log.Fatalf("Error sending request: %v\n", err) | |
98 } | |
99 | |
100 defer resp.Body.Close() | |
101 | |
102 return resp.StatusCode == 200 | |
103 } | |
104 | |
105 func RevokeAuthToken(authToken string) { | |
106 config := readConfig() | |
107 | |
108 data := url.Values{} | |
109 data.Set("client_id", config.ClientId) | |
110 data.Set("token", authToken) | |
111 | |
112 endpoint := "https://id.twitch.tv/oauth2/revoke" | |
113 req, err := http.NewRequest("POST", endpoint, bytes.NewBufferString(data.Encode())) | |
114 | |
115 if err != nil { | |
116 log.Fatalf("Error creating request: %v\n", err) | |
117 } | |
118 | |
119 req.Header.Set("Content-Type", "application/x-www-form-urlencoded") | |
120 | |
121 client := &http.Client{} | |
122 resp, err := client.Do(req) | |
123 | |
124 if err != nil { | |
125 log.Fatalf("Error sending request: %v\n", err) | |
126 } | |
127 | |
128 defer resp.Body.Close() | |
129 } | |
130 | |
131 func RefreshAuthToken(authToken, refreshToken string) AuthRes { | |
132 config := readConfig() | |
133 | |
134 data := url.Values{} | |
135 data.Set("grant_type", "refresh_token") | |
136 data.Set("refresh_token", refreshToken) | |
137 data.Set("client_id", config.ClientId) | |
138 data.Set("client_secret", config.ClientSecret) | |
139 | |
140 endpoint := "https://id.twitch.tv/oauth2/token" | |
141 req, err := http.NewRequest("POST", endpoint, bytes.NewBufferString(data.Encode())) | |
142 | |
143 if err != nil { | |
144 log.Fatalf("Error creating request: %v\n", err) | |
145 } | |
146 | |
147 req.Header.Set("Content-Type", "application/x-www-form-urlencoded") | |
148 | |
149 client := &http.Client{} | |
150 resp, err := client.Do(req) | |
151 | |
152 if err != nil { | |
153 log.Fatalf("Error sending request: %v\n", err) | |
154 } | |
155 | |
156 defer resp.Body.Close() | |
157 | |
158 body, err := io.ReadAll(resp.Body) | |
159 | |
160 if err != nil { | |
161 log.Fatalf("Error reading response body: %v", err) | |
162 } | |
163 | |
164 var authResponse AuthRes | |
165 | |
166 if err := json.Unmarshal(body, &authResponse); err != nil { | |
167 log.Fatalf("Error parsing JSON: %v", err) | |
168 } | |
169 | |
170 return authResponse | |
171 } | |
172 | |
173 // TODO: Return broadcaste user id | |
174 func GetBroadcasterUserId(userName, authToken string) { | |
175 config := readConfig() | |
176 | |
177 endpoint := "https://api.twitch.tv/helix/users?login=" + userName | |
178 req, err := http.NewRequest("GET", endpoint, nil) | |
179 | |
180 if err != nil { | |
181 log.Fatalf("Error creating request: %v\n", err) | |
182 } | |
183 | |
184 req.Header.Set("Client-ID", config.ClientId) | |
185 req.Header.Set("Authorization", "Bearer "+authToken) | |
186 | |
187 client := &http.Client{} | |
188 resp, err := client.Do(req) | |
189 | |
190 if err != nil { | |
191 log.Fatalf("Error sending request: %v\n", err) | |
192 } | |
193 | |
194 defer resp.Body.Close() | |
195 | |
196 body, err := io.ReadAll(resp.Body) | |
197 | |
198 if err != nil { | |
199 log.Fatalf("Error reading response body: %v", err) | |
200 } | |
201 | |
202 log.Println(string(body)) | |
203 } |