Skip to content

Commit 9e06288

Browse files
committed
Add a keepalive loop to the Kick handler
1 parent 217e5c6 commit 9e06288

3 files changed

Lines changed: 41 additions & 1 deletion

File tree

pkg/streamcontrol/kick/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ type Client interface {
1212
OnUserAccessTokenRefreshed(callback func(accessToken, refreshToken string))
1313
UpdateStreamTitle(ctx context.Context, title string) (gokick.EmptyResponse, error)
1414
UpdateStreamCategory(ctx context.Context, categoryID int) (gokick.EmptyResponse, error)
15+
GetLivestreams(ctx context.Context, filter gokick.LivestreamListFilter) (gokick.LivestreamsResponseWrapper, error)
1516
GetChannels(ctx context.Context, filter gokick.ChannelListFilter) (gokick.ChannelsResponseWrapper, error)
1617
SendChatMessage(
1718
ctx context.Context,

pkg/streamcontrol/kick/client_mock.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ func (clientMock) UpdateStreamCategory(ctx context.Context, categoryID int) (gok
3232
return gokick.EmptyResponse{}, nil
3333
}
3434

35+
func (clientMock) GetLivestreams(ctx context.Context, filter gokick.LivestreamListFilter) (gokick.LivestreamsResponseWrapper, error) {
36+
return gokick.LivestreamsResponseWrapper{}, nil
37+
}
38+
3539
func (clientMock) GetChannels(ctx context.Context, filter gokick.ChannelListFilter) (gokick.ChannelsResponseWrapper, error) {
3640
return gokick.ChannelsResponseWrapper{
3741
Result: []gokick.ChannelResponse{{

pkg/streamcontrol/kick/kick.go

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ func New(
8282
}
8383
k.SetClient(client)
8484
client.OnUserAccessTokenRefreshed(k.onUserAccessTokenRefreshed)
85+
observability.Go(ctx, func(ctx context.Context) {
86+
k.keepAliveLoop(ctx)
87+
})
8588
return k, nil
8689
}
8790

@@ -122,6 +125,28 @@ func (k *Kick) onUserAccessTokenRefreshed(
122125
})
123126
}
124127

128+
func (k *Kick) keepAliveLoop(
129+
ctx context.Context,
130+
) {
131+
logger.Debugf(ctx, "keepAliveLoop")
132+
defer func() { logger.Debugf(ctx, "/keepAliveLoop") }()
133+
134+
t := time.NewTicker(time.Minute)
135+
defer t.Stop()
136+
for {
137+
_, err := k.GetClient().GetLivestreams(k.CloseCtx, gokick.NewLivestreamListFilter().SetBroadcasterUserIDs(int(k.Channel.UserID)))
138+
if err != nil {
139+
logger.Errorf(ctx, "unable to get my stream status: %v", err)
140+
continue
141+
}
142+
select {
143+
case <-k.CloseCtx.Done():
144+
return
145+
case <-t.C:
146+
}
147+
}
148+
}
149+
125150
func (k *Kick) initChatHandler(
126151
ctx context.Context,
127152
) error {
@@ -143,9 +168,12 @@ func (k *Kick) initChatHandler(
143168
logger.Errorf(ctx, "unable to initialize chat handler: %v", err)
144169
time.Sleep(time.Second)
145170
select {
146-
case <-ctx.Done():
171+
case <-k.CloseCtx.Done():
147172
logger.Debugf(ctx, "initChatHandler: cancelled (case #1)")
148173
return
174+
case <-ctx.Done():
175+
logger.Debugf(ctx, "initChatHandler: cancelled (case #2)")
176+
return
149177
default:
150178
}
151179
chatHandler, err = k.newChatHandlerOBSOLETE(ctx, k.CurrentConfig.Config.Channel, k.onChatHandlerClose)
@@ -167,12 +195,17 @@ func (k *Kick) onChatHandlerClose(
167195
defer k.ChatHandlerLocker.Unlock()
168196
select {
169197
case <-ctx.Done():
198+
return
199+
case <-k.CloseCtx.Done():
200+
return
170201
case <-time.After(time.Second):
171202
}
172203
for {
173204
select {
174205
case <-ctx.Done():
175206
return
207+
case <-k.CloseCtx.Done():
208+
return
176209
default:
177210
}
178211
chatHandler, err := k.newChatHandlerOBSOLETE(ctx, k.CurrentConfig.Config.Channel, k.onChatHandlerClose)
@@ -517,6 +550,8 @@ func (k *Kick) GetChatMessagesChan(
517550
}()
518551
logger.Tracef(ctx, "GetChatMessagesChan: waiting for a message")
519552
select {
553+
case <-k.CloseCtx.Done():
554+
return
520555
case <-ctx.Done():
521556
return
522557
case ev, ok := <-chatHandler.MessagesChan():

0 commit comments

Comments
 (0)