|
|
@ -13,6 +13,7 @@ import (
|
|
|
|
var db *sql.DB
|
|
|
|
var db *sql.DB
|
|
|
|
var lastMessage = make(map[string]time.Time)
|
|
|
|
var lastMessage = make(map[string]time.Time)
|
|
|
|
var incrementMutex = sync.Mutex{}
|
|
|
|
var incrementMutex = sync.Mutex{}
|
|
|
|
|
|
|
|
var levelUpRequirementCache [30]int
|
|
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
func init() {
|
|
|
|
var err error
|
|
|
|
var err error
|
|
|
@ -22,6 +23,13 @@ func init() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
db.SetMaxOpenConns(1)
|
|
|
|
db.SetMaxOpenConns(1)
|
|
|
|
db.Exec("CREATE TABLE xp(id STRING NOT NULL UNIQUE, xp INTEGER NOT NULL)")
|
|
|
|
db.Exec("CREATE TABLE xp(id STRING NOT NULL UNIQUE, xp INTEGER NOT NULL)")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for i := 1; i <= 30; i++ {
|
|
|
|
|
|
|
|
//Constructed on Desmos:
|
|
|
|
|
|
|
|
//y=2^{\frac{x}{3}}+.1x^{2}+1.2x-1
|
|
|
|
|
|
|
|
fi := float64(i)
|
|
|
|
|
|
|
|
levelUpRequirementCache[i-1] = int(10000 * (math.Pow(2, fi/3) + 0.1*fi*fi + 1.2*fi - 1))
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func incrementXP(dg *discordgo.Session, discordID string) {
|
|
|
|
func incrementXP(dg *discordgo.Session, discordID string) {
|
|
|
@ -45,6 +53,21 @@ func incrementXP(dg *discordgo.Session, discordID string) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func getLevelAndXP(dg *discordgo.Session, discordID string) (int, int) {
|
|
|
|
|
|
|
|
rows, err := db.Query("SELECT xp FROM xp WHERE id=?", discordID)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
logError(dg, "getLevelAndXP", "select", discordID, err)
|
|
|
|
|
|
|
|
return 1, 0
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer rows.Close()
|
|
|
|
|
|
|
|
if rows.Next() {
|
|
|
|
|
|
|
|
var xp int
|
|
|
|
|
|
|
|
rows.Scan(&xp)
|
|
|
|
|
|
|
|
return convertXPIntoLevel(xp)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1, 0
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func calculateIncrement(discordID string) int {
|
|
|
|
func calculateIncrement(discordID string) int {
|
|
|
|
incrementMutex.Lock()
|
|
|
|
incrementMutex.Lock()
|
|
|
|
defer incrementMutex.Unlock()
|
|
|
|
defer incrementMutex.Unlock()
|
|
|
@ -61,3 +84,15 @@ func calculateIncrement(discordID string) int {
|
|
|
|
//y=\frac{100}{\left(1+e^{-\left(\frac{x-15}{3}\right)}\right)}
|
|
|
|
//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))))
|
|
|
|
return int(100 / (1 + math.Pow(math.E, -((delta.Seconds()-15)/3))))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func convertXPIntoLevel(xp int) (int, int) {
|
|
|
|
|
|
|
|
if xp < levelUpRequirementCache[0] {
|
|
|
|
|
|
|
|
return 1, xp
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < 30; i++ {
|
|
|
|
|
|
|
|
if levelUpRequirementCache[i] > xp {
|
|
|
|
|
|
|
|
return i + 1, xp - levelUpRequirementCache[i-1]
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return 30, xp - levelUpRequirementCache[29]
|
|
|
|
|
|
|
|
}
|
|
|
|