commit
c9c68d7e88
@ -0,0 +1,2 @@
|
|||||||
|
token.txt
|
||||||
|
bot.db
|
@ -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
|
||||||
|
)
|
@ -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=
|
@ -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()
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
@ -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...)
|
||||||
|
}
|
@ -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))))
|
||||||
|
}
|
Reference in New Issue