From b98574f0be3a470368083d03ef1624f69133e550 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Tue, 29 Aug 2017 11:06:00 -0700 Subject: [PATCH] vyvanse: add command top10 --- cmd/vyvanse/top10.go | 59 +++++++++++++++++++++++++++++++++++++++++++ internal/dao/users.go | 42 ++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 cmd/vyvanse/top10.go diff --git a/cmd/vyvanse/top10.go b/cmd/vyvanse/top10.go new file mode 100644 index 0000000..50e9537 --- /dev/null +++ b/cmd/vyvanse/top10.go @@ -0,0 +1,59 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "strconv" + + "git.xeserv.us/xena/vyvanse/internal/dao" + "github.com/bwmarrin/discordgo" + "github.com/olekukonko/tablewriter" + opentracing "github.com/opentracing/opentracing-go" +) + +func top10(us *dao.Users) func(context.Context, *discordgo.Session, *discordgo.Message, []string) error { + return func(ctx context.Context, s *discordgo.Session, m *discordgo.Message, parv []string) error { + sp, ctx := opentracing.StartSpanFromContext(ctx, "top10") + defer sp.Finish() + + users, err := us.Top10(ctx) + if err != nil { + return err + } + + buf := &bytes.Buffer{} + + table := tablewriter.NewWriter(buf) + table.SetHeader([]string{"Rank", "Nick", "Score"}) + + for i, u := range users { + apd := []string{} + apd = append(apd, strconv.Itoa(i+1)) + + ch, err := s.Channel(m.ChannelID) + if err != nil { + return err + } + + mem, err := s.GuildMember(ch.GuildID, u.DiscordID) + if err != nil { + return err + } + + apd = append(apd, mem.Nick, strconv.Itoa(u.Score)) + + table.Append(apd) + } + + table.Render() + + txt := fmt.Sprintf("```\n%s\n```", buf) + _, err = s.ChannelMessageSend(m.ChannelID, txt) + if err != nil { + return err + } + + return nil + } +} diff --git a/internal/dao/users.go b/internal/dao/users.go index 16dda0e..d37a549 100644 --- a/internal/dao/users.go +++ b/internal/dao/users.go @@ -2,6 +2,7 @@ package dao import ( "context" + "database/sql" "git.xeserv.us/xena/gorqlite" "github.com/opentracing/opentracing-go" @@ -79,3 +80,44 @@ func (u *Users) IncScore(ctx context.Context, discordID string) error { return nil } + +type User struct { + ID int `json:"id"` + DiscordID string `json:"discord_id"` + Score int `json:"score"` +} + +func (u *Users) Top10(ctx context.Context) ([]User, error) { + sp, ctx := opentracing.StartSpanFromContext(ctx, "users.top10") + defer sp.Finish() + + qr, err := u.conn.QueryOne("SELECT (id, discord_id, score) FROM users WHERE score > 0 ORDER BY score LIMIT 10") + if err != nil { + sp.LogFields(splog.Error(err)) + } + + if qr.Err != nil { + sp.LogFields(splog.Error(qr.Err)) + return nil, qr.Err + } + + var result []User + + if qr.NumRows() == 0 { + sp.LogFields(splog.Error(sql.ErrNoRows)) + return nil, sql.ErrNoRows + } + + for qr.Next() { + var u User + err = qr.Scan(&u.ID, &u.DiscordID, &u.Score) + if err != nil { + sp.LogFields(splog.Error(err)) + return nil, err + } + + result = append(result, u) + } + + return result, nil +}