-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtwitch.go
174 lines (148 loc) · 4.92 KB
/
twitch.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package main
import (
"encoding/json"
"errors"
"io/ioutil"
"net/http"
"strconv"
"strings"
"github.com/gin-gonic/gin"
)
//baseOauthStruct - vk.go
//socialDBInfo - vk.go
func twitchAuthorizeUser(code string) (nickname string, err error) {
twitchSettings := config.TwitchSettings
twitchArray := strings.Split(twitchSettings, "|")
if len(twitchArray) < 3 {
return nickname, errors.New("twitch settings length < 3 should be client_id|client_secret|redirect_uri")
}
client_id, client_secret, redirect_uri := twitchArray[0], twitchArray[1], twitchArray[2]
resp, err := http.Post("https://id.twitch.tv/oauth2/token?client_id="+client_id+"&grant_type=authorization_code&client_secret="+client_secret+"&redirect_uri="+redirect_uri+"&code="+code, "application/json", nil)
if err != nil {
return nickname, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nickname, err
}
var result map[string]interface{}
err = json.Unmarshal(body, &result)
if err != nil {
return nickname, err
}
if result["access_token"] == nil {
return nickname, errors.New("twitch oauth failed, bad code!")
}
token := result["access_token"].(string)
client := http.Client{}
req, err := http.NewRequest("GET", "https://api.twitch.tv/helix/users", nil)
if err != nil {
return nickname, err
}
req.Header.Set("Accept", "application/vnd.twitchtv.v5+json")
req.Header.Set("Client-ID", client_id)
req.Header.Set("Authorization", "Bearer "+token)
resp, err = client.Do(req)
if err != nil {
return nickname, err
}
defer resp.Body.Close()
body, err = ioutil.ReadAll(resp.Body)
if err != nil {
return nickname, err
}
var result2 map[string]interface{}
err = json.Unmarshal(body, &result2)
if err != nil {
return nickname, err
}
if result2["data"] == nil {
return nickname, errors.New("twitch oauth failed, data array not found!")
}
data := result2["data"].([]interface{})
nickname = data[0].(map[string]interface{})["login"].(string)
return nickname, nil
}
func twitchAuthorizeHandler(c *gin.Context) {
if getContext(c).User.ID == 0 {
simpleReply(c, errorMessage{T(c, "Please log in before")})
return
}
data := new(baseOAuthInfo)
data.TitleBar = T(c, "OAuth Gate")
data.KyutGrill = "2fa.jpg"
defer resp(c, 200, "socialOAuth.html", data)
twitchCode := c.Request.URL.Query().Get("code")
if len(twitchCode) < 1 {
data.Authorized = false
data.RedirectBackPage = "/settings/socialAuth"
data.Messages = append(data.Messages, errorMessage{T(c, "One of arguments is empty. Don't hack!")})
return
}
twitchNickname, err := twitchAuthorizeUser(twitchCode)
if err != nil {
c.Error(err)
data.Authorized = false
data.RedirectBackPage = "/settings/socialAuth"
data.Messages = append(data.Messages, errorMessage{T(c, "Something goes wrong, try again later!")})
return
}
socialDBInfo := socialDBInfo{}
if err := db.QueryRow(`
SELECT
user_id, account_type, account_id
FROM
social_networks
WHERE
account_id = '`+twitchNickname+`'
AND
account_type = 'twitch'
`).Scan(&socialDBInfo.UserID, &socialDBInfo.AccountType, &socialDBInfo.AccountID); err != nil {
db.Exec("INSERT INTO social_networks (user_id, account_type, account_id) VALUES (?, ?, ?)", getContext(c).User.ID, "twitch", twitchNickname)
} else {
if socialDBInfo.UserID != getContext(c).User.ID {
data.Authorized = false
data.RedirectBackPage = "/settings/socialAuth"
data.Messages = append(data.Messages, errorMessage{T(c, "This account already connected to another player! ")})
return
}
data.Authorized = true
data.RedirectBackPage = "/settings/socialAuth"
data.Messages = append(data.Messages, successMessage{T(c, "You connected this account earlier!")})
return
}
data.Authorized = true
data.RedirectBackPage = "/settings"
data.Messages = append(data.Messages, successMessage{T(c, "You successfully connected twitch account to your profile")})
}
func twitchUnAuthorizeHandler(c *gin.Context) {
if getContext(c).User.ID == 0 {
simpleReply(c, errorMessage{T(c, "Please log in before")})
return
}
data := new(baseOAuthInfo)
data.TitleBar = T(c, "OAuth Gate")
data.KyutGrill = "2fa.jpg"
defer resp(c, 200, "socialOAuth.html", data)
socialDBInfo := socialDBInfo{}
if err := db.QueryRow(`
SELECT
user_id, account_type, account_id
FROM
social_networks
WHERE
user_id = `+strconv.Itoa(getContext(c).User.ID)+`
AND
account_type = 'twitch'
`).Scan(&socialDBInfo.UserID, &socialDBInfo.AccountType, &socialDBInfo.AccountID); err != nil {
data.Authorized = true
data.RedirectBackPage = "/settings"
data.Messages = append(data.Messages, successMessage{T(c, "Your profile hasn't linked account ;d Ok, BRUH!~~~~")})
return
}
db.Exec("DELETE FROM social_networks WHERE user_id = ? AND account_type = 'twitch'", getContext(c).User.ID)
data.Authorized = true
data.RedirectBackPage = "/settings/socialAuth"
data.Messages = append(data.Messages, successMessage{T(c, "Your profile has successfully unlinked!")})
}