85 lines
2.0 KiB
Go
85 lines
2.0 KiB
Go
package ttv
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"github.com/adeithe/go-twitch/api"
|
|
"zomo.dev/largehadroncollider/db"
|
|
"zomo.dev/largehadroncollider/db/db_cold"
|
|
"zomo.dev/largehadroncollider/util"
|
|
)
|
|
|
|
// sign in to twitch with each saved tokens
|
|
|
|
func initAuth(conf *util.Config, dbConn *db.DBConn) (*TwitchAuth, error) {
|
|
ctx := context.Background()
|
|
|
|
tokens, err := dbConn.Cold.GetAllUserAuth()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
client := api.New(conf.ClientID)
|
|
|
|
accounts, err := testTokens(ctx, client, tokens)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, account := range accounts {
|
|
err := dbConn.Cold.UpdateUserAuth(account.UserID, account.UserName, account.UserLogin, account.AccessToken, account.RefreshToken, account.TokenExpires)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return &TwitchAuth{ ctx, client, accounts }, nil
|
|
}
|
|
|
|
type TwitchAuth struct {
|
|
Ctx context.Context
|
|
Client *api.Client
|
|
Accounts []db_cold.UserAuth
|
|
}
|
|
|
|
func testTokens(ctx context.Context, client *api.Client, tokens []db_cold.UserAuth) ([]db_cold.UserAuth, error) {
|
|
accounts := make([]db_cold.UserAuth, 0)
|
|
for _, token := range tokens {
|
|
account, err := testToken(ctx, client, token)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
accounts = append(accounts, account)
|
|
}
|
|
return accounts, nil
|
|
}
|
|
|
|
func testToken(ctx context.Context, client *api.Client, token db_cold.UserAuth) (db_cold.UserAuth, error) {
|
|
// TODO check refresh time, refresh token if needed
|
|
|
|
users, err := client.Users.List().Do(ctx, api.WithBearerToken(token.AccessToken))
|
|
if err != nil {
|
|
return db_cold.UserAuth{}, err
|
|
}
|
|
|
|
usersData := users.Data
|
|
|
|
if len(usersData) <= 0 {
|
|
return db_cold.UserAuth{}, errors.New("user data returned an empty array")
|
|
}
|
|
|
|
// from twitch
|
|
mainUser := usersData[0]
|
|
token.UserLogin = mainUser.UserLogin
|
|
token.UserName = mainUser.UserName
|
|
token.UserEmail = mainUser.Email
|
|
|
|
return token, nil
|
|
}
|
|
|
|
func refreshToken(token db_cold.UserAuth) (db_cold.UserAuth, error) {
|
|
// TODO get new access token using refresh token
|
|
// TODO this should be called regularly, as needed based on Expires
|
|
}
|