Skip to content

Commit 908be88

Browse files
committed
Random bugfixes
1 parent ee80a08 commit 908be88

11 files changed

Lines changed: 2602 additions & 5210 deletions

File tree

go.mod

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ require (
124124
github.com/goccy/go-json v0.10.4 // indirect
125125
github.com/godbus/dbus/v5 v5.1.0 // indirect
126126
github.com/gofrs/uuid v4.4.0+incompatible // indirect
127-
github.com/golang-jwt/jwt/v4 v4.5.1 // indirect
127+
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
128128
github.com/golang-jwt/jwt/v5 v5.2.2 // indirect
129129
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
130130
github.com/google/go-querystring v1.1.0 // indirect
@@ -216,12 +216,13 @@ require (
216216
github.com/volatiletech/sqlboiler/v4 v4.16.2 // indirect
217217
github.com/volatiletech/strmangle v0.0.6 // indirect
218218
github.com/wlynxg/anet v0.0.6-0.20250109065809-5501d401a269 // indirect
219-
github.com/xaionaro-go/avcommon v0.0.0-20250510235605-840f8210b727 // indirect
219+
github.com/xaionaro-go/avcommon v0.0.0-20250629220425-ad846e62efb6 // indirect
220220
github.com/xaionaro-go/avmediacodec v0.0.0-20250505012527-c819676502d8 // indirect
221221
github.com/xaionaro-go/gorex v0.0.0-20241010205749-bcd59d639c4d // indirect
222222
github.com/xaionaro-go/libsrt v0.0.0-20250505013920-61d894a3b7e9 // indirect
223223
github.com/xaionaro-go/ndk v0.0.0-20250420195304-361bb98583bf // indirect
224224
github.com/xaionaro-go/proxy v0.0.0-20250525144747-579f5a891c15 // indirect
225+
github.com/xaionaro-go/sockopt v0.0.0-20250526214909-e15e1e4bc738 // indirect
225226
github.com/xaionaro-go/spinlock v0.0.0-20200518175509-30e6d1ce68a1 // indirect
226227
github.com/xanzy/ssh-agent v0.3.3 // indirect
227228
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
@@ -236,6 +237,7 @@ require (
236237
go.opentelemetry.io/otel/trace v1.36.0 // indirect
237238
go.uber.org/multierr v1.11.0 // indirect
238239
go.uber.org/zap v1.27.0 // indirect
240+
gocv.io/x/gocv v0.41.0 // indirect
239241
golang.org/x/arch v0.12.0 // indirect
240242
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
241243
golang.org/x/image v0.24.0 // indirect
@@ -296,7 +298,7 @@ require (
296298
github.com/spf13/pflag v1.0.6
297299
github.com/stretchr/testify v1.10.0
298300
github.com/xaionaro-go/audio v0.0.0-20250210102901-abfced9d5ef3
299-
github.com/xaionaro-go/avpipeline v0.0.0-20250525204026-17104bc4baca
301+
github.com/xaionaro-go/avpipeline v0.0.0-20250727184631-f13f8d149b18
300302
github.com/xaionaro-go/datacounter v1.0.4
301303
github.com/xaionaro-go/go-rtmp v0.0.0-20241009130244-1e3160f27f42
302304
github.com/xaionaro-go/grpcproxy v0.0.0-20241103205849-a8fef42e72f9
@@ -308,8 +310,8 @@ require (
308310
github.com/xaionaro-go/object v0.0.0-20241026212449-753ce10ec94c
309311
github.com/xaionaro-go/obs-grpc-proxy v0.0.0-20241018162120-5faf4e7a684a
310312
github.com/xaionaro-go/observability v0.0.0-20250622130956-24b7017284e4
311-
github.com/xaionaro-go/player v0.0.0-20250622141416-ef1757710ec5
312-
github.com/xaionaro-go/recoder v0.0.0-20250622141828-d59a546c36e9
313+
github.com/xaionaro-go/player v0.0.0-20250805195658-8ea6ef10e5ff
314+
github.com/xaionaro-go/recoder v0.0.0-20250805195121-617f4a6a1506
313315
github.com/xaionaro-go/secret v0.0.0-20250111141743-ced12e1082c2
314316
github.com/xaionaro-go/serializable v0.0.0-20250412140540-5ac572306599
315317
github.com/xaionaro-go/timeapiio v0.0.0-20240915203246-b907cf699af3

go.sum

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69
408408
github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
409409
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
410410
github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
411-
github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
412-
github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
411+
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
412+
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
413413
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
414414
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
415415
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
@@ -1072,12 +1072,12 @@ github.com/xaionaro-go/astiav v0.0.0-20250521203320-7402f3e25a7c h1:MTrVWO9fpyua
10721072
github.com/xaionaro-go/astiav v0.0.0-20250521203320-7402f3e25a7c/go.mod h1:GI0pHw6K2/pl/o8upCtT49P/q4KCwhv/8nGLlCsZLdA=
10731073
github.com/xaionaro-go/audio v0.0.0-20250210102901-abfced9d5ef3 h1:LRIpqqC7Gsz5+/EsIWRtdPZZPMpx9yykUVFyUnRaKbE=
10741074
github.com/xaionaro-go/audio v0.0.0-20250210102901-abfced9d5ef3/go.mod h1:i4CntPlryh9HLmA3p3M0CNr1usRkEkuh3N2Ui3HeXQA=
1075-
github.com/xaionaro-go/avcommon v0.0.0-20250510235605-840f8210b727 h1:uQ8V1T3Oeru15gEIthts9GWkMS3eQ0Eo7vOKvE4G2/k=
1076-
github.com/xaionaro-go/avcommon v0.0.0-20250510235605-840f8210b727/go.mod h1:kjLo1LasgdDJqbTGD5bbEM+D6RiZSbf5ZT8yiPFF1BA=
1075+
github.com/xaionaro-go/avcommon v0.0.0-20250629220425-ad846e62efb6 h1:Z/krIvEqIU9VVogzrtRR6/AWJt12qIhFQ7GoZVC+gSg=
1076+
github.com/xaionaro-go/avcommon v0.0.0-20250629220425-ad846e62efb6/go.mod h1:kjLo1LasgdDJqbTGD5bbEM+D6RiZSbf5ZT8yiPFF1BA=
10771077
github.com/xaionaro-go/avmediacodec v0.0.0-20250505012527-c819676502d8 h1:FZn9+TN3uHhohfpanWkR9lFNHApizznZbML6XjvEgTU=
10781078
github.com/xaionaro-go/avmediacodec v0.0.0-20250505012527-c819676502d8/go.mod h1:2W2Kp/HJFXcFBppQ4YytgDy/ydFL3hGc23xSB1U/Luc=
1079-
github.com/xaionaro-go/avpipeline v0.0.0-20250525204026-17104bc4baca h1:Cls4rEimemZicWzhVlzQm1otU/RTpfNVpgdfwvGEJrQ=
1080-
github.com/xaionaro-go/avpipeline v0.0.0-20250525204026-17104bc4baca/go.mod h1:LMh5Qi7cuntcktUezfA9toVCUCCsx9pjyGDWe9GLt9A=
1079+
github.com/xaionaro-go/avpipeline v0.0.0-20250727184631-f13f8d149b18 h1:OfkJnBBNbr3AUbqumbGpY78W8FoEHaz0zKdKzZMmkGc=
1080+
github.com/xaionaro-go/avpipeline v0.0.0-20250727184631-f13f8d149b18/go.mod h1:eFxxNA50Pyp1B+snK0TlmpsnrGUtzJohbY/+J3BEvqA=
10811081
github.com/xaionaro-go/datacounter v1.0.4 h1:+QMZLmu73R5WGkQfUPwlXF/JFN+Weo4iuDZkiL2wVm8=
10821082
github.com/xaionaro-go/datacounter v1.0.4/go.mod h1:Sf9vBevuV6w5iE6K3qJ9pWVKcyS60clWBUSQLjt5++c=
10831083
github.com/xaionaro-go/eventbus v0.0.0-20250720144534-4670758005d9 h1:ZAm8ueMw5D85LDeV1Kboc3ANqXr3LK/eXIl9hj1BJyM=
@@ -1122,18 +1122,20 @@ github.com/xaionaro-go/obs-grpc-proxy v0.0.0-20241018162120-5faf4e7a684a h1:PyX7
11221122
github.com/xaionaro-go/obs-grpc-proxy v0.0.0-20241018162120-5faf4e7a684a/go.mod h1:exSKIlCibB0ww+ABDwH+YG/iNdqVfdzXBBg5LYxkxGw=
11231123
github.com/xaionaro-go/observability v0.0.0-20250622130956-24b7017284e4 h1:dlsJ1l9WI+LTpB5z4f7FCLLrxJ7uV4tj9jWNqpibhA0=
11241124
github.com/xaionaro-go/observability v0.0.0-20250622130956-24b7017284e4/go.mod h1:GkNC0+nPJMOzotTzJVlH4+DvDg9cKrV9qqOe+8/kVw4=
1125-
github.com/xaionaro-go/player v0.0.0-20250622141416-ef1757710ec5 h1:uXZxXnL6Gj3kLIweXl1LAnLtrzWCXAnhGfEM3eoRcPc=
1126-
github.com/xaionaro-go/player v0.0.0-20250622141416-ef1757710ec5/go.mod h1:QHSAc18nHRppL2Q5yuCWOOXkUK/VR0h0ooBpew+b2lw=
1125+
github.com/xaionaro-go/player v0.0.0-20250805195658-8ea6ef10e5ff h1:sYAwCUWGRd949aybdufcTpRsZ9go4sZ8ZTpLRF3KZe0=
1126+
github.com/xaionaro-go/player v0.0.0-20250805195658-8ea6ef10e5ff/go.mod h1:ZPfygPU8g18dyvOnYCPdjvHT7h1Q80eG/rfmWOT6Vls=
11271127
github.com/xaionaro-go/proxy v0.0.0-20250525144747-579f5a891c15 h1:Qqoy9MDWq2Yh6uazAqQDzqU0doalTL3tRjNCo7X7GXA=
11281128
github.com/xaionaro-go/proxy v0.0.0-20250525144747-579f5a891c15/go.mod h1:6kxHtLmOImv/zwXSvaI1CW9Q8Pw+m5b891ZoejMKHPA=
11291129
github.com/xaionaro-go/pulse v0.0.0-20241023202712-7151fa00d4bb h1:9iHPI27CYbmJDhzEuCABQthE/DGVNvT60ybWvv3BV8w=
11301130
github.com/xaionaro-go/pulse v0.0.0-20241023202712-7151fa00d4bb/go.mod h1:cpYspI6YljhkUf1WLXLLDmeaaPFc3CnGLjDZf9dZ4no=
1131-
github.com/xaionaro-go/recoder v0.0.0-20250622141828-d59a546c36e9 h1:IjMeJams+k1/fPrIX91UphLHWanfRxX2RvZnXfftXcw=
1132-
github.com/xaionaro-go/recoder v0.0.0-20250622141828-d59a546c36e9/go.mod h1:yFnuENArL1/lMIV+C2FWUGgrJUOgnawzk3LNh6U9nGs=
1131+
github.com/xaionaro-go/recoder v0.0.0-20250805195121-617f4a6a1506 h1:0kFR1IYlNdr8WdomIXe9zndAHdqI+9Z+yxyzT33sw58=
1132+
github.com/xaionaro-go/recoder v0.0.0-20250805195121-617f4a6a1506/go.mod h1:LStqQ27RH8oRj0rMC3zSzzfHms9vuRAorrZU8gP9WYg=
11331133
github.com/xaionaro-go/secret v0.0.0-20250111141743-ced12e1082c2 h1:QHpTWfyfmz65cE0MtFXe9fScdi+X0VIYR2wgolSYEUk=
11341134
github.com/xaionaro-go/secret v0.0.0-20250111141743-ced12e1082c2/go.mod h1:XKoHGZ4VKMbVBl8VotLIoWQdrB6Q7jnR++RbkiegZFU=
11351135
github.com/xaionaro-go/serializable v0.0.0-20250412140540-5ac572306599 h1:CzcQd6wLiqgjd8K/6UzR5uyt6sg4ut/kVxi6+FJMbdI=
11361136
github.com/xaionaro-go/serializable v0.0.0-20250412140540-5ac572306599/go.mod h1:U3CCHI+1qYVegcvMrg95mUYU2Q7qC5deapVHbAHmSZI=
1137+
github.com/xaionaro-go/sockopt v0.0.0-20250526214909-e15e1e4bc738 h1:aGQY6gS+Y8GBwgt+Dg33f7JiUTU3p3OGrVKxqGzU7MM=
1138+
github.com/xaionaro-go/sockopt v0.0.0-20250526214909-e15e1e4bc738/go.mod h1:CqilA8ZWT91g8OUBwHE0JTIklhtB77lBrgTM7HlKYo4=
11371139
github.com/xaionaro-go/spinlock v0.0.0-20190309154744-55278e21e817/go.mod h1:Nb/15eS0BMty6TMuWgRQM8WCDIUlyPZagcpchHT6c9Y=
11381140
github.com/xaionaro-go/spinlock v0.0.0-20200518175509-30e6d1ce68a1 h1:1Kqw9dv2LnznIhJoMt3dNzc/ctSj6VHjyGh4YZHjpE4=
11391141
github.com/xaionaro-go/spinlock v0.0.0-20200518175509-30e6d1ce68a1/go.mod h1:UwmTXX+EpoEYHuy0rSys1Rp5PW+eVTgZSjgMVLJENKg=
@@ -1218,6 +1220,8 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
12181220
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
12191221
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
12201222
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
1223+
gocv.io/x/gocv v0.41.0 h1:KM+zRXUP28b6dHfhy+4JxDODbCNQNtLg8kio+YE7TqA=
1224+
gocv.io/x/gocv v0.41.0/go.mod h1:zYdWMj29WAEznM3Y8NsU3A0TRq/wR/cy75jeUypThqU=
12211225
golang.org/x/arch v0.12.0 h1:UsYJhbzPYGsT0HbEdmYcqtCv8UNGvnaL561NnIUvaKg=
12221226
golang.org/x/arch v0.12.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
12231227
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=

pkg/streamcontrol/kick/client.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
type Client interface {
1010
GetAuthorize(redirectURI, state, codeChallenge string, scope []gokick.Scope) (string, error)
1111
GetToken(ctx context.Context, redirectURI, code, codeVerifier string) (gokick.TokenResponse, error)
12+
RefreshToken(ctx context.Context, refreshToken string) (gokick.TokenResponse, error)
1213
OnUserAccessTokenRefreshed(callback func(accessToken, refreshToken string))
1314
UpdateStreamTitle(ctx context.Context, title string) (gokick.EmptyResponse, error)
1415
UpdateStreamCategory(ctx context.Context, categoryID int) (gokick.EmptyResponse, error)
@@ -28,6 +29,9 @@ type Client interface {
2829
duration *int,
2930
reason *string,
3031
) (gokick.BanUserResponseWrapper, error)
32+
SetAppAccessToken(token string)
33+
SetUserAccessToken(token string)
34+
SetUserRefreshToken(token string)
3135
}
3236

3337
type clientScorfly struct {

pkg/streamcontrol/kick/client_mock.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ func (clientMock) GetAuthorize(redirectURI, state, codeChallenge string, scope [
1818
return "", nil
1919
}
2020

21+
func (clientMock) RefreshToken(ctx context.Context, refreshToken string) (gokick.TokenResponse, error) {
22+
return gokick.TokenResponse{}, nil
23+
}
24+
2125
func (clientMock) GetToken(ctx context.Context, redirectURI, code, codeVerifier string) (gokick.TokenResponse, error) {
2226
return gokick.TokenResponse{}, nil
2327
}
@@ -89,3 +93,7 @@ func (clientMock) BanUser(
8993
Result: gokick.BanUserResponse{},
9094
}, nil
9195
}
96+
97+
func (clientMock) SetAppAccessToken(token string) {}
98+
func (clientMock) SetUserAccessToken(token string) {}
99+
func (clientMock) SetUserRefreshToken(token string) {}

pkg/streamcontrol/kick/kick.go

Lines changed: 68 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,8 @@ type Kick struct {
4545
SaveCfgFn func(Config) error
4646
PrepareLocker xsync.Mutex
4747

48-
lazyInitOnce sync.Once
49-
getAccessTokenLocker xsync.Mutex
50-
lastGetMutexSuccessAt time.Time
48+
lazyInitOnce sync.Once
49+
getAccessTokenLocker xsync.Mutex
5150
}
5251

5352
var _ streamcontrol.StreamController[StreamProfile] = (*Kick)(nil)
@@ -123,6 +122,11 @@ func (k *Kick) onUserAccessTokenRefreshed(
123122
if err != nil {
124123
logger.Errorf(ctx, "unable to save the config: %v", err)
125124
}
125+
client := k.GetClient()
126+
if client != nil {
127+
client.SetUserAccessToken(userAccessToken)
128+
client.SetUserRefreshToken(refreshToken)
129+
}
126130
})
127131
}
128132

@@ -140,13 +144,10 @@ func (k *Kick) keepAliveLoop(
140144
time.Sleep(time.Second)
141145
continue
142146
}
143-
client := k.GetClient()
144-
if client == nil {
145-
logger.Errorf(ctx, "client is not initialized")
146-
time.Sleep(time.Second)
147-
continue
148-
}
149-
_, err := client.GetLivestreams(k.CloseCtx, gokick.NewLivestreamListFilter().SetBroadcasterUserIDs(int(k.Channel.UserID)))
147+
_, err := k.getLivestreams(
148+
k.CloseCtx,
149+
gokick.NewLivestreamListFilter().SetBroadcasterUserIDs(int(k.Channel.UserID)),
150+
)
150151
if err != nil {
151152
logger.Errorf(ctx, "unable to get my stream status: %v", err)
152153
time.Sleep(time.Second)
@@ -245,13 +246,8 @@ func (k *Kick) getAccessToken(
245246
) (_err error) {
246247
logger.Tracef(ctx, "getAccessToken")
247248
defer func() { logger.Tracef(ctx, "/getAccessToken: %v", _err) }()
248-
now := time.Now()
249249
return xsync.DoR1(ctx, &k.getAccessTokenLocker, func() error {
250-
if k.lastGetMutexSuccessAt.After(now) {
251-
return nil
252-
}
253-
err := k.getAccessTokenNoLock(ctx)
254-
return err
250+
return k.getAccessTokenNoLock(ctx)
255251
})
256252
}
257253

@@ -261,12 +257,6 @@ func (k *Kick) getAccessTokenNoLock(
261257
logger.Tracef(ctx, "getAccessTokenNoLock")
262258
defer func() { logger.Tracef(ctx, "/getAccessTokenNoLock: %v", _err) }()
263259

264-
defer func() {
265-
if _err == nil {
266-
k.lastGetMutexSuccessAt = time.Now()
267-
}
268-
}()
269-
270260
getPortsFn := k.CurrentConfig.Config.GetOAuthListenPorts
271261
if getPortsFn == nil {
272262
// TODO: find a way to adjust the OAuth ports dynamically without re-creating the Kick client.
@@ -391,10 +381,34 @@ func (k *Kick) Flush(ctx context.Context) error {
391381
}
392382

393383
func (k *Kick) EndStream(ctx context.Context) error {
394-
logger.Warnf(ctx, "not implemented yet")
384+
// Kick ends a stream automatically, nothing to do:
395385
return nil
396386
}
397387

388+
func (k *Kick) getLivestreams(
389+
ctx context.Context,
390+
filter gokick.LivestreamListFilter,
391+
) (_ret *gokick.LivestreamsResponseWrapper, _err error) {
392+
logger.Debugf(ctx, "getLivestreams")
393+
defer func() { logger.Debugf(ctx, "/getLivestreams: %v, %v", _ret, _err) }()
394+
395+
if err := k.prepare(ctx); err != nil {
396+
return nil, fmt.Errorf("unable to get a prepared client: %w", err)
397+
}
398+
399+
client := k.GetClient()
400+
if client == nil {
401+
return nil, fmt.Errorf("client is not initialized")
402+
}
403+
404+
resp, err := client.GetLivestreams(k.CloseCtx, filter)
405+
if err != nil {
406+
return nil, fmt.Errorf("unable to get my stream status: %w", err)
407+
}
408+
409+
return &resp, nil
410+
}
411+
398412
func (k *Kick) GetStreamStatus(
399413
ctx context.Context,
400414
) (_ret *streamcontrol.StreamStatus, _err error) {
@@ -765,6 +779,14 @@ func (k *Kick) getAccessTokenIfNeeded(
765779
logger.Tracef(ctx, "getAccessTokenIfNeeded")
766780
defer func() { logger.Tracef(ctx, "/getAccessTokenIfNeeded: %v", _err) }()
767781

782+
if time.Now().After(k.CurrentConfig.Config.UserAccessTokenExpiresAt.Add(-30 * time.Second)) {
783+
if k.CurrentConfig.Config.RefreshToken.Get() != "" {
784+
if err := k.refreshAccessToken(ctx); err != nil {
785+
return fmt.Errorf("unable to refresh the access token: %w", err)
786+
}
787+
}
788+
}
789+
768790
if k.CurrentConfig.Config.UserAccessToken.Get() != "" {
769791
return nil
770792
}
@@ -777,6 +799,29 @@ func (k *Kick) getAccessTokenIfNeeded(
777799
return nil
778800
}
779801

802+
func (k *Kick) refreshAccessToken(
803+
ctx context.Context,
804+
) (_err error) {
805+
logger.Tracef(ctx, "refreshAccessToken")
806+
defer func() { logger.Tracef(ctx, "/refreshAccessToken: %v", _err) }()
807+
808+
resp, err := k.GetClient().RefreshToken(ctx, k.CurrentConfig.Config.RefreshToken.Get())
809+
if err != nil {
810+
logger.Errorf(ctx, "unable to refresh the token: %v", err)
811+
if getErr := k.getAccessToken(ctx); getErr != nil {
812+
return fmt.Errorf("unable to refresh access token (%w); and unable to get a new access token (%w)", err, getErr)
813+
}
814+
return nil
815+
}
816+
817+
err = k.setToken(ctx, resp, time.Now())
818+
if err != nil {
819+
return fmt.Errorf("unable to set access token: %w")
820+
}
821+
822+
return nil
823+
}
824+
780825
func (k *Kick) IsCapable(
781826
ctx context.Context,
782827
cap streamcontrol.Capability,

0 commit comments

Comments
 (0)