From c9c68d7e881300b625bf7ec397c1e4de1c4643a7 Mon Sep 17 00:00:00 2001 From: Luther Wen Xu Date: Sun, 17 Nov 2019 22:47:34 +0800 Subject: [PATCH] Initial Commit --- .gitignore | 2 ++ go.mod | 8 ++++++ go.sum | 10 ++++++++ main.go | 34 ++++++++++++++++++++++++++ messageCreate.go | 12 +++++++++ status.go | 13 ++++++++++ xp.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 142 insertions(+) create mode 100644 .gitignore create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 messageCreate.go create mode 100644 status.go create mode 100644 xp.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..850f576 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +token.txt +bot.db diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..a0803a9 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module PermissionGacha + +go 1.13 + +require ( + github.com/bwmarrin/discordgo v0.20.1 + github.com/mattn/go-sqlite3 v1.12.0 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..fd2fbef --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/bwmarrin/discordgo v0.20.1 h1:Ihh3/mVoRwy3otmaoPDUioILBJq4fdWkpsi83oj2Lmk= +github.com/bwmarrin/discordgo v0.20.1/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/mattn/go-sqlite3 v1.12.0 h1:u/x3mp++qUxvYfulZ4HKOvVO0JWhk7HtE8lWhbGz/Do= +github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v2.0.0+incompatible h1:+afSeuaczjy4ZUN55wuDe1bCaAFBu0hg5Cf2Zw2ar0s= +github.com/mattn/go-sqlite3 v2.0.0+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16 h1:y6ce7gCWtnH+m3dCjzQ1PCuwl28DDIc3VNnvY29DlIA= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= diff --git a/main.go b/main.go new file mode 100644 index 0000000..4bf0b8f --- /dev/null +++ b/main.go @@ -0,0 +1,34 @@ +package main + +import ( + "fmt" + "io/ioutil" + "os" + "os/signal" + "strings" + "syscall" + + "github.com/bwmarrin/discordgo" +) + +func main() { + token, _ := ioutil.ReadFile("token.txt") + + dg, err := discordgo.New(strings.TrimSpace(string(token))) + if err != nil { + fmt.Println("Error creating Discord session:", err) + return + } + dg.AddHandler(messageCreate) + err = dg.Open() + if err != nil { + fmt.Println("Error opening Discord session:", err) + } + + sc := make(chan os.Signal, 1) + signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) + <-sc + + dg.Close() + db.Close() +} diff --git a/messageCreate.go b/messageCreate.go new file mode 100644 index 0000000..68840f2 --- /dev/null +++ b/messageCreate.go @@ -0,0 +1,12 @@ +package main + +import "github.com/bwmarrin/discordgo" + +func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { + if m.Author.Bot { + return + } + go incrementXP(s, m.Author.ID) + + //TODO Handle commands +} diff --git a/status.go b/status.go new file mode 100644 index 0000000..2785a35 --- /dev/null +++ b/status.go @@ -0,0 +1,13 @@ +package main + +import ( + "log" + + "github.com/bwmarrin/discordgo" +) + +func logError(dg *discordgo.Session, a ...interface{}) { + dg.UserUpdateStatus(discordgo.StatusDoNotDisturb) + dg.UpdateStatus(0, "with error") + log.Println(a...) +} diff --git a/xp.go b/xp.go new file mode 100644 index 0000000..5e804fd --- /dev/null +++ b/xp.go @@ -0,0 +1,63 @@ +package main + +import ( + "database/sql" + "math" + "sync" + "time" + + "github.com/bwmarrin/discordgo" + _ "github.com/mattn/go-sqlite3" +) + +var db *sql.DB +var lastMessage = make(map[string]time.Time) +var incrementMutex = sync.Mutex{} + +func init() { + var err error + db, err = sql.Open("sqlite3", "./bot.db") + if err != nil { + panic(err) + } + db.SetMaxOpenConns(1) + db.Exec("CREATE TABLE xp(id STRING NOT NULL UNIQUE, xp INTEGER NOT NULL)") +} + +func incrementXP(dg *discordgo.Session, discordID string) { + amountToIncrement := calculateIncrement(discordID) + + tx, err := db.Begin() + if err != nil { + logError(dg, "incrementXP", "begin", discordID, err) + return + } + _, err = tx.Exec("INSERT INTO xp(id, xp) VALUES(?, ?) ON CONFLICT(id) DO UPDATE SET xp = xp+?;", discordID, amountToIncrement) + if err != nil { + logError(dg, "incrementXP", "insert", discordID, err) + tx.Rollback() + return + } + err = tx.Commit() + if err != nil { + logError(dg, "incrementXP", "commit", discordID, err) + return + } +} + +func calculateIncrement(discordID string) int { + incrementMutex.Lock() + defer incrementMutex.Unlock() + + now := time.Now() + delta := now.Sub(lastMessage[discordID]) + lastMessage[discordID] = now + + if delta.Seconds() < 0 { + return 0 + } + + //Constructed on Desmos: + //y=\frac{100}{\left(1+e^{-\left(\frac{x-15}{3}\right)}\right)} + return int(100 / (1 + math.Pow(math.E, -((delta.Seconds()-15)/3)))) +}