mirror of
https://git.sr.ht/~ashkeel/strimertul
synced 2024-09-18 01:50:50 +00:00
fix: force refreshing the auth token when starting
This commit is contained in:
parent
078863a5ec
commit
df46f7dfbf
4 changed files with 17 additions and 12 deletions
|
@ -84,7 +84,7 @@ func (m *Manager) SetupTwitch() {
|
||||||
cursor := ""
|
cursor := ""
|
||||||
var users []string
|
var users []string
|
||||||
for {
|
for {
|
||||||
userClient, err := client.GetUserClient()
|
userClient, err := client.GetUserClient(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.logger.Error("could not get user api client for list of chatters", zap.Error(err))
|
m.logger.Error("could not get user api client for list of chatters", zap.Error(err))
|
||||||
return
|
return
|
||||||
|
|
|
@ -26,14 +26,14 @@ func (c *Client) GetAuthorizationURL() string {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) GetUserClient() (*helix.Client, error) {
|
func (c *Client) GetUserClient(forceRefresh bool) (*helix.Client, error) {
|
||||||
var authResp AuthResponse
|
var authResp AuthResponse
|
||||||
err := c.db.GetJSON(AuthKey, &authResp)
|
err := c.db.GetJSON(AuthKey, &authResp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// Handle token expiration
|
// Handle token expiration
|
||||||
if time.Now().After(authResp.Time.Add(time.Duration(authResp.ExpiresIn) * time.Second)) {
|
if forceRefresh || time.Now().After(authResp.Time.Add(time.Duration(authResp.ExpiresIn)*time.Second)) {
|
||||||
// Refresh tokens
|
// Refresh tokens
|
||||||
refreshed, err := c.API.RefreshUserAccessToken(authResp.RefreshToken)
|
refreshed, err := c.API.RefreshUserAccessToken(authResp.RefreshToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -63,7 +63,7 @@ func (c *Client) GetLoggedUser() (helix.User, error) {
|
||||||
return c.User, nil
|
return c.User, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
client, err := c.GetUserClient()
|
client, err := c.GetUserClient(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return helix.User{}, fmt.Errorf("failed getting API client for user: %w", err)
|
return helix.User{}, fmt.Errorf("failed getting API client for user: %w", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,22 +17,23 @@ const websocketEndpoint = "wss://eventsub-beta.wss.twitch.tv/ws"
|
||||||
func (c *Client) eventSubLoop(userClient *helix.Client) {
|
func (c *Client) eventSubLoop(userClient *helix.Client) {
|
||||||
endpoint := websocketEndpoint
|
endpoint := websocketEndpoint
|
||||||
var err error
|
var err error
|
||||||
|
var connection *websocket.Conn
|
||||||
for endpoint != "" {
|
for endpoint != "" {
|
||||||
endpoint, err = c.connectWebsocket(endpoint, userClient)
|
endpoint, connection, err = c.connectWebsocket(endpoint, connection, userClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error("eventsub ws read error", zap.Error(err))
|
c.logger.Error("eventsub ws read error", zap.Error(err))
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
utils.Close(connection, c.logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) connectWebsocket(url string, userClient *helix.Client) (string, error) {
|
func (c *Client) connectWebsocket(url string, oldConnection *websocket.Conn, userClient *helix.Client) (string, *websocket.Conn, error) {
|
||||||
connection, _, err := websocket.DefaultDialer.Dial(url, nil)
|
connection, _, err := websocket.DefaultDialer.Dial(url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error("could not connect to eventsub ws", zap.Error(err))
|
c.logger.Error("could not connect to eventsub ws", zap.Error(err))
|
||||||
return "", err
|
return "", nil, err
|
||||||
}
|
}
|
||||||
defer utils.Close(connection, c.logger)
|
|
||||||
|
|
||||||
received := make(chan []byte, 10)
|
received := make(chan []byte, 10)
|
||||||
wsErr := make(chan error, 1)
|
wsErr := make(chan error, 1)
|
||||||
|
@ -60,9 +61,9 @@ func (c *Client) connectWebsocket(url string, userClient *helix.Client) (string,
|
||||||
var messageData []byte
|
var messageData []byte
|
||||||
select {
|
select {
|
||||||
case <-c.ctx.Done():
|
case <-c.ctx.Done():
|
||||||
return "", nil
|
return "", nil, nil
|
||||||
case err = <-wsErr:
|
case err = <-wsErr:
|
||||||
return "", err
|
return "", nil, err
|
||||||
case messageData = <-received:
|
case messageData = <-received:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +85,10 @@ func (c *Client) connectWebsocket(url string, userClient *helix.Client) (string,
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
c.logger.Info("eventsub ws connection established", zap.String("session-id", welcomeData.Session.Id))
|
c.logger.Info("eventsub ws connection established", zap.String("session-id", welcomeData.Session.Id))
|
||||||
|
|
||||||
|
if oldConnection != nil {
|
||||||
|
utils.Close(connection, c.logger)
|
||||||
|
}
|
||||||
// Add subscription to websocket session
|
// Add subscription to websocket session
|
||||||
err = c.addSubscriptionsForSession(userClient, welcomeData.Session.Id)
|
err = c.addSubscriptionsForSession(userClient, welcomeData.Session.Id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -99,7 +104,7 @@ func (c *Client) connectWebsocket(url string, userClient *helix.Client) (string,
|
||||||
}
|
}
|
||||||
c.logger.Info("eventsub ws connection reset requested", zap.String("session-id", reconnectData.Session.Id), zap.String("reconnect-url", reconnectData.Session.ReconnectUrl))
|
c.logger.Info("eventsub ws connection reset requested", zap.String("session-id", reconnectData.Session.Id), zap.String("reconnect-url", reconnectData.Session.ReconnectUrl))
|
||||||
|
|
||||||
return reconnectData.Session.ReconnectUrl, nil
|
return reconnectData.Session.ReconnectUrl, connection, nil
|
||||||
case "notification":
|
case "notification":
|
||||||
go c.processEvent(wsMessage)
|
go c.processEvent(wsMessage)
|
||||||
case "revocation":
|
case "revocation":
|
||||||
|
|
|
@ -208,7 +208,7 @@ func newClient(config Config, db *database.LocalDBClient, server *http.Server, l
|
||||||
client.API = api
|
client.API = api
|
||||||
server.RegisterRoute(CallbackRoute, client)
|
server.RegisterRoute(CallbackRoute, client)
|
||||||
|
|
||||||
if userClient, err := client.GetUserClient(); err == nil {
|
if userClient, err := client.GetUserClient(true); err == nil {
|
||||||
users, err := userClient.GetUsers(&helix.UsersParams{})
|
users, err := userClient.GetUsers(&helix.UsersParams{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
client.logger.Error("failed looking up user", zap.Error(err))
|
client.logger.Error("failed looking up user", zap.Error(err))
|
||||||
|
|
Loading…
Reference in a new issue