From 2849b42745f27dd25987c18d0ca1433798c4e668 Mon Sep 17 00:00:00 2001 From: Branden J Brown Date: Sun, 20 Apr 2025 20:26:40 -0400 Subject: [PATCH] kaiyan-index: get 7tv emote sets --- cmd/kaiyan-index/main.go | 50 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/cmd/kaiyan-index/main.go b/cmd/kaiyan-index/main.go index 48ea05c..fb7aaae 100644 --- a/cmd/kaiyan-index/main.go +++ b/cmd/kaiyan-index/main.go @@ -5,8 +5,11 @@ import ( "flag" "fmt" "log/slog" + "net/http" "os" "os/signal" + "strconv" + "sync" "time" "github.com/twmb/franz-go/pkg/kgo" @@ -20,9 +23,15 @@ import ( func main() { var ( - dburi string + dburi string + streams []string ) flag.StringVar(&dburi, "db", "", "SQLite database URI") + flag.Func("b", "Twitch broadcaster user ID", func(s string) error { + streams = append(streams, s) + _, err := strconv.Atoi(s) + return err + }) flag.Parse() if flag.NArg() == 0 { fail("provide broker addresses as args") @@ -30,6 +39,9 @@ func main() { if dburi == "" { fail("-db is mandatory") } + if len(streams) == 0 { + fail("no broadcasters specified") + } ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) go func() { @@ -37,6 +49,40 @@ func main() { stop() }() + parsers := make(map[string]emote.Parser) + { + var mu sync.Mutex + var wg sync.WaitGroup + wg.Add(len(streams)) + for _, b := range streams { + go func() { + defer wg.Done() + req, err := http.NewRequestWithContext(ctx, "GET", "https://7tv.io/v3/users/twitch/"+b, nil) + if err != nil { + fail("%v", err) + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + fail("%v", err) + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + slog.ErrorContext(ctx, "7tv", slog.String("broadcaster", b), slog.String("status", resp.Status)) + return + } + em, err := emote.SevenTVv3(resp.Body) + if err != nil { + slog.ErrorContext(ctx, "7tv", slog.String("broadcaster", b), slog.Any("err", err)) + return + } + mu.Lock() + parsers[b] = emote.NewParser(em...) + mu.Unlock() + }() + } + wg.Wait() + } + opts := sqlitex.PoolOptions{ Flags: sqlite.OpenCreate | sqlite.OpenReadWrite | sqlite.OpenURI, PrepareConn: func(conn *sqlite.Conn) error { @@ -86,7 +132,7 @@ func main() { var ems []emote.Emote // TODO(branden): emote lists for ctx.Err() == nil { - msgs, ems, err = batch(ctx, nil, q, st, msgs[:0], ems[:0]) + msgs, ems, err = batch(ctx, parsers, q, st, msgs[:0], ems[:0]) if err != nil { fail("%v", err) }