forked from keybase/managed-bots
-
Notifications
You must be signed in to change notification settings - Fork 0
/
db.go
100 lines (90 loc) · 2.25 KB
/
db.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package triviabot
import (
"database/sql"
"github.com/malware-unicorn/go-keybase-chat-bot/kbchat/types/chat1"
"github.com/malware-unicorn/managed-bots/base"
)
type DB struct {
*base.DB
}
func NewDB(db *sql.DB) *DB {
return &DB{
DB: base.NewDB(db),
}
}
func (d *DB) RecordAnswer(convID chat1.ConvIDStr, username string, pointAdjust int, isCorrect bool) error {
return d.RunTxn(func(tx *sql.Tx) error {
correct := 0
incorrect := 0
if isCorrect {
correct = 1
} else {
incorrect = 1
}
if _, err := tx.Exec(`
INSERT INTO leaderboard (conv_id, username, points, correct, incorrect)
VALUES (?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE points=points+VALUES(points),correct=correct+VALUES(correct),
incorrect=incorrect+VALUES(incorrect)
`, base.ShortConvID(convID), username, pointAdjust, correct, incorrect); err != nil {
return err
}
return nil
})
}
type topUser struct {
username string
points int
correct int
incorrect int
}
func (d *DB) TopUsers(convID chat1.ConvIDStr) (res []topUser, err error) {
rows, err := d.Query(`
SELECT username, points, correct, incorrect
FROM leaderboard
WHERE conv_id = ?
ORDER BY points DESC, correct DESC
LIMIT 10
`, base.ShortConvID(convID))
if err != nil {
return res, err
}
defer rows.Close()
for rows.Next() {
var user topUser
if err := rows.Scan(&user.username, &user.points, &user.correct, &user.incorrect); err != nil {
return res, err
}
res = append(res, user)
}
return res, nil
}
func (d *DB) ResetConv(convID chat1.ConvIDStr) error {
return d.RunTxn(func(tx *sql.Tx) error {
if _, err := tx.Exec(`
DELETE FROM leaderboard WHERE conv_id = ?
`, base.ShortConvID(convID)); err != nil {
return err
}
return nil
})
}
func (d *DB) GetAPIToken(convID chat1.ConvIDStr) (res string, err error) {
row := d.QueryRow(`
SELECT token FROM tokens where conv_id = ?
`, base.ShortConvID(convID))
if err := row.Scan(&res); err != nil {
return "", err
}
return res, nil
}
func (d *DB) SetAPIToken(convID chat1.ConvIDStr, token string) error {
return d.RunTxn(func(tx *sql.Tx) error {
if _, err := tx.Exec(`
REPLACE INTO tokens (conv_id, token) VALUES (?, ?)
`, base.ShortConvID(convID), token); err != nil {
return err
}
return nil
})
}