mirror of https://github.com/velour/catbase.git
Fix variable support
This commit is contained in:
parent
b048890b05
commit
079c6ab2ec
14
bot/bot.go
14
bot/bot.go
|
@ -149,22 +149,12 @@ func (b *bot) migrateDB() {
|
|||
}
|
||||
}
|
||||
|
||||
if b.dbVersion == 1 {
|
||||
if _, err := b.db.Exec(`create table if not exists variables (
|
||||
if _, err := b.db.Exec(`create table if not exists variables (
|
||||
id integer primary key,
|
||||
name string,
|
||||
perms string,
|
||||
type string
|
||||
);`); err != nil {
|
||||
log.Fatal("Initial DB migration create variables table: ", err)
|
||||
}
|
||||
if _, err := b.db.Exec(`create table if not exists 'values' (
|
||||
id integer primary key,
|
||||
varId integer,
|
||||
value string
|
||||
);`); err != nil {
|
||||
log.Fatal("Initial DB migration create values table: ", err)
|
||||
}
|
||||
log.Fatal("Initial DB migration create variables table: ", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ func (b *bot) Filter(message msg.Message, input string) string {
|
|||
|
||||
func (b *bot) getVar(varName string) (string, error) {
|
||||
var text string
|
||||
err := b.db.QueryRow(`select v.value from variables as va inner join "values" as v on va.id = va.id = v.varId order by random() limit 1`).Scan(&text)
|
||||
err := b.db.Get(&text, `select value from variables where name=? order by random() limit 1`, varName)
|
||||
switch {
|
||||
case err == sql.ErrNoRows:
|
||||
return "", fmt.Errorf("No factoid found")
|
||||
|
@ -170,19 +170,14 @@ func (b *bot) getVar(varName string) (string, error) {
|
|||
}
|
||||
|
||||
func (b *bot) listVars(channel string, parts []string) {
|
||||
rows, err := b.db.Query(`select name from variables`)
|
||||
var variables []string
|
||||
err := b.db.Select(&variables, `select name from variables group by name`)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
msg := "I know: $who, $someone, $digit, $nonzero"
|
||||
for rows.Next() {
|
||||
var variable string
|
||||
err := rows.Scan(&variable)
|
||||
if err != nil {
|
||||
log.Println("Error scanning variable.")
|
||||
continue
|
||||
}
|
||||
msg = fmt.Sprintf("%s, %s", msg, variable)
|
||||
if len(variables) > 0 {
|
||||
msg += ", " + strings.Join(variables, ", ")
|
||||
}
|
||||
b.SendMessage(channel, msg)
|
||||
}
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
package admin
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
"math/rand"
|
||||
"strings"
|
||||
|
@ -19,14 +17,14 @@ import (
|
|||
|
||||
type AdminPlugin struct {
|
||||
Bot bot.Bot
|
||||
DB *sqlx.DB
|
||||
db *sqlx.DB
|
||||
}
|
||||
|
||||
// NewAdminPlugin creates a new AdminPlugin with the Plugin interface
|
||||
func New(bot bot.Bot) *AdminPlugin {
|
||||
p := &AdminPlugin{
|
||||
Bot: bot,
|
||||
DB: bot.DB(),
|
||||
db: bot.DB(),
|
||||
}
|
||||
p.LoadData()
|
||||
return p
|
||||
|
@ -36,18 +34,8 @@ func New(bot bot.Bot) *AdminPlugin {
|
|||
// This function returns true if the plugin responds in a meaningful way to the users message.
|
||||
// Otherwise, the function returns false and the bot continues execution of other plugins.
|
||||
func (p *AdminPlugin) Message(message msg.Message) bool {
|
||||
// This bot does not reply to anything
|
||||
|
||||
if !message.User.Admin {
|
||||
return false
|
||||
}
|
||||
|
||||
body := message.Body
|
||||
|
||||
if len(body) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
if body[0] == '$' {
|
||||
return p.handleVariables(message)
|
||||
}
|
||||
|
@ -56,32 +44,49 @@ func (p *AdminPlugin) Message(message msg.Message) bool {
|
|||
}
|
||||
|
||||
func (p *AdminPlugin) handleVariables(message msg.Message) bool {
|
||||
if parts := strings.SplitN(message.Body, "!=", 2); len(parts) == 2 {
|
||||
variable := strings.ToLower(strings.TrimSpace(parts[0]))
|
||||
value := strings.TrimSpace(parts[1])
|
||||
|
||||
_, err := p.db.Exec(`delete from variables where name=? and value=?`, variable, value)
|
||||
if err != nil {
|
||||
p.Bot.SendMessage(message.Channel, "I'm broke and need attention in my variable creation code.")
|
||||
log.Println("[admin]: ", err)
|
||||
} else {
|
||||
p.Bot.SendMessage(message.Channel, "Removed.")
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
parts := strings.SplitN(message.Body, "=", 2)
|
||||
if len(parts) != 2 {
|
||||
return false
|
||||
}
|
||||
|
||||
variable := strings.TrimSpace(parts[0])
|
||||
value := parts[1]
|
||||
variable := strings.ToLower(strings.TrimSpace(parts[0]))
|
||||
value := strings.TrimSpace(parts[1])
|
||||
|
||||
var count int64
|
||||
var varId int64
|
||||
err := p.DB.QueryRow(`select count(*), varId from variables vs inner join "values" v on vs.id = v.varId where vs.name = ? and v.value = ?`, variable, value).Scan(&count)
|
||||
switch {
|
||||
case err == sql.ErrNoRows:
|
||||
_, err := p.DB.Exec(`insert into "values" (varId, value) values (?, ?)`, varId, value)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
msg := fmt.Sprintf("Added '%s' to %s.\n", value, variable)
|
||||
p.Bot.SendMessage(message.Channel, msg)
|
||||
return true
|
||||
case err != nil:
|
||||
row := p.db.QueryRow(`select count(*) from variables where value = ?`, variable, value)
|
||||
err := row.Scan(&count)
|
||||
if err != nil {
|
||||
p.Bot.SendMessage(message.Channel, "I'm broke and need attention in my variable creation code.")
|
||||
log.Println("Admin error: ", err)
|
||||
log.Println("[admin]: ", err)
|
||||
return true
|
||||
}
|
||||
p.Bot.SendMessage(message.Channel, "I've already got that one.")
|
||||
|
||||
if count > 0 {
|
||||
p.Bot.SendMessage(message.Channel, "I've already got that one.")
|
||||
} else {
|
||||
_, err := p.db.Exec(`INSERT INTO variables (name, value) VALUES (?, ?)`, variable, value)
|
||||
if err != nil {
|
||||
p.Bot.SendMessage(message.Channel, "I'm broke and need attention in my variable creation code.")
|
||||
log.Println("[admin]: ", err)
|
||||
return true
|
||||
}
|
||||
p.Bot.SendMessage(message.Channel, "Added.")
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue