From c408afc8797b0da5e1d73d190a8f5884870b510c Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 13 May 2025 12:50:20 +0200 Subject: style(files): reorganize everything --- events.go | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 events.go (limited to 'events.go') diff --git a/events.go b/events.go new file mode 100644 index 0000000..e35ced0 --- /dev/null +++ b/events.go @@ -0,0 +1,173 @@ +package main + +import ( + "context" + "errors" + "fmt" + "github.com/anhgelus/gokord" + "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/les-copaings-bot/config" + xp2 "github.com/anhgelus/les-copaings-bot/exp" + "github.com/anhgelus/les-copaings-bot/user" + "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 := user.GetCopaing(m.Author.ID, m.GuildID) + user.LastEventUpdate(s, c) + // add exp + trimmed := utils.TrimMessage(strings.ToLower(m.Content)) + m.Member.User = m.Author + m.Member.GuildID = m.GuildID + xp := xp2.MessageXP(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( + "exp/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 + } + user.LastEventUpdate(s, user.GetCopaing(e.UserID, e.GuildID)) + cfg := config.GetGuildConfig(e.GuildID) + client, err := config.GetRedisClient() + if err != nil { + utils.SendAlert("exp/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 := user.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("exp/events.go - Setting connected_since", err.Error()) + } +} + +func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate, client *redis.Client) { + now := time.Now().Unix() + c := user.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("exp/events.go - Getting connected_since", res.Err().Error()) + err := client.Set(context.Background(), key, strconv.Itoa(NotConnected), 0).Err() + if err != nil { + utils.SendAlert("exp/events.go - Set connected_since to not connected after get err", err.Error()) + } + return + } + con, err := res.Int64() + if err != nil { + utils.SendAlert("exp/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("exp/events.go - Set connected_since to not connected", err.Error()) + } + // add exp + timeInVocal := now - con + if timeInVocal < 0 { + utils.SendAlert("exp/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, xp2.VocalXP(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("exp/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 := user.GetCopaing(e.User.ID, e.GuildID) + if err := gokord.DB.Where("guild_id = ?", e.GuildID).Delete(c).Error; err != nil { + utils.SendAlert( + "exp/events.go - deleting user from db", err.Error(), + "user_id", e.User.ID, + "guild_id", e.GuildID, + ) + } +} -- cgit v1.2.3 From d38c57b83009bf0a8b22bede7ee786d6f54fc66a Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 13 May 2025 13:00:09 +0200 Subject: fix(log): wrong pos in many alerts --- events.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'events.go') diff --git a/events.go b/events.go index e35ced0..a00fe6c 100644 --- a/events.go +++ b/events.go @@ -7,7 +7,7 @@ import ( "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" "github.com/anhgelus/les-copaings-bot/config" - xp2 "github.com/anhgelus/les-copaings-bot/exp" + "github.com/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/les-copaings-bot/user" "github.com/bwmarrin/discordgo" "github.com/redis/go-redis/v9" @@ -38,14 +38,14 @@ func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) { trimmed := utils.TrimMessage(strings.ToLower(m.Content)) m.Member.User = m.Author m.Member.GuildID = m.GuildID - xp := xp2.MessageXP(uint(len(trimmed)), calcDiversity(trimmed)) + xp := exp.MessageXP(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( - "exp/events.go - add reaction for new level", err.Error(), + "events.go - add reaction for new level", err.Error(), "channel id", m.ChannelID, "message id", m.Message.ID, ) @@ -71,7 +71,7 @@ func OnVoiceUpdate(s *discordgo.Session, e *discordgo.VoiceStateUpdate) { cfg := config.GetGuildConfig(e.GuildID) client, err := config.GetRedisClient() if err != nil { - utils.SendAlert("exp/events.go - Getting redis client", err.Error()) + utils.SendAlert("events.go - Getting redis client", err.Error()) return } if e.BeforeUpdate == nil && e.ChannelID != "" { @@ -97,7 +97,7 @@ func onConnection(_ *discordgo.Session, e *discordgo.VoiceStateUpdate, client *r 0, ).Err() if err != nil { - utils.SendAlert("exp/events.go - Setting connected_since", err.Error()) + utils.SendAlert("events.go - Setting connected_since", err.Error()) } } @@ -114,16 +114,16 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate, client *r return } if res.Err() != nil { - utils.SendAlert("exp/events.go - Getting connected_since", res.Err().Error()) + utils.SendAlert("events.go - Getting connected_since", res.Err().Error()) err := client.Set(context.Background(), key, strconv.Itoa(NotConnected), 0).Err() if err != nil { - utils.SendAlert("exp/events.go - Set connected_since to not connected after get err", err.Error()) + utils.SendAlert("events.go - Set connected_since to not connected after get err", err.Error()) } return } con, err := res.Int64() if err != nil { - utils.SendAlert("exp/events.go - Converting result to int64", err.Error()) + utils.SendAlert("events.go - Converting result to int64", err.Error()) return } // check validity of user (2) @@ -136,12 +136,12 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate, client *r 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("exp/events.go - Set connected_since to not connected", err.Error()) + utils.SendAlert("events.go - Set connected_since to not connected", err.Error()) } // add exp timeInVocal := now - con if timeInVocal < 0 { - utils.SendAlert("exp/events.go - Calculating time spent in vocal", "the time is negative") + utils.SendAlert("events.go - Calculating time spent in vocal", "the time is negative") return } if timeInVocal > MaxTimeInVocal { @@ -149,13 +149,13 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate, client *r timeInVocal = MaxTimeInVocal } e.Member.GuildID = e.GuildID - c.AddXP(s, e.Member, xp2.VocalXP(uint(timeInVocal)), func(_ uint, newLevel uint) { + c.AddXP(s, e.Member, exp.VocalXP(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("exp/events.go - Sending new level in fallback channel", err.Error()) + utils.SendAlert("events.go - Sending new level in fallback channel", err.Error()) } }) } @@ -165,7 +165,7 @@ func OnLeave(_ *discordgo.Session, e *discordgo.GuildMemberRemove) { c := user.GetCopaing(e.User.ID, e.GuildID) if err := gokord.DB.Where("guild_id = ?", e.GuildID).Delete(c).Error; err != nil { utils.SendAlert( - "exp/events.go - deleting user from db", err.Error(), + "events.go - deleting user from db", err.Error(), "user_id", e.User.ID, "guild_id", e.GuildID, ) -- cgit v1.2.3 From 6b6c775ab3af659e26f0c79dbabd86d88d2451d5 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 13 May 2025 13:15:59 +0200 Subject: refactor(gorm): remove ...At fields from model --- events.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'events.go') diff --git a/events.go b/events.go index a00fe6c..4e23b69 100644 --- a/events.go +++ b/events.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" @@ -162,8 +161,11 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate, client *r func OnLeave(_ *discordgo.Session, e *discordgo.GuildMemberRemove) { utils.SendDebug("Leave event", "user_id", e.User.ID) + if e.User.Bot { + return + } c := user.GetCopaing(e.User.ID, e.GuildID) - if err := gokord.DB.Where("guild_id = ?", e.GuildID).Delete(c).Error; err != nil { + if err := c.Delete(); err != nil { utils.SendAlert( "events.go - deleting user from db", err.Error(), "user_id", e.User.ID, -- cgit v1.2.3 From 5af6bd672c342fc4e7c4cc7bf61efd5026433ead Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 13 May 2025 13:19:59 +0200 Subject: style(event): move calcdiversity in exp --- events.go | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) (limited to 'events.go') diff --git a/events.go b/events.go index 4e23b69..6974606 100644 --- a/events.go +++ b/events.go @@ -10,7 +10,6 @@ import ( "github.com/anhgelus/les-copaings-bot/user" "github.com/bwmarrin/discordgo" "github.com/redis/go-redis/v9" - "slices" "strconv" "strings" "time" @@ -37,7 +36,7 @@ func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) { trimmed := utils.TrimMessage(strings.ToLower(m.Content)) m.Member.User = m.Author m.Member.GuildID = m.GuildID - xp := exp.MessageXP(uint(len(trimmed)), calcDiversity(trimmed)) + xp := exp.MessageXP(uint(len(trimmed)), exp.CalcDiversity(trimmed)) if xp > MaxXpPerMessage { xp = MaxXpPerMessage } @@ -52,16 +51,6 @@ func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) { }) } -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 -- cgit v1.2.3 From e0a8f6634424f10a22b0a0740e0bbc17534eaa0e Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 13 May 2025 13:26:32 +0200 Subject: refactor(xp): remove reducer --- events.go | 2 -- 1 file changed, 2 deletions(-) (limited to 'events.go') diff --git a/events.go b/events.go index 6974606..54c444e 100644 --- a/events.go +++ b/events.go @@ -31,7 +31,6 @@ func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) { return } c := user.GetCopaing(m.Author.ID, m.GuildID) - user.LastEventUpdate(s, c) // add exp trimmed := utils.TrimMessage(strings.ToLower(m.Content)) m.Member.User = m.Author @@ -55,7 +54,6 @@ func OnVoiceUpdate(s *discordgo.Session, e *discordgo.VoiceStateUpdate) { if e.Member.User.Bot { return } - user.LastEventUpdate(s, user.GetCopaing(e.UserID, e.GuildID)) cfg := config.GetGuildConfig(e.GuildID) client, err := config.GetRedisClient() if err != nil { -- cgit v1.2.3