vyvanse/cmd/logworker/main.go

92 lines
2.2 KiB
Go

package main
import (
"context"
"encoding/json"
"git.xeserv.us/xena/gorqlite"
"git.xeserv.us/xena/vyvanse/internal/dao"
"github.com/Xe/ln"
"github.com/bwmarrin/discordgo"
"github.com/namsral/flag"
nats "github.com/nats-io/go-nats"
opentracing "github.com/opentracing/opentracing-go"
zipkin "github.com/openzipkin/zipkin-go-opentracing"
)
var (
token = flag.String("token", "", "discord bot token")
zipkinURL = flag.String("zipkin-url", "", "URL for Zipkin traces")
databaseURL = flag.String("database-url", "http://", "URL for database (rqlite)")
natsURL = flag.String("nats-url", "nats://localhost:4222", "URL for nats message queue")
)
func main() {
flag.Parse()
if *zipkinURL != "" {
collector, err := zipkin.NewHTTPCollector(*zipkinURL)
if err != nil {
ln.FatalErr(context.Background(), err)
}
tracer, err := zipkin.NewTracer(
zipkin.NewRecorder(collector, false, "logworker:5000", "logworker"))
if err != nil {
ln.FatalErr(context.Background(), err)
}
opentracing.SetGlobalTracer(tracer)
}
ctx := context.Background()
db, err := gorqlite.Open(*databaseURL)
if err != nil {
ln.FatalErr(ctx, err)
}
ls := dao.NewLogs(db)
err = ls.Migrate(ctx)
if err != nil {
ln.FatalErr(ctx, err, ln.F{"action": "migrate logs table"})
}
mq, err := nats.Connect(*natsURL)
if err != nil {
ln.FatalErr(ctx, err)
}
mq.QueueSubscribe("/message/create", "logworker", func(m *nats.Msg) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
sp, ctx := opentracing.StartSpanFromContext(ctx, "message.create")
defer sp.Finish()
msg := &discordgo.Message{}
err := json.Unmarshal(m.Data, msg)
if err != nil {
ln.Error(ctx, err, ln.F{"action": "can't unmarshal message body to a discordgo message"})
return
}
f := ln.F{
"channel_id": msg.ChannelID,
"message_id": msg.ID,
"message_author": msg.Author.ID,
"message_author_name": msg.Author.Username,
"message_author_is_bot": msg.Author.Bot,
}
err = ls.Add(ctx, msg)
if err != nil {
ln.Error(ctx, err, f, ln.F{"action": "can't add discordgo message to the database"})
}
})
for {
select {}
}
}