feat: add watch streak miner status

This commit is contained in:
2026-04-30 17:45:39 +02:00
parent e2eb34498f
commit e30769653a
13 changed files with 1068 additions and 58 deletions
+39 -1
View File
@@ -156,6 +156,7 @@ type streamerService interface {
CurrentUser(context.Context) (*twitch.Viewer, error)
ResolveStreamer(context.Context, string) (*twitch.Channel, error)
StreamInfo(context.Context, string) (*twitch.StreamInfo, error)
WatchStreak(context.Context, string) (*int, error)
PlaybackAccessToken(context.Context, string) (*twitch.PlaybackToken, error)
LoadChannelPointsContext(context.Context, string) (*twitch.ChannelPointsContext, error)
ClaimCommunityPoints(context.Context, string, string) error
@@ -209,7 +210,9 @@ func newIRCManager(ch chan<- StreamerUpdate) *irc.Manager {
}
func newMinerManager(ctx context.Context, service miner.Service, ch chan<- StreamerUpdate) *miner.Manager {
return miner.NewManager(ctx, service, nil, newMinerLogSink(ch))
manager := miner.NewManager(ctx, service, nil, newMinerLogSink(ch))
manager.SetStatusSink(newMinerStatusSink(ch))
return manager
}
func newMinerLogSink(ch chan<- StreamerUpdate) func(miner.LogEntry) {
@@ -223,6 +226,23 @@ func newMinerLogSink(ch chan<- StreamerUpdate) func(miner.LogEntry) {
}
}
func newMinerStatusSink(ch chan<- StreamerUpdate) func(miner.StatusEntry) {
return func(entry miner.StatusEntry) {
ch <- StreamerUpdate{
Miner: &MinerUpdate{
Login: entry.Login,
Status: &MinerStatus{
Watching: entry.Watching,
Reason: string(entry.Reason),
WatchedMinutes: entry.WatchedMinutes,
WatchStreakMinutes: entry.WatchStreakMinutes,
WatchStreak: cloneInt(entry.WatchStreak),
},
},
}
}
}
func resolveStreamerEntries(ctx context.Context, service streamerService, state *auth.State, logins []string, ircSyncer ircSyncer, minerSyncer minerSyncer, send func(StreamerUpdate)) error {
return resolveStreamerEntriesWithSleep(ctx, service, state, logins, ircSyncer, minerSyncer, send, streamerRefreshInterval, sleepContext)
}
@@ -275,6 +295,16 @@ func resolveStreamerEntry(ctx context.Context, service streamerService, login st
return entry, nil
}
watchStreak, err := service.WatchStreak(ctx, channel.Login)
switch {
case err == nil:
entry.WatchStreak = watchStreak
case errors.Is(err, context.Canceled):
return nil, err
default:
entry.WatchStreakError = err.Error()
}
stream, err := service.StreamInfo(ctx, channel.ID)
switch {
case err == nil:
@@ -331,3 +361,11 @@ func watchedIRCTargets(entries []twitch.StreamerEntry) []irc.Target {
}
return targets
}
func cloneInt(value *int) *int {
if value == nil {
return nil
}
copy := *value
return &copy
}