diff options
| author | Anhgelus Morhtuuzh <anhgelus.morhtuuzh@proton.me> | 2024-04-14 17:11:31 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <anhgelus.morhtuuzh@proton.me> | 2024-04-14 17:11:31 +0200 |
| commit | 1078cf3deb94ef22c65510b42c8e7f0dc50a036a (patch) | |
| tree | 25f1e9e22f0ce88a3840cca5434201fbafdd20de /xp | |
| parent | 1f68e698991d7bb1c9a5519536b2215185de0616 (diff) | |
feat(xp): xp and level gain
Diffstat (limited to 'xp')
| -rw-r--r-- | xp/events.go | 40 | ||||
| -rw-r--r-- | xp/level.go | 9 | ||||
| -rw-r--r-- | xp/member.go | 22 |
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) +} |
