mtfosbot/router/twitch/twitch.go

119 lines
2.4 KiB
Go

package twitch
import (
"net/url"
"strings"
"git.trj.tw/golang/mtfosbot/model"
twitchapi "git.trj.tw/golang/mtfosbot/module/apis/twitch"
"git.trj.tw/golang/mtfosbot/module/config"
"git.trj.tw/golang/mtfosbot/module/context"
twitchirc "git.trj.tw/golang/mtfosbot/module/twitch-irc"
"github.com/gin-gonic/contrib/sessions"
)
// OAuthLogin -
func OAuthLogin(c *context.Context) {
session := sessions.Default(c.Context)
twOauth := `https://id.twitch.tv/oauth2/authorize`
conf := config.GetConf()
redirectTo := strings.TrimRight(conf.URL, "/")
redirectTo += "/twitch/oauth"
qs := url.Values{}
qs.Add("client_id", conf.Twitch.ClientID)
qs.Add("redirect_uri", redirectTo)
qs.Add("response_type", "code")
qs.Add("scope", "user:read:email")
toURL, ok := c.GetQuery("tourl")
if ok && len(toURL) > 0 {
session.Set("backUrl", toURL)
session.Save()
}
c.Redirect(302, twOauth+"?"+qs.Encode())
}
// OAuthProc -
func OAuthProc(c *context.Context) {
code, ok := c.GetQuery("code")
if !ok || len(code) == 0 {
c.DataFormat(nil)
return
}
tokenData, err := twitchapi.GetTokenData(code)
if err != nil {
c.DataFormat("token get fail")
return
}
session := sessions.Default(c.Context)
userData := twitchapi.GetUserDataByToken(tokenData.AccessToken)
if userData == nil {
c.ServerError(nil)
return
}
session.Set("token", tokenData)
session.Set("user", userData)
session.Set("loginType", "twitch")
chData, err := model.GetTwitchChannelWithID(userData.ID)
if err != nil {
c.ServerError(nil)
return
}
if chData == nil {
chData = &model.TwitchChannel{
ID: userData.ID,
Name: userData.Login,
}
err = chData.Add()
if err != nil {
c.ServerError(nil)
return
}
} else {
if userData.Login != chData.Name {
chData.UpdateName(userData.Login)
}
}
conf := config.GetConf()
goURL := strings.TrimRight(conf.URL, "/") + "/web"
tourl := session.Get("backUrl")
if tourl != nil {
if str, ok := tourl.(string); ok {
goURL = str
session.Delete("backUrl")
}
}
session.Save()
c.Redirect(301, goURL)
}
func SendToChannel(c *context.Context) {
key := c.GetHeader("x-private-key")
if key == "" || key != "mtfos" {
c.Forbidden(nil)
return
}
ch, ok := c.GetQuery("channel")
if !ok || ch == "" {
c.DataFormat(nil)
return
}
msg, ok := c.GetQuery("message")
if !ok || msg == "" {
c.DataFormat(nil)
return
}
twitchirc.SendMessage(ch, msg)
c.Success(nil)
}