aboutsummaryrefslogtreecommitdiff
path: root/xp/events.go
diff options
context:
space:
mode:
Diffstat (limited to 'xp/events.go')
-rw-r--r--xp/events.go171
1 files changed, 0 insertions, 171 deletions
diff --git a/xp/events.go b/xp/events.go
deleted file mode 100644
index 94d8889..0000000
--- a/xp/events.go
+++ /dev/null
@@ -1,171 +0,0 @@
-package xp
-
-import (
- "context"
- "errors"
- "fmt"
- "github.com/anhgelus/gokord"
- "github.com/anhgelus/gokord/utils"
- "github.com/anhgelus/les-copaings-bot/config"
- "github.com/bwmarrin/discordgo"
- "github.com/redis/go-redis/v9"
- "slices"
- "strconv"
- "strings"
- "time"
-)
-
-const (
- ConnectedSince = "connected_since"
- NotConnected = -1
- MaxTimeInVocal = 60 * 60 * 6
- MaxXpPerMessage = 250
-)
-
-func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) {
- if m.Author.Bot {
- return
- }
- cfg := config.GetGuildConfig(m.GuildID)
- if cfg.IsDisabled(m.ChannelID) {
- return
- }
- c := GetCopaing(m.Author.ID, m.GuildID)
- LastEventUpdate(s, c)
- // add xp
- trimmed := utils.TrimMessage(strings.ToLower(m.Content))
- m.Member.User = m.Author
- m.Member.GuildID = m.GuildID
- xp := XPMessage(uint(len(trimmed)), calcDiversity(trimmed))
- if xp > MaxXpPerMessage {
- xp = MaxXpPerMessage
- }
- c.AddXP(s, m.Member, xp, func(_ uint, _ uint) {
- if err := s.MessageReactionAdd(m.ChannelID, m.Message.ID, "⬆"); err != nil {
- utils.SendAlert(
- "xp/events.go - add reaction for new level", err.Error(),
- "channel id", m.ChannelID,
- "message id", m.Message.ID,
- )
- }
- })
-}
-
-func calcDiversity(msg string) uint {
- var chars []rune
- for _, c := range []rune(msg) {
- if !slices.Contains(chars, c) {
- chars = append(chars, c)
- }
- }
- return uint(len(chars))
-}
-
-func OnVoiceUpdate(s *discordgo.Session, e *discordgo.VoiceStateUpdate) {
- if e.Member.User.Bot {
- return
- }
- LastEventUpdate(s, GetCopaing(e.UserID, e.GuildID))
- cfg := config.GetGuildConfig(e.GuildID)
- client, err := getRedisClient()
- if err != nil {
- utils.SendAlert("xp/events.go - Getting redis client", err.Error())
- return
- }
- if e.BeforeUpdate == nil && e.ChannelID != "" {
- if cfg.IsDisabled(e.ChannelID) {
- return
- }
- onConnection(s, e, client)
- } else if e.BeforeUpdate != nil && e.ChannelID == "" {
- if cfg.IsDisabled(e.BeforeUpdate.ChannelID) {
- return
- }
- onDisconnect(s, e, client)
- }
-}
-
-func onConnection(_ *discordgo.Session, e *discordgo.VoiceStateUpdate, client *redis.Client) {
- utils.SendDebug("User connected", "username", e.Member.DisplayName())
- c := GetCopaing(e.UserID, e.GuildID)
- err := client.Set(
- context.Background(),
- c.GenKey(ConnectedSince),
- strconv.FormatInt(time.Now().Unix(), 10),
- 0,
- ).Err()
- if err != nil {
- utils.SendAlert("xp/events.go - Setting connected_since", err.Error())
- }
-}
-
-func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate, client *redis.Client) {
- now := time.Now().Unix()
- c := GetCopaing(e.UserID, e.GuildID)
- key := c.GenKey(ConnectedSince)
- res := client.Get(context.Background(), key)
- // check validity of user (1)
- if errors.Is(res.Err(), redis.Nil) {
- utils.SendWarn(fmt.Sprintf(
- "User %s diconnect from a vocal but does not have a connected_since", e.Member.DisplayName(),
- ))
- return
- }
- if res.Err() != nil {
- utils.SendAlert("xp/events.go - Getting connected_since", res.Err().Error())
- err := client.Set(context.Background(), key, strconv.Itoa(NotConnected), 0).Err()
- if err != nil {
- utils.SendAlert("xp/events.go - Set connected_since to not connected after get err", err.Error())
- }
- return
- }
- con, err := res.Int64()
- if err != nil {
- utils.SendAlert("xp/events.go - Converting result to int64", err.Error())
- return
- }
- // check validity of user (2)
- if con == NotConnected {
- utils.SendWarn(fmt.Sprintf(
- "User %s diconnect from a vocal but was registered as not connected", e.Member.DisplayName(),
- ))
- return
- }
- utils.SendDebug("User disconnected", "username", e.Member.DisplayName(), "since", con)
- err = client.Set(context.Background(), key, strconv.Itoa(NotConnected), 0).Err()
- if err != nil {
- utils.SendAlert("xp/events.go - Set connected_since to not connected", err.Error())
- }
- // add xp
- timeInVocal := now - con
- if timeInVocal < 0 {
- utils.SendAlert("xp/events.go - Calculating time spent in vocal", "the time is negative")
- return
- }
- if timeInVocal > MaxTimeInVocal {
- utils.SendWarn(fmt.Sprintf("User %s spent more than 6 hours in vocal", e.Member.DisplayName()))
- timeInVocal = MaxTimeInVocal
- }
- e.Member.GuildID = e.GuildID
- c.AddXP(s, e.Member, XPVocal(uint(timeInVocal)), func(_ uint, newLevel uint) {
- cfg := config.GetGuildConfig(e.GuildID)
- _, err = s.ChannelMessageSend(cfg.FallbackChannel, fmt.Sprintf(
- "%s est maintenant niveau %d", e.Member.Mention(), newLevel,
- ))
- if err != nil {
- utils.SendAlert("xp/events.go - Sending new level in fallback channel", err.Error())
- }
- })
-}
-
-func OnLeave(_ *discordgo.Session, e *discordgo.GuildMemberRemove) {
- utils.SendDebug("Leave event", "user_id", e.User.ID)
- c := GetCopaing(e.User.ID, e.GuildID)
- if err := gokord.DB.Where("guild_id = ?", e.GuildID).Delete(c).Error; err != nil {
- utils.SendAlert(
- "xp/events.go - deleting copaing from db", err.Error(),
- "user_id", e.User.ID,
- "guild_id", e.GuildID,
- )
- }
-}