From 079c6ab2ec5dabc7c5c22aa6d580e65405e092a7 Mon Sep 17 00:00:00 2001 From: Chris Sexton Date: Fri, 20 May 2016 16:28:48 -0400 Subject: [PATCH] Fix variable support --- bot/bot.go | 14 ++------- bot/handlers.go | 15 ++++------ plugins/admin/admin.go | 65 +++++++++++++++++++++++------------------- 3 files changed, 42 insertions(+), 52 deletions(-) diff --git a/bot/bot.go b/bot/bot.go index 051532d..40c661f 100644 --- a/bot/bot.go +++ b/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) } } diff --git a/bot/handlers.go b/bot/handlers.go index 04d19d9..ba4c5b1 100644 --- a/bot/handlers.go +++ b/bot/handlers.go @@ -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) } diff --git a/plugins/admin/admin.go b/plugins/admin/admin.go index a81e9e9..bf12c81 100644 --- a/plugins/admin/admin.go +++ b/plugins/admin/admin.go @@ -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 }