aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commands/config.go5
-rw-r--r--commands/credits.go5
-rw-r--r--commands/rank.go28
-rw-r--r--commands/reset.go15
-rw-r--r--commands/stats.go26
-rw-r--r--commands/top.go15
-rw-r--r--config/channel.go19
-rw-r--r--config/xp_role.go46
-rw-r--r--go.mod4
-rw-r--r--go.sum8
-rw-r--r--main.go10
-rw-r--r--user/level.go57
-rw-r--r--user/xp.go23
13 files changed, 105 insertions, 156 deletions
diff --git a/commands/config.go b/commands/config.go
index 838f7e9..cc1e942 100644
--- a/commands/config.go
+++ b/commands/config.go
@@ -7,7 +7,6 @@ import (
"git.anhgelus.world/anhgelus/les-copaings-bot/config"
"git.anhgelus.world/anhgelus/les-copaings-bot/exp"
"github.com/anhgelus/gokord/cmd"
- "github.com/anhgelus/gokord/logger"
discordgo "github.com/nyttikord/gokord"
)
@@ -15,7 +14,7 @@ const (
ConfigModify = "config_modify"
)
-func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
+func Config(s *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
cfg := config.GetGuildConfig(i.GuildID)
roles := ""
l := len(cfg.XpRoles) - 1
@@ -82,6 +81,6 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa
)
err := resp.SetMessage(msg).IsEphemeral().Send()
if err != nil {
- logger.Alert("config/guild.go - Sending config", err.Error())
+ s.LogError(err, "sending config")
}
}
diff --git a/commands/credits.go b/commands/credits.go
index d58547e..e5fd711 100644
--- a/commands/credits.go
+++ b/commands/credits.go
@@ -3,11 +3,10 @@ package commands
import (
"github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/cmd"
- "github.com/anhgelus/gokord/logger"
discordgo "github.com/nyttikord/gokord"
)
-func Credits(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
+func Credits(s *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
msg := "**Les Copaings**, le bot gérant les serveurs privés de [anhgelus](<https://anhgelus.world/>).\n"
msg += "Code source : <https://git.anhgelus.world/anhgelus/les-copaings-bot>\n\n"
msg += "Host du bot : " + gokord.BaseCfg.GetAuthor() + ".\n\n"
@@ -15,6 +14,6 @@ func Credits(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionM
msg += "- [Inter](<https://github.com/rsms/inter>)"
err := resp.SetMessage(msg).Send()
if err != nil {
- logger.Alert("commands/credits.go - Sending credits", err.Error(), "guild_id", i.GuildID)
+ s.LogError(err, "sending credits")
}
}
diff --git a/commands/rank.go b/commands/rank.go
index 0adfde6..d3a9f70 100644
--- a/commands/rank.go
+++ b/commands/rank.go
@@ -6,7 +6,6 @@ import (
"git.anhgelus.world/anhgelus/les-copaings-bot/exp"
"git.anhgelus.world/anhgelus/les-copaings-bot/user"
"github.com/anhgelus/gokord/cmd"
- "github.com/anhgelus/gokord/logger"
discordgo "github.com/nyttikord/gokord"
)
@@ -20,22 +19,16 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.Optio
if u.Bot {
err = resp.SetMessage("Imagine si les bots avaient un niveau :rolling_eyes:").IsEphemeral().Send()
if err != nil {
- logger.Alert("commands/rank.go - Reply error user is a bot", err.Error())
+ s.LogError(err, "reply error user is a bot")
}
+ return
}
m, err = s.GuildAPI().Member(i.GuildID, u.ID)
if err != nil {
- logger.Alert(
- "commands/rank.go - Fetching guild member",
- err.Error(),
- "discord_id",
- u.ID,
- "guild_id",
- i.GuildID,
- )
+ s.LogError(err, "Fetching guild member %s in %s", u.Username, i.GuildID)
err = resp.SetMessage("Erreur : impossible de récupérer le membre").IsEphemeral().Send()
if err != nil {
- logger.Alert("commands/rank.go - Reply error fetching guild member", err.Error())
+ s.LogError(err, "reply error fetching guild member")
}
return
}
@@ -44,17 +37,10 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.Optio
}
xp, err := c.GetXP()
if err != nil {
- logger.Alert(
- "commands/rank.go - Fetching xp",
- err.Error(),
- "discord_id",
- c.ID,
- "guild_id",
- i.GuildID,
- )
+ s.LogError(err, "fetching xp for copaing %s in %s", c.ID, i.GuildID)
err = resp.SetMessage("Erreur : impossible de récupérer l'XP").IsEphemeral().Send()
if err != nil {
- logger.Alert("commands/rank.go - Reply error fetching xp", err.Error())
+ s.LogError(err, "reply error fetching xp")
}
return
}
@@ -68,6 +54,6 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.Optio
nxtLvlXP-xp,
)).Send()
if err != nil {
- logger.Alert("commands/rank.go - Sending rank", err.Error())
+ s.LogError(err, "sending rank")
}
}
diff --git a/commands/reset.go b/commands/reset.go
index f50bb21..77561c1 100644
--- a/commands/reset.go
+++ b/commands/reset.go
@@ -4,15 +4,14 @@ import (
"git.anhgelus.world/anhgelus/les-copaings-bot/user"
"github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/cmd"
- "github.com/anhgelus/gokord/logger"
discordgo "github.com/nyttikord/gokord"
)
-func Reset(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
+func Reset(s *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
var copaings []*user.Copaing
gokord.DB.Where("guild_id = ?", i.GuildID).Delete(&copaings)
if err := resp.IsEphemeral().SetMessage("L'XP a été reset.").Send(); err != nil {
- logger.Alert("commands/reset.go - Sending success (all)", err.Error())
+ s.LogError(err, "sending reset success")
}
}
@@ -21,26 +20,26 @@ func ResetUser(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.
v, ok := optMap["user"]
if !ok {
if err := resp.SetMessage("Le user n'a pas été renseigné.").Send(); err != nil {
- logger.Alert("commands/reset.go - Copaing not set", err.Error())
+ s.LogError(err, "sending error copaing not set")
}
return
}
m := v.UserValue(s.UserAPI())
if m.Bot {
if err := resp.SetMessage("Les bots n'ont pas de niveau :upside_down:").Send(); err != nil {
- logger.Alert("commands/reset.go - Copaing not set", err.Error())
+ s.LogError(err, "sending error bot does not have xp")
}
return
}
err := user.GetCopaing(m.ID, i.GuildID).Delete()
if err != nil {
- logger.Alert("commands/reset.go - Copaing not deleted", err.Error(), "discord_id", m.ID, "guild_id", i.GuildID)
+ s.LogError(err, "deleting copaings %s in %s", m.Username, i.GuildID)
err = resp.SetMessage("Erreur : impossible de reset l'utilisateur").Send()
if err != nil {
- logger.Alert("commands/reset.go - Error deleting", err.Error())
+ s.LogError(err, "sending error while deleting")
}
}
if err = resp.SetMessage("Le user bien été reset.").Send(); err != nil {
- logger.Alert("commands/reset.go - Sending success (user)", err.Error())
+ s.LogError(err, "sending reset success")
}
}
diff --git a/commands/stats.go b/commands/stats.go
index 1a7a379..e2c2ba4 100644
--- a/commands/stats.go
+++ b/commands/stats.go
@@ -15,7 +15,6 @@ import (
"git.anhgelus.world/anhgelus/les-copaings-bot/user"
"github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/cmd"
- "github.com/anhgelus/gokord/logger"
"github.com/jackc/pgx/v5/pgtype"
discordgo "github.com/nyttikord/gokord"
"github.com/nyttikord/gokord/channel"
@@ -53,7 +52,7 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM
if in < 1 || uint(in) > cfg.DaysXPRemains {
msg := fmt.Sprintf("Nombre de jours invalide. Il doit être strictement positif et inférieur à %d", cfg.DaysXPRemains)
if err := resp.SetMessage(msg).IsEphemeral().Send(); err != nil {
- logger.Alert("commands/stats.go - Sending invalid days", err.Error())
+ s.LogError(err, "sending error invalid days")
}
return
}
@@ -61,7 +60,7 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM
}
err := resp.IsDeferred().Send()
if err != nil {
- logger.Alert("commands/stats.go - Sending deferred", err.Error())
+ s.LogError(err, "sending deferred")
return
}
go func() {
@@ -72,15 +71,16 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM
w, err = statsAll(s, i, days)
}
if err != nil {
+ s.LogError(err, "generating stats in %s", i.GuildID)
if err = resp.IsEphemeral().SetMessage("Il y a eu une erreur...").Send(); err != nil {
- logger.Alert("commands/stats.go - Sending error occurred", err.Error())
+ s.LogError(err, "sending error occurred")
}
return
}
b := new(bytes.Buffer)
_, err = w.WriteTo(b)
if err != nil {
- logger.Alert("commands/stats.go - Writing png", err.Error())
+ s.LogError(err, "writing png")
}
err = resp.AddFile(&channel.File{
Name: "plot.png",
@@ -88,7 +88,7 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM
Reader: b,
}).Send()
if err != nil {
- logger.Alert("commands/stats.go - Sending response", err.Error())
+ s.LogError(err, "sending stats")
}
}()
}
@@ -117,7 +117,7 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days int, execS
if gokord.Debug {
var rawCopaingData []*user.CopaingXP
if err := execSql("SELECT * FROM copaing_xps ", "").Scan(&rawCopaingData).Error; err != nil {
- logger.Alert("commands/stats.go - Fetching result", err.Error())
+ s.LogError(err, "fetching result")
return nil, err
}
rawData = make([]*data, len(rawCopaingData))
@@ -133,7 +133,7 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days int, execS
if err := execSql(
`SELECT "created_at"::date::text, sum("xp") as xp, "copaing_id" FROM copaing_xps `, ` GROUP BY "created_at"::date, "copaing_id"`,
).Scan(&rawDbData).Error; err != nil {
- logger.Alert("commands/stats.go - Fetching result", err.Error())
+ s.LogError(err, "fetching result")
return nil, err
}
rawData = make([]*data, len(rawDbData))
@@ -155,10 +155,10 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days int, execS
var cp user.Copaing
if err := gokord.DB.First(&cp, raw.CopaingID).Error; err != nil {
if !errors.Is(err, gorm.ErrRecordNotFound) {
- logger.Alert("commands/stats.go - Finding copaing", err.Error(), "id", raw.CopaingID)
+ s.LogError(err, "finding copaing %d", raw.CopaingID)
return nil, err
}
- logger.Warn("Copaing not found, skipping entry", "old_id", raw.CopaingID)
+ s.LogWarn("Copaing %d not found, skipping", raw.CopaingID)
continue
}
copaings[raw.CopaingID] = &cp
@@ -202,7 +202,7 @@ func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, copaings
for in, c := range copaings {
m, err := s.GuildAPI().Member(i.GuildID, c.DiscordID)
if err != nil {
- logger.Alert("commands/stats.go - Fetching guild member", err.Error())
+ s.LogError(err, "fetching guild member")
return nil, err
}
slices.SortFunc(stats[in], func(a, b plotter.XY) int {
@@ -216,7 +216,7 @@ func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, copaings
})
l, _, err := plotter.NewLinePoints(plotter.XYs(stats[in]))
if err != nil {
- logger.Alert("commands/stats.go - Adding line points", err.Error())
+ s.LogError(err, "adding line points")
return nil, err
}
l.Color = colors[cnt%len(colors)]
@@ -226,7 +226,7 @@ func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, copaings
}
w, err := p.WriterTo(8*vg.Inch, 6*vg.Inch, "png")
if err != nil {
- logger.Alert("commands/stats.go - Generating png", err.Error())
+ s.LogError(err, "generating png")
return nil, err
}
return w, nil
diff --git a/commands/top.go b/commands/top.go
index 21a1456..195ee9b 100644
--- a/commands/top.go
+++ b/commands/top.go
@@ -8,34 +8,33 @@ import (
"git.anhgelus.world/anhgelus/les-copaings-bot/exp"
"git.anhgelus.world/anhgelus/les-copaings-bot/user"
"github.com/anhgelus/gokord/cmd"
- "github.com/anhgelus/gokord/logger"
discordgo "github.com/nyttikord/gokord"
"github.com/nyttikord/gokord/channel"
)
-func Top(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
+func Top(s *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
err := resp.IsDeferred().Send()
if err != nil {
- logger.Alert("commands/top.go - Sending deferred", err.Error())
+ s.LogError(err, "sending deferred")
return
}
embeds := make([]*channel.MessageEmbed, 3)
wg := sync.WaitGroup{}
- fn := func(s string, n uint, d int, id int) {
+ fn := func(str string, n uint, d int, id int) {
defer wg.Done()
tops, err := user.GetBestXP(i.GuildID, n, d)
if err != nil {
- logger.Alert("commands/top.go - Fetching best xp", err.Error(), "n", n, "d", d, "id", id, "guild_id", i.GuildID)
+ s.LogError(err, "fetching best xp, n: %d, d: %d, id: %d, guild: %s", n, d, id, i.GuildID)
embeds[id] = &channel.MessageEmbed{
- Title: s,
+ Title: str,
Description: "Erreur : impossible de récupérer la liste",
Color: 0x831010,
}
return
}
embeds[id] = &channel.MessageEmbed{
- Title: s,
+ Title: str,
Description: genTopsMessage(tops),
Color: 0x10E6AD,
}
@@ -60,7 +59,7 @@ func Top(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap,
}
err = resp.Send()
if err != nil {
- logger.Alert("commands/top.go - Sending response top", err.Error())
+ s.LogError(err, "sending response top")
}
}()
}
diff --git a/config/channel.go b/config/channel.go
index c09061f..918af6d 100644
--- a/config/channel.go
+++ b/config/channel.go
@@ -4,7 +4,6 @@ import (
"strings"
"github.com/anhgelus/gokord/cmd"
- "github.com/anhgelus/gokord/logger"
discordgo "github.com/nyttikord/gokord"
"github.com/nyttikord/gokord/interaction"
)
@@ -29,7 +28,7 @@ func HandleModifyFallbackChannel(_ *discordgo.Session, _ *discordgo.InteractionC
//}
}
-func HandleFallbackChannelSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
+func HandleFallbackChannelSet(s *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
resp.IsEphemeral()
cfg := GetGuildConfig(i.GuildID)
@@ -38,14 +37,14 @@ func HandleFallbackChannelSet(_ *discordgo.Session, i *discordgo.InteractionCrea
cfg.FallbackChannel = channelID
err := cfg.Save()
if err != nil {
- logger.Alert("config/channel.go - Saving fallback channel", err.Error())
+ s.LogError(err, "saving fallback channel")
if err = resp.SetMessage("Erreur lors de la sauvegarde du salon").Send(); err != nil {
- logger.Alert("config/channel.go - Sending error while saving channel", err.Error())
+ s.LogError(err, "sending error while saving channel")
}
return
}
if err = resp.SetMessage("Salon sauvegardé.").Send(); err != nil {
- logger.Alert("config/channel.go - Sending channel saved", err.Error())
+ s.LogError(err, "sending channel saved")
}
}
@@ -103,25 +102,25 @@ func HandleDisChannelAddSet(_ *discordgo.Session, i *discordgo.InteractionCreate
//}
}
-func HandleDisChannelDelSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
+func HandleDisChannelDelSet(s *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
resp.IsEphemeral()
cfg := GetGuildConfig(i.GuildID)
id := data.Values[0]
if !strings.Contains(cfg.DisabledChannels, id) {
err := resp.SetMessage("Le salon n'est pas désactivé").Send()
if err != nil {
- logger.Alert("commands/config.go - Channel not disabled", err.Error())
+ s.LogError(err, "sending channel not disabled")
}
return
}
cfg.DisabledChannels = strings.ReplaceAll(cfg.DisabledChannels, id+";", "")
if err := cfg.Save(); err != nil {
- logger.Alert("commands/config.go - Saving config disable del", err.Error())
+ s.LogError(err, "saving config disable del")
if err = resp.SetMessage("Il y a eu une erreur lors de la modification de de la base de données.").Send(); err != nil {
- logger.Alert("config/channel.go - Sending error while saving config", err.Error())
+ s.LogError(err, "sending error while saving config")
}
}
if err := resp.SetMessage("Modification sauvegardé.").Send(); err != nil {
- logger.Alert("commands/config.go - Modification saved message disable del", err.Error())
+ s.LogError(err, "modification saved message disable del")
}
}
diff --git a/config/xp_role.go b/config/xp_role.go
index 39e48f6..1a8fa8a 100644
--- a/config/xp_role.go
+++ b/config/xp_role.go
@@ -5,7 +5,6 @@ import (
"github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/cmd"
- "github.com/anhgelus/gokord/logger"
discordgo "github.com/nyttikord/gokord"
"github.com/nyttikord/gokord/interaction"
)
@@ -76,7 +75,7 @@ func HandleXpRoleAddEdit(_ *discordgo.Session, _ *discordgo.InteractionCreate, d
//}
}
-func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
+func HandleXpRoleAddRole(s *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
resp.IsEphemeral()
cfg := GetGuildConfig(i.GuildID)
roleId := data.Values[0]
@@ -84,7 +83,7 @@ func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, d
if r.RoleID == roleId {
err := resp.SetMessage("Le rôle est déjà présent dans la config").Send()
if err != nil {
- logger.Alert("config/xp_role.go - Role already in config", err.Error())
+ s.LogError(err, "sending role already in config")
}
return
}
@@ -95,20 +94,15 @@ func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, d
})
err := cfg.Save()
if err != nil {
- logger.Alert(
- "config/xp_role.go - Saving config",
- err.Error(),
- "guild_id", i.GuildID,
- "role_id", roleId,
- "type", "add",
- )
+ s.LogError(err, "saving config for role %s in %s", roleId, i.GuildID)
+ return
}
if err = resp.SetMessage("Rôle ajouté.").Send(); err != nil {
- logger.Alert("config/xp_role.go - Sending success", err.Error())
+ s.LogError(err, "Sending role saved")
}
}
-func HandleXpRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
+func HandleXpRoleEditRole(s *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
resp.IsEphemeral()
cfg := GetGuildConfig(i.GuildID)
roleId := data.Values[0]
@@ -116,23 +110,18 @@ func HandleXpRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate,
if r == nil {
err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send()
if err != nil {
- logger.Alert("config/xp_role.go - Role not found (edit)", err.Error())
+ s.LogError(err, "role not found")
}
return
}
r.XP = configModifyMap[getKeyConfigRole(i)]
err := gokord.DB.Save(r).Error
if err != nil {
- logger.Alert(
- "config/xp_role.go - Saving config",
- err.Error(),
- "guild_id", i.GuildID,
- "role_id", roleId,
- "type", "edit",
- )
+ s.LogError(err, "saving config for role %s in %s", roleId, i.GuildID)
+ return
}
if err = resp.SetMessage("Rôle modifié.").Send(); err != nil {
- logger.Alert("config/xp_role.go - Sending success", err.Error())
+ s.LogError(err, "sending role saved")
}
}
@@ -146,7 +135,7 @@ func HandleXpRoleDel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ int
//}
}
-func HandleXpRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
+func HandleXpRoleDelRole(s *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
resp.IsEphemeral()
cfg := GetGuildConfig(i.GuildID)
roleId := data.Values[0]
@@ -154,22 +143,17 @@ func HandleXpRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, d
if r == nil {
err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send()
if err != nil {
- logger.Alert("config/xp_role.go - Sending role not found (del)", err.Error())
+ s.LogError(err, "sending role not found")
}
return
}
err := gokord.DB.Delete(r).Error
if err != nil {
- logger.Alert(
- "config/xp_role.go - Deleting entry",
- err.Error(),
- "guild_id", i.GuildID,
- "role_id", roleId,
- "type", "del",
- )
+ s.LogError(err, "saving config for role %s in %s", roleId, i.GuildID)
+ return
}
if err = resp.SetMessage("Rôle supprimé.").Send(); err != nil {
- logger.Alert("config/xp_role.go - Sending success", err.Error())
+ s.LogError(err, "sending role deleted")
}
}
diff --git a/go.mod b/go.mod
index ea40184..506cb86 100644
--- a/go.mod
+++ b/go.mod
@@ -5,9 +5,9 @@ go 1.24.0
toolchain go1.24.6
require (
- github.com/anhgelus/gokord v0.11.1-0.20250913111909-19135e5d37be
+ github.com/anhgelus/gokord v0.11.1-0.20250913175430-bf95758b4d3b
github.com/joho/godotenv v1.5.1
- github.com/nyttikord/gokord v0.30.1-0.20250913111646-475b917cccfb
+ github.com/nyttikord/gokord v0.30.1-0.20250913173431-8e43619c03fa
github.com/pelletier/go-toml/v2 v2.2.4
gorm.io/driver/postgres v1.6.0
gorm.io/gorm v1.31.0
diff --git a/go.sum b/go.sum
index f4ede94..055023e 100644
--- a/go.sum
+++ b/go.sum
@@ -35,6 +35,10 @@ github.com/anhgelus/gokord v0.11.1-0.20250911112818-b436d35950ae h1:7UFLx1EybWFZ
github.com/anhgelus/gokord v0.11.1-0.20250911112818-b436d35950ae/go.mod h1:Tw1djmUOTFCIRhEUI7eG2onnreJbVGA40EWYQgj20bE=
github.com/anhgelus/gokord v0.11.1-0.20250913111909-19135e5d37be h1:D7bFu20Qr2P+hLgv/bWVhscuQ2tt0y0km8fTVZ5ThmY=
github.com/anhgelus/gokord v0.11.1-0.20250913111909-19135e5d37be/go.mod h1:J/Ja3EIKFOxxy5lx09kjsxyrwv4ardc015cMtmM8XPg=
+github.com/anhgelus/gokord v0.11.1-0.20250913150335-4bcccc1dab83 h1:LyaYwAVoULEXib96M8YlJF7So2srAZktGN6Y6xiOBxs=
+github.com/anhgelus/gokord v0.11.1-0.20250913150335-4bcccc1dab83/go.mod h1:MKTSrPK2w9VCDYHPQ8KwSAVFEFYF0LU8FaBEhNq4VoU=
+github.com/anhgelus/gokord v0.11.1-0.20250913175430-bf95758b4d3b h1:p9XoghqPoBwj2GDR4SNyirKZVm6UI4KNPBa387G8LKM=
+github.com/anhgelus/gokord v0.11.1-0.20250913175430-bf95758b4d3b/go.mod h1:MKTSrPK2w9VCDYHPQ8KwSAVFEFYF0LU8FaBEhNq4VoU=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
@@ -74,6 +78,10 @@ github.com/nyttikord/gokord v0.30.0 h1:O4LhpCMyfWcgLqziPXQgMCopb9VO7kwcZG3phblOa
github.com/nyttikord/gokord v0.30.0/go.mod h1:Lhk268VlZ1W6Pb3kYnlU9bIuTCioaumedjHdtw1sxck=
github.com/nyttikord/gokord v0.30.1-0.20250913111646-475b917cccfb h1:HUL4CikIHguqjKrAqzXYghkzlaZi8+54BBObxBUgeos=
github.com/nyttikord/gokord v0.30.1-0.20250913111646-475b917cccfb/go.mod h1:Lhk268VlZ1W6Pb3kYnlU9bIuTCioaumedjHdtw1sxck=
+github.com/nyttikord/gokord v0.30.1-0.20250913143152-425cd430dee0 h1:bvSFyK1JXTupt67Y78pzbFPg/5tBaouK0BxAfvpwZBw=
+github.com/nyttikord/gokord v0.30.1-0.20250913143152-425cd430dee0/go.mod h1:Lhk268VlZ1W6Pb3kYnlU9bIuTCioaumedjHdtw1sxck=
+github.com/nyttikord/gokord v0.30.1-0.20250913173431-8e43619c03fa h1:P9zaVyRF0bDnmhUg6PaNfmyUqDZ+EvHpBnCdH0/0T3s=
+github.com/nyttikord/gokord v0.30.1-0.20250913173431-8e43619c03fa/go.mod h1:Lhk268VlZ1W6Pb3kYnlU9bIuTCioaumedjHdtw1sxck=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
diff --git a/main.go b/main.go
index 7db4893..7be2e68 100644
--- a/main.go
+++ b/main.go
@@ -12,12 +12,12 @@ import (
"git.anhgelus.world/anhgelus/les-copaings-bot/user"
"github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/cmd"
- "github.com/anhgelus/gokord/logger"
"github.com/joho/godotenv"
discordgo "github.com/nyttikord/gokord"
"github.com/nyttikord/gokord/discord"
"github.com/nyttikord/gokord/discord/types"
"github.com/nyttikord/gokord/interaction"
+ "github.com/nyttikord/gokord/logger"
"golang.org/x/image/font/opentype"
"gonum.org/v1/plot"
"gonum.org/v1/plot/font"
@@ -42,7 +42,7 @@ var interTTF []byte
func init() {
err := godotenv.Load()
if err != nil && !errors.Is(err, os.ErrNotExist) {
- logger.Warn("Error while loading .env file", "error", err.Error())
+ logger.Log(logger.LevelError, 0, "Error while loading .env file: %v", err.Error())
}
flag.StringVar(&token, "token", os.Getenv("TOKEN"), "token of the bot")
@@ -165,7 +165,7 @@ func main() {
user.PeriodicReducer(dg)
stopPeriodicReducer = gokord.NewTimer(d, func(stop chan<- interface{}) {
- logger.Debug("Periodic reducer")
+ dg.LogDebug("Periodic reducer")
user.PeriodicReducer(dg)
})
},
@@ -179,7 +179,7 @@ func main() {
// interaction: /config
bot.HandleMessageComponent(func(s *discordgo.Session, i *discordgo.InteractionCreate, data interaction.MessageComponentData, resp *cmd.ResponseBuilder) {
if len(data.Values) != 1 {
- logger.Alert("main.go - Handle config modify", "invalid data values", "values", data.Values)
+ bot.LogError(errors.New("invalid data values"), "handle config modify, values: %#v", data.Values)
return
}
switch data.Values[0] {
@@ -192,7 +192,7 @@ func main() {
case config.ModifyTimeReduce:
config.HandleModifyPeriodicReduce(s, i, data, resp)
default:
- logger.Alert("main.go - Detecting value", "unkown value", "value", data.Values[0])
+ bot.LogError(errors.New("unknown value"), "detecting value %s", data.Values[0])
return
}
}, commands.ConfigModify)
diff --git a/user/level.go b/user/level.go
index 6f92ce7..e11ac03 100644
--- a/user/level.go
+++ b/user/level.go
@@ -8,59 +8,44 @@ import (
"git.anhgelus.world/anhgelus/les-copaings-bot/config"
"git.anhgelus.world/anhgelus/les-copaings-bot/exp"
"github.com/anhgelus/gokord"
- "github.com/anhgelus/gokord/logger"
discordgo "github.com/nyttikord/gokord"
"github.com/nyttikord/gokord/user"
)
-func onNewLevel(dg *discordgo.Session, m *user.Member, level uint) {
+func onNewLevel(s *discordgo.Session, m *user.Member, level uint) {
cfg := config.GetGuildConfig(m.GuildID)
xpForLevel := exp.LevelXP(level)
for _, role := range cfg.XpRoles {
if role.XP <= xpForLevel && !slices.Contains(m.Roles, role.RoleID) {
- logger.Debug(
- "Add role",
- "role_id", role.RoleID,
- "user_id", m.User.ID,
- "guild_id", m.GuildID,
- )
- err := dg.GuildAPI().MemberRoleAdd(m.GuildID, m.User.ID, role.RoleID)
+ s.LogDebug("add role %s to %s in %s", role.RoleID, m.DisplayName(), m.GuildID)
+ err := s.GuildAPI().MemberRoleAdd(m.GuildID, m.User.ID, role.RoleID)
if err != nil {
- logger.Alert("user/level.go - Adding role", err.Error(), "role_id", role.RoleID)
+ s.LogError(err, "adding role %s to %s in %s", role.RoleID, m.DisplayName(), m.GuildID)
}
} else if role.XP > xpForLevel && slices.Contains(m.Roles, role.RoleID) {
- logger.Debug(
- "Remove role",
- "role_id", role.RoleID,
- "user_id", m.User.ID,
- "guild_id", m.GuildID,
- )
- err := dg.GuildAPI().MemberRoleRemove(m.GuildID, m.User.ID, role.RoleID)
+ s.LogDebug("remove role %s to %s in %s", role.RoleID, m.DisplayName(), m.GuildID)
+ err := s.GuildAPI().MemberRoleRemove(m.GuildID, m.User.ID, role.RoleID)
if err != nil {
- logger.Alert("user/level.go - Removing role", err.Error(), "role_id", role.RoleID)
+ s.LogError(err, "removing role s to %s in %s", role.RoleID, m.DisplayName(), m.GuildID)
}
}
}
}
-func (c *Copaing) OnNewLevel(dg *discordgo.Session, level uint) {
- m, err := dg.GuildAPI().Member(c.GuildID, c.DiscordID)
+func (c *Copaing) OnNewLevel(s *discordgo.Session, level uint) {
+ m, err := s.GuildAPI().Member(c.GuildID, c.DiscordID)
if err != nil {
- logger.Alert(
- "user/level.go - Getting member for new level", err.Error(),
- "discord_id", c.DiscordID,
- "guild_id", c.GuildID,
- )
+ s.LogError(err, "getting member %s in %s for new level", c.DiscordID, c.GuildID)
return
}
- onNewLevel(dg, m, level)
+ onNewLevel(s, m, level)
}
-func PeriodicReducer(dg *discordgo.Session) {
+func PeriodicReducer(s *discordgo.Session) {
wg := &sync.WaitGroup{}
var cs []*Copaing
if err := gokord.DB.Find(&cs).Error; err != nil {
- logger.Alert("user/level.go - Fetching all copaings", err.Error())
+ s.LogError(err, "fetching all copaings")
return
}
cxps := make([]*cXP, len(cs))
@@ -73,7 +58,7 @@ func PeriodicReducer(dg *discordgo.Session) {
defer wg.Done()
xp, err := c.GetXP()
if err != nil {
- logger.Alert("user/level.go - Getting XP", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID)
+ s.LogError(err, "getting xp of copaing %d in %s", c.ID, c.GuildID)
xp = 0
}
cxps[i] = &cXP{
@@ -83,7 +68,7 @@ func PeriodicReducer(dg *discordgo.Session) {
}()
}
wg.Wait()
- for _, g := range dg.State.Guilds {
+ for _, g := range s.State.Guilds {
wg.Add(1)
go func() {
defer wg.Done()
@@ -93,26 +78,26 @@ func PeriodicReducer(dg *discordgo.Session) {
Where("guild_id = ? and created_at < ?", g.ID, exp.TimeStampNDaysBefore(cfg.DaysXPRemains)).
Delete(&CopaingXP{})
if res.Error != nil {
- logger.Alert("user/level.go - Removing old XP", res.Error.Error(), "guild_id", g.ID)
+ s.LogError(res.Error, "removing old xp in %s", g.ID)
}
- logger.Debug("Guild cleaned", "guild", g.Name, "rows affected", res.RowsAffected)
+ s.LogDebug("Guild cleaned %s, rows affected: %d", g.Name, res.RowsAffected)
}()
}
wg.Wait()
for i, c := range cxps {
if i%50 == 49 {
- logger.Debug("Sleeping...")
+ s.LogDebug("Sleeping...")
time.Sleep(15 * time.Second) // prevents spamming the API
}
oldXp := c.GetXP()
xp, err := c.ToCopaing().GetXP()
if err != nil {
- logger.Alert("user/level.go - Getting XP", err.Error(), "guild_id", c.ID, "discord_id", c.DiscordID)
+ s.LogError(err, "getting xp of copaing %s in %s", c.ID, c.GuildID)
continue
}
if exp.Level(oldXp) != exp.Level(xp) {
- c.OnNewLevel(dg, exp.Level(xp))
+ c.OnNewLevel(s, exp.Level(xp))
}
}
- logger.Debug("Periodic reduce finished", "len(guilds)", len(dg.State.Guilds))
+ s.LogDebug("Periodic reduce finished for %d guilds", len(s.State.Guilds))
}
diff --git a/user/xp.go b/user/xp.go
index 550f3bf..d130cae 100644
--- a/user/xp.go
+++ b/user/xp.go
@@ -7,8 +7,8 @@ import (
"git.anhgelus.world/anhgelus/les-copaings-bot/config"
"git.anhgelus.world/anhgelus/les-copaings-bot/exp"
"github.com/anhgelus/gokord"
- "github.com/anhgelus/gokord/logger"
discordgo "github.com/nyttikord/gokord"
+ "github.com/nyttikord/gokord/logger"
"github.com/nyttikord/gokord/user"
)
@@ -28,23 +28,14 @@ func (c *cXP) GetXP() uint {
func (c *Copaing) AddXP(s *discordgo.Session, m *user.Member, xp uint, fn func(uint, uint)) {
old, err := c.GetXP()
if err != nil {
- logger.Alert("user/xp.go - Getting xp", err.Error(), "discord_id", c.DiscordID, "guild_id", c.GuildID)
+ s.LogError(err, "getting xp for %s in %s", m.DisplayName(), c.GuildID)
return
}
pastLevel := exp.Level(old)
- logger.Debug("Adding xp", "member", m.DisplayName(), "old xp", old, "xp to add", xp, "old level", pastLevel)
+ s.LogDebug("Adding xp to %s, old: %d, to add: %d", m.DisplayName(), old, xp)
c.CopaingXPs = append(c.CopaingXPs, CopaingXP{CopaingID: c.ID, XP: xp, GuildID: c.GuildID})
if err = c.Save(); err != nil {
- logger.Alert(
- "user/xp.go - Saving user",
- err.Error(),
- "xp",
- c.CopaingXPs,
- "discord_id",
- c.DiscordID,
- "guild_id",
- c.GuildID,
- )
+ s.LogError(err, "saving user %s with xp %d in %s", m.DisplayName(), xp, c.GuildID)
return
}
newLevel := exp.Level(old + xp)
@@ -78,7 +69,7 @@ func (c *Copaing) GetXPForDays(n uint) (uint, error) {
var cxp CopaingXP
err = gokord.DB.ScanRows(rows, &cxp)
if err != nil {
- logger.Alert("user/xp.go - Scanning rows", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID)
+ logger.Log(logger.LevelError, 0, "scanning rows of copaing %d in %s: %#v", c.ID, c.GuildID, err.Error())
continue
}
xp += cxp.XP
@@ -105,7 +96,7 @@ func GetBestXP(guildId string, n uint, d int) ([]CopaingAccess, error) {
var c Copaing
err = gokord.DB.ScanRows(rows, &c)
if err != nil {
- logger.Alert("user/xp.go - Scanning rows", err.Error(), "guild_id", guildId)
+ logger.Log(logger.LevelError, 0, "scanning rows of copaing %d in %s: %#v", c.ID, c.GuildID, err.Error())
continue
}
wg.Add(1)
@@ -113,7 +104,7 @@ func GetBestXP(guildId string, n uint, d int) ([]CopaingAccess, error) {
defer wg.Done()
xp, err := c.GetXPForDays(uint(d))
if err != nil {
- logger.Alert("user/xp.go - Fetching xp", err.Error(), "discord_id", c.DiscordID, "guild_id", guildId)
+ logger.Log(logger.LevelError, 0, "fetching xp of copaing %d in %s: %#v", c.ID, c.GuildID, err.Error())
return
}
l = append(l, &cXP{Cxp: xp, Copaing: &c})