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 {} } }