aboutsummaryrefslogtreecommitdiff
path: root/xp
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <anhgelus.morhtuuzh@proton.me>2024-04-14 17:11:31 +0200
committerAnhgelus Morhtuuzh <anhgelus.morhtuuzh@proton.me>2024-04-14 17:11:31 +0200
commit1078cf3deb94ef22c65510b42c8e7f0dc50a036a (patch)
tree25f1e9e22f0ce88a3840cca5434201fbafdd20de /xp
parent1f68e698991d7bb1c9a5519536b2215185de0616 (diff)
feat(xp): xp and level gain
Diffstat (limited to 'xp')
-rw-r--r--xp/events.go40
-rw-r--r--xp/level.go9
-rw-r--r--xp/member.go22
3 files changed, 71 insertions, 0 deletions
diff --git a/xp/events.go b/xp/events.go
new file mode 100644
index 0000000..c82c489
--- /dev/null
+++ b/xp/events.go
@@ -0,0 +1,40 @@
+package xp
+
+import (
+ "github.com/anhgelus/gokord/utils"
+ "github.com/bwmarrin/discordgo"
+)
+
+func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) {
+ c := Copaing{DiscordID: m.Author.ID, GuildID: m.GuildID}
+ c.Load()
+ // add xp
+ pastLevel := Level(c.XP)
+ trimmed := utils.TrimMessage(m.Content)
+ c.XP += XPMessage(uint(len(trimmed)), calcDiversity(trimmed))
+ c.Save()
+ newLevel := Level(c.XP)
+ // handle new level
+ if pastLevel < newLevel {
+ if err := s.MessageReactionAdd(m.ChannelID, m.Message.ID, "⬆"); err != nil {
+ utils.SendAlert("xp/events.go - reaction add new level", "cannot add the reaction: "+err.Error())
+ }
+ onNewLevel(s, newLevel)
+ }
+}
+
+func calcDiversity(msg string) uint {
+ var chars []rune
+ for _, c := range []rune(msg) {
+ toAdd := true
+ for _, ch := range chars {
+ if ch == c {
+ toAdd = false
+ }
+ }
+ if toAdd {
+ chars = append(chars, c)
+ }
+ }
+ return uint(len(chars))
+}
diff --git a/xp/level.go b/xp/level.go
new file mode 100644
index 0000000..67ee5a5
--- /dev/null
+++ b/xp/level.go
@@ -0,0 +1,9 @@
+package xp
+
+import (
+ "github.com/bwmarrin/discordgo"
+)
+
+func onNewLevel(s *discordgo.Session, level uint) {
+ // check roles
+}
diff --git a/xp/member.go b/xp/member.go
new file mode 100644
index 0000000..751bbd7
--- /dev/null
+++ b/xp/member.go
@@ -0,0 +1,22 @@
+package xp
+
+import (
+ "github.com/anhgelus/gokord"
+ "gorm.io/gorm"
+)
+
+type Copaing struct {
+ gorm.Model
+ DiscordID string
+ XP uint
+ GuildID string
+}
+
+func (c *Copaing) Load() *Copaing {
+ gokord.DB.Where("discord_id = ? and guild_id = ?", c.DiscordID, c.GuildID).FirstOrCreate(c)
+ return c
+}
+
+func (c *Copaing) Save() {
+ gokord.DB.Save(c)
+}