From 86063b5a64040788b1e4c67d3a975a50f1772016 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Tue, 29 Aug 2017 09:49:27 -0700 Subject: [PATCH] add database interactions --- cmd/vyvanse/main.go | 31 ++++++++++++++++++++++ internal/dao/users.go | 62 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 internal/dao/users.go diff --git a/cmd/vyvanse/main.go b/cmd/vyvanse/main.go index f56e06d..9f8f424 100644 --- a/cmd/vyvanse/main.go +++ b/cmd/vyvanse/main.go @@ -6,7 +6,10 @@ import ( "log" "net/http" + "git.xeserv.us/xena/gorqlite" "git.xeserv.us/xena/vyvanse/bot" + "git.xeserv.us/xena/vyvanse/internal/dao" + "github.com/Xe/ln" "github.com/bwmarrin/discordgo" _ "github.com/joho/godotenv/autoload" @@ -24,6 +27,7 @@ var ( pesterChannel = flag.String("upload-channel", "", "Discord channel ID to upload and announce new XKCD items to") 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)") ) func main() { @@ -35,6 +39,28 @@ func main() { log.Fatal(err) } + db, err := gorqlite.Open(*databaseURL) + if err != nil { + log.Fatal(err) + } + + us := dao.NewUsers(db) + + type migrator interface { + Migrate(ctx context.Context) error + } + mgs := []migrator{us} + + sp, ctx := opentracing.StartSpan("migrations") + for _, mg := range mgs { + err := mg.Migrate(ctx) + if err != nil { + sp.Finish() + ln.FatalErr(ctx, err) + } + } + sp.Finish() + c := cron.New() comic, err := xk.Latest() @@ -111,6 +137,11 @@ func main() { if err != nil { ln.Error(context.Background(), err, ln.F{"action": "run commandSet on message"}) } + + _, err = us.Insert(context.Background(), m.Author.ID) + if err != nil { + ln.Error(context.Background(), err, ln.F{"action": "insert user into database"}) + } }) // Open the websocket and begin listening. diff --git a/internal/dao/users.go b/internal/dao/users.go new file mode 100644 index 0000000..999c003 --- /dev/null +++ b/internal/dao/users.go @@ -0,0 +1,62 @@ +package dao + +import ( + "context" + + "git.xeserv.us/xena/gorqlite" + "github.com/opentracing/opentracing-go" + splog "github.com/opentracing/opentracing-go/log" +) + +type Users struct { + conn gorqlite.Connection +} + +func NewUsers(conn gorqlite.Connection) *Users { + return &Users{conn: conn} +} + +func (u *Users) Migrate(ctx context.Context) error { + sp, ctx := opentracing.StartSpanFromContext(ctx, "users.migrate") + defer sp.Finish() + + migrationDDL := []string{ + `CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, discord_id UNIQUE TEXT, score INTEGER)`, + } + + res, err := u.conn.Write(migrationDDL) + if err != nil { + sp.LogFields(splog.Error(err)) + return err + } + + for i, re := range res { + if re.Err != nil { + sp.LogFields(splog.Error(err)) + return err + } + + sp.LogFields(splog.Int("migration.step", i), splog.Float64("timing", re.Timing), splog.Int64("rows.affected", re.RowsAffected)) + } + + return nil +} + +func (u *Users) Insert(ctx context.Context, discordID string) (int64, error) { + sp, ctx := opentracing.StartSpanFromContext(ctx, "users.insert") + defer sp.Finish() + sp.LogFields(splog.String("discord.id", discordID)) + + re, err := u.conn.WriteOne(gorqlite.NewPreparedStatement("INSERT INTO users (discord_id) VALUES (%s)").Bind(discordID)) + if err != nil { + sp.LogFields(splog.Error(err)) + return -1, err + } + + if re.Err != nil { + sp.LogFields(splog.Error(re.Err)) + return -1, err + } + + return re.LastInsertID, nil +}