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 }