kaiyan-index: get 7tv emote sets

This commit is contained in:
Branden J Brown 2025-04-20 20:26:40 -04:00
parent e88d4b6cc0
commit 2849b42745

View File

@ -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)
}