added db commands in seperate file

added new command to add dunks
master
Zachary Epps 5 years ago
parent d7a2fd7261
commit 79ccbdbc0f

102
db.go

@ -0,0 +1,102 @@
package main
import (
_ "github.com/mattn/go-sqlite3" // the _ in front allows us to use the standard sql package
"database/sql"
"log"
"strings"
"math/rand"
)
const (
DBFileName string = "dunks.db"
DBVersion int = 1
)
var (
DBConn *sql.DB
)
/*
in our init we check and see if the DB exists (or needs to be upgraded
-- DB Schema --
meta: GuildID Text Unique, Version int
guild tables: SubmittedBy Text, Dunk text unique
*/
func init() {
var err error
if DBConn, err = sql.Open("sqlite3", DBFileName); err != nil {
log.Fatal("couldn't open DB", err)
} else if err = DBConn.Ping(); err != nil {
log.Fatal("can't ping db", err)
}
if res, err := DBConn.Query("SELECT Version FROM dunks_meta LIMIT 1"); err != nil {
log.Println("running initial DB setup")
if _, err = DBConn.Exec("CREATE TABLE dunks_meta(GuildID text unique, Version int)"); err != nil {
DBConn.Close()
log.Fatal("couldn't create table", err)
}
} else {
defer res.Close()
res.Next()
log.Println("checking for and running migrations if needed")
var dbver int
if res.Scan(&dbver); dbver < DBVersion {
res.Close()
RunMigrations()
}
}
}
// MIGRATION CODE GOES HERE IF IT'S NEEDED
func RunMigrations() {}
// code that adds a new saying into the db for a guild
// returns an error if something went wrong adding it to the db
func AddDunk(guildID, authorID, text string) error {
var tableName string = "dunks_" + guildID
_, err := DBConn.Exec("INSERT INTO TABLE " + tableName + " VALUES($1, $2)",
authorID, text)
return err
}
// creates a new table of dunks for a guild
func CreateGuildTable(guildID string) error {
var err error
var tableName string = "dunks_" + guildID
_, err = DBConn.Exec("CREATE TABLE IF NOT EXISTS " + tableName + "(SubmittedBy Text, Dunk Text Unique)")
return err
}
// returns a dunk
// if withDad is false then only a dunk that doesn't have the word "Dad" in it is returned
func GetDunk(guildID string, withDad bool) string {
var tableName string = "dunks_" + guildID
dunks := make([]string, 0)
if query, err := DBConn.Query("SELECT Dunk from " + tableName + ""); err == nil {
defer query.Close()
for query.Next() {
var d string
query.Scan(&d)
if (!withDad && (strings.Contains(d, "Dad") || strings.Contains(d, "dad"))) || withDad {
dunks = append(dunks, d)
}
}
return dunks[rand.Intn(len(dunks))]
}
return ""
}

@ -8,12 +8,11 @@ import (
"os/signal"
"syscall"
"strings"
"math/rand"
)
var (
Token string
Posts [7]string = [7]string{
StarterPosts [7]string = [7]string{
"oh fuck, got 'em",
"damn, nice one Dad",
"got 'em",
@ -45,6 +44,7 @@ func main() {
log.Fatalln("couldn't launch bot:", err)
}
discord.AddHandler(onMemberAdd)
discord.AddHandler(onMessageCreate)
if err = discord.Open(); err != nil {
@ -58,13 +58,34 @@ func main() {
signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT, os.Interrupt, os.Kill)
<-sig
DBConn.Close()
}
// fires when a new user has been added to a server the bot is in
func onMemberAdd(s *discordgo.Session, u discordgo.GuildMemberAdd) {
if u.User.ID == MyID {
CreateGuildTable(u.GuildID)
}
}
// fires when a new message is sent in a server the bot has joined
func onMessageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
channel, _ := s.Channel(m.ChannelID)
// if we're told to add a new quote, handle it
if strings.HasPrefix(m.Content, "!newdunk") {
text := strings.Split(m.Content, "!newdunk ")
if err := AddDunk(channel.GuildID, m.Author.ID, text[1]); err != nil {
s.ChannelMessageSend(channel.ID, "oops, I couldn't save that sick dunk :/")
} else {
s.ChannelMessageSend(channel.ID, "nice one. adding that to my list")
}
}
// if the creator was dad bot
if m.Author.ID == DadBotID && strings.HasPrefix(m.Content, "Hi ") {
s.ChannelMessageSend(m.ChannelID, Posts[rand.Intn(len(Posts))])
s.ChannelMessageSend(m.ChannelID, GetDunk(channel.GuildID, true))
return
}
@ -72,13 +93,9 @@ func onMessageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
if len(m.Mentions) > 0 {
for _, user := range m.Mentions {
if user.ID == MyID {
for {
post := Posts[rand.Intn(len(Posts))]
if !strings.Contains(post, "Dad") {
s.ChannelMessageSend(m.ChannelID, post)
return
}
}
post := GetDunk(channel.GuildID, false)
s.ChannelMessageSend(m.ChannelID, post)
return
}
}
}

Loading…
Cancel
Save