From f1112c2fbf723e7eae1ed0b261b90d5dcca84607 Mon Sep 17 00:00:00 2001 From: Luther Wen Xu Date: Mon, 18 Nov 2019 12:25:34 +0800 Subject: [PATCH] xp: Implement level querying --- messageCreate.go | 18 ++++++++++++++++-- xp.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/messageCreate.go b/messageCreate.go index 68840f2..e01c1dc 100644 --- a/messageCreate.go +++ b/messageCreate.go @@ -1,6 +1,10 @@ package main -import "github.com/bwmarrin/discordgo" +import ( + "fmt" + + "github.com/bwmarrin/discordgo" +) func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { if m.Author.Bot { @@ -8,5 +12,15 @@ func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { } go incrementXP(s, m.Author.ID) - //TODO Handle commands + if m.Content == "p!level" { + handleXPRequest(s, m) + } +} + +func handleXPRequest(s *discordgo.Session, m *discordgo.MessageCreate) { + level, xp := getLevelAndXP(s, m.Author.ID) + s.ChannelMessageSend( + m.ChannelID, + fmt.Sprintf("<@%s> is now level %d. (%d XP/%d XP)", m.Author.ID, level, xp, levelUpRequirementCache[level-1]), + ) } diff --git a/xp.go b/xp.go index 98862bc..3998790 100644 --- a/xp.go +++ b/xp.go @@ -13,6 +13,7 @@ import ( var db *sql.DB var lastMessage = make(map[string]time.Time) var incrementMutex = sync.Mutex{} +var levelUpRequirementCache [30]int func init() { var err error @@ -22,6 +23,13 @@ func init() { } db.SetMaxOpenConns(1) 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) { @@ -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 { incrementMutex.Lock() 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)} 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] +}