build(gokord): upgrade to latest version

This commit is contained in:
Anhgelus Morhtuuzh 2025-08-06 02:22:06 +02:00
parent d72004ae14
commit 5a8da1eaeb
Signed by: anhgelus
GPG key ID: CAD341EFA92DDDE5
13 changed files with 136 additions and 146 deletions

View file

@ -3,7 +3,8 @@ package commands
import ( import (
"fmt" "fmt"
"github.com/anhgelus/gokord" "github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/cmd"
"github.com/anhgelus/gokord/logger"
"github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/config"
"github.com/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/les-copaings-bot/exp"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
@ -33,7 +34,7 @@ var (
configModifyMap = map[string]uint{} configModifyMap = map[string]uint{}
) )
func Config(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { func Config(s *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
cfg := config.GetGuildConfig(i.GuildID) cfg := config.GetGuildConfig(i.GuildID)
roles := "" roles := ""
l := len(cfg.XpRoles) - 1 l := len(cfg.XpRoles) - 1
@ -69,7 +70,7 @@ func Config(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.O
err := resp.AddEmbed(&discordgo.MessageEmbed{ err := resp.AddEmbed(&discordgo.MessageEmbed{
Type: discordgo.EmbedTypeRich, Type: discordgo.EmbedTypeRich,
Title: "Config", Title: "Config",
Color: utils.Success, Color: 0x10E6AD,
Fields: []*discordgo.MessageEmbedField{ Fields: []*discordgo.MessageEmbedField{
{ {
Name: "Salon par défaut", Name: "Salon par défaut",
@ -127,7 +128,7 @@ func Config(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.O
}, },
}}).IsEphemeral().Send() }}).IsEphemeral().Send()
if err != nil { if err != nil {
utils.SendAlert("config/guild.go - Sending config", err.Error()) logger.Alert("config/guild.go - Sending config", err.Error())
} }
} }
@ -138,7 +139,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
cfg := config.GetGuildConfig(i.GuildID) cfg := config.GetGuildConfig(i.GuildID)
resp := utils.NewResponseBuilder(s, i) resp := cmd.NewResponseBuilder(s, i)
msgData := i.MessageComponentData() msgData := i.MessageComponentData()
switch msgData.CustomID { switch msgData.CustomID {
@ -173,7 +174,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
}, },
}}).Send() }}).Send()
if err != nil { if err != nil {
utils.SendAlert("config/guild.go - Sending config", err.Error()) logger.Alert("config/guild.go - Sending config", err.Error())
} }
case XpRoleAdd, XpRoleEdit: case XpRoleAdd, XpRoleEdit:
cID := XpRoleAddLevel cID := XpRoleAddLevel
@ -195,7 +196,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
}}). }}).
Send() Send()
if err != nil { if err != nil {
utils.SendAlert("config/guild.go - Sending modal to add", err.Error()) logger.Alert("config/guild.go - Sending modal to add", err.Error())
} }
case XpRoleAddRole: case XpRoleAddRole:
roleId := msgData.Values[0] roleId := msgData.Values[0]
@ -203,7 +204,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
if r.RoleID == roleId { if r.RoleID == roleId {
err := resp.SetMessage("Le rôle est déjà présent dans la config").Send() err := resp.SetMessage("Le rôle est déjà présent dans la config").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Role already in config", err.Error()) logger.Alert("commands/config.go - Role already in config", err.Error())
} }
return return
} }
@ -214,7 +215,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
}) })
err := cfg.Save() err := cfg.Save()
if err != nil { if err != nil {
utils.SendAlert( logger.Alert(
"commands/config.go - Saving config", "commands/config.go - Saving config",
err.Error(), err.Error(),
"guild_id", i.GuildID, "guild_id", i.GuildID,
@ -223,7 +224,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
) )
} }
if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil { if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil {
utils.SendAlert("commands/config.go - Sending success", err.Error()) logger.Alert("commands/config.go - Sending success", err.Error())
} }
case XpRoleEditRole: case XpRoleEditRole:
roleId := msgData.Values[0] roleId := msgData.Values[0]
@ -231,14 +232,14 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
if r == nil { if r == nil {
err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Role not found (edit)", err.Error()) logger.Alert("commands/config.go - Role not found (edit)", err.Error())
} }
return return
} }
r.XP = configModifyMap[getKeyConfigRole(i)] r.XP = configModifyMap[getKeyConfigRole(i)]
err := gokord.DB.Save(r).Error err := gokord.DB.Save(r).Error
if err != nil { if err != nil {
utils.SendAlert( logger.Alert(
"commands/config.go - Saving config", "commands/config.go - Saving config",
err.Error(), err.Error(),
"guild_id", i.GuildID, "guild_id", i.GuildID,
@ -247,7 +248,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
) )
} }
if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil { if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil {
utils.SendAlert("commands/config.go - Sending success", err.Error()) logger.Alert("commands/config.go - Sending success", err.Error())
} }
case XpRoleDel: case XpRoleDel:
err := resp.IsEphemeral(). err := resp.IsEphemeral().
@ -258,7 +259,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
}}}). }}}).
Send() Send()
if err != nil { if err != nil {
utils.SendAlert("config/guild.go - Sending response to del", err.Error()) logger.Alert("config/guild.go - Sending response to del", err.Error())
} }
case XpRoleDelRole: case XpRoleDelRole:
roleId := msgData.Values[0] roleId := msgData.Values[0]
@ -266,13 +267,13 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
if r == nil { if r == nil {
err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Role not found (del)", err.Error()) logger.Alert("commands/config.go - Role not found (del)", err.Error())
} }
return return
} }
err := gokord.DB.Delete(r).Error err := gokord.DB.Delete(r).Error
if err != nil { if err != nil {
utils.SendAlert( logger.Alert(
"commands/config.go - Deleting entry", "commands/config.go - Deleting entry",
err.Error(), err.Error(),
"guild_id", i.GuildID, "guild_id", i.GuildID,
@ -281,12 +282,12 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
) )
} }
if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil { if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil {
utils.SendAlert("commands/config.go - Sending success", err.Error()) logger.Alert("commands/config.go - Sending success", err.Error())
} }
default: default:
err := resp.SetMessage("Le type d'action n'est pas valide.").Send() err := resp.SetMessage("Le type d'action n'est pas valide.").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Invalid action type", err.Error()) logger.Alert("commands/config.go - Invalid action type", err.Error())
} }
return return
} }
@ -296,7 +297,7 @@ func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) {
if i.Type != discordgo.InteractionModalSubmit { if i.Type != discordgo.InteractionModalSubmit {
return return
} }
resp := utils.NewResponseBuilder(s, i) resp := cmd.NewResponseBuilder(s, i)
modalData := i.ModalSubmitData() modalData := i.ModalSubmitData()
@ -312,7 +313,7 @@ func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) {
if err = resp.IsEphemeral(). if err = resp.IsEphemeral().
SetMessage("Impossible de lire le nombre. Il doit s'agit d'un nombre entier positif."). SetMessage("Impossible de lire le nombre. Il doit s'agit d'un nombre entier positif.").
Send(); err != nil { Send(); err != nil {
utils.SendAlert("command/config.go - Sending bad number", err.Error()) logger.Alert("command/config.go - Sending bad number", err.Error())
} }
return return
} }
@ -337,7 +338,7 @@ func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) {
}}}). }}}).
Send() Send()
if err != nil { if err != nil {
utils.SendAlert("config/guild.go - Sending response to add/edit", err.Error()) logger.Alert("config/guild.go - Sending response to add/edit", err.Error())
} }
} }
@ -345,14 +346,14 @@ func getKeyConfigRole(i *discordgo.InteractionCreate) string {
return fmt.Sprintf("r:%s:%s", i.GuildID, i.User.ID) return fmt.Sprintf("r:%s:%s", i.GuildID, i.User.ID)
} }
func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) {
resp.IsEphemeral() resp.IsEphemeral()
// verify every args // verify every args
t, ok := optMap["type"] t, ok := optMap["type"]
if !ok { if !ok {
err := resp.SetMessage("Le type d'action n'a pas été renseigné.").Send() err := resp.SetMessage("Le type d'action n'a pas été renseigné.").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Action type not set", err.Error()) logger.Alert("commands/config.go - Action type not set", err.Error())
} }
return return
} }
@ -361,7 +362,7 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap
if !ok { if !ok {
err := resp.SetMessage("Le salon n'a pas été renseigné.").Send() err := resp.SetMessage("Le salon n'a pas été renseigné.").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Channel not set (disabled)", err.Error()) logger.Alert("commands/config.go - Channel not set (disabled)", err.Error())
} }
return return
} }
@ -372,7 +373,7 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap
if strings.Contains(cfg.DisabledChannels, channel.ID) { if strings.Contains(cfg.DisabledChannels, channel.ID) {
err := resp.SetMessage("Le salon est déjà dans la liste des salons désactivés").Send() err := resp.SetMessage("Le salon est déjà dans la liste des salons désactivés").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Channel already disabled", err.Error()) logger.Alert("commands/config.go - Channel already disabled", err.Error())
} }
return return
} }
@ -381,7 +382,7 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap
if !strings.Contains(cfg.DisabledChannels, channel.ID) { if !strings.Contains(cfg.DisabledChannels, channel.ID) {
err := resp.SetMessage("Le salon n'est pas désactivé").Send() err := resp.SetMessage("Le salon n'est pas désactivé").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Channel not disabled", err.Error()) logger.Alert("commands/config.go - Channel not disabled", err.Error())
} }
return return
} }
@ -389,14 +390,14 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap
default: default:
err := resp.SetMessage("Le type d'action n'est pas valide.").Send() err := resp.SetMessage("Le type d'action n'est pas valide.").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Invalid action type", err.Error()) logger.Alert("commands/config.go - Invalid action type", err.Error())
} }
return return
} }
// save // save
err := cfg.Save() err := cfg.Save()
if err != nil { if err != nil {
utils.SendAlert( logger.Alert(
"commands/config.go - Saving config", "commands/config.go - Saving config",
err.Error(), err.Error(),
"guild_id", "guild_id",
@ -411,18 +412,18 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap
err = resp.SetMessage("Modification sauvegardé.").Send() err = resp.SetMessage("Modification sauvegardé.").Send()
} }
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Modification saved message", err.Error()) logger.Alert("commands/config.go - Modification saved message", err.Error())
} }
} }
func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) {
resp.IsEphemeral() resp.IsEphemeral()
// verify every args // verify every args
salon, ok := optMap["channel"] salon, ok := optMap["channel"]
if !ok { if !ok {
err := resp.SetMessage("Le salon n'a pas été renseigné.").Send() err := resp.SetMessage("Le salon n'a pas été renseigné.").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Channel not set (fallback)", err.Error()) logger.Alert("commands/config.go - Channel not set (fallback)", err.Error())
} }
return return
} }
@ -430,7 +431,7 @@ func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate,
if channel.Type != discordgo.ChannelTypeGuildText { if channel.Type != discordgo.ChannelTypeGuildText {
err := resp.SetMessage("Le salon n'est pas un salon textuel.").Send() err := resp.SetMessage("Le salon n'est pas un salon textuel.").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Invalid channel type", err.Error()) logger.Alert("commands/config.go - Invalid channel type", err.Error())
} }
return return
} }
@ -439,7 +440,7 @@ func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate,
// save // save
err := cfg.Save() err := cfg.Save()
if err != nil { if err != nil {
utils.SendAlert( logger.Alert(
"commands/config.go - Saving config", "commands/config.go - Saving config",
err.Error(), err.Error(),
"guild_id", "guild_id",
@ -452,18 +453,18 @@ func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate,
err = resp.SetMessage("Salon enregistré.").Send() err = resp.SetMessage("Salon enregistré.").Send()
} }
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Channel saved message", err.Error()) logger.Alert("commands/config.go - Channel saved message", err.Error())
} }
} }
func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) {
resp.IsEphemeral() resp.IsEphemeral()
// verify every args // verify every args
days, ok := optMap["days"] days, ok := optMap["days"]
if !ok { if !ok {
err := resp.SetMessage("Le nombre de jours n'a pas été renseigné.").Send() err := resp.SetMessage("Le nombre de jours n'a pas été renseigné.").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Days not set (fallback)", err.Error()) logger.Alert("commands/config.go - Days not set (fallback)", err.Error())
} }
return return
} }
@ -471,7 +472,7 @@ func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCrea
if d < 30 { if d < 30 {
err := resp.SetMessage("Le nombre de jours est inférieur à 30.").Send() err := resp.SetMessage("Le nombre de jours est inférieur à 30.").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Days < 30 (fallback)", err.Error()) logger.Alert("commands/config.go - Days < 30 (fallback)", err.Error())
} }
return return
} }
@ -480,7 +481,7 @@ func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCrea
cfg.DaysXPRemains = uint(d) cfg.DaysXPRemains = uint(d)
err := cfg.Save() err := cfg.Save()
if err != nil { if err != nil {
utils.SendAlert( logger.Alert(
"commands/config.go - Saving config", "commands/config.go - Saving config",
err.Error(), err.Error(),
"guild_id", "guild_id",
@ -493,6 +494,6 @@ func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCrea
err = resp.SetMessage("Nombre de jours enregistré.").Send() err = resp.SetMessage("Nombre de jours enregistré.").Send()
} }
if err != nil { if err != nil {
utils.SendAlert("commands/config.go - Days saved message", err.Error()) logger.Alert("commands/config.go - Days saved message", err.Error())
} }
} }

View file

@ -1,17 +1,18 @@
package commands package commands
import ( import (
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/cmd"
"github.com/anhgelus/gokord/logger"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
) )
func Credits(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { func Credits(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
err := resp.AddEmbed(&discordgo.MessageEmbed{ err := resp.AddEmbed(&discordgo.MessageEmbed{
Type: discordgo.EmbedTypeRich, Type: discordgo.EmbedTypeRich,
Title: "Crédits", Title: "Crédits",
Description: "Auteur du bot : @anhgelus (https://github.com/anhgelus)\nLangage : Go 1.24\nLicence : AGPLv3", Description: "Auteur du bot : @anhgelus (https://github.com/anhgelus)\nLangage : Go 1.24\nLicence : AGPLv3",
Color: utils.Success, Color: 0x10E6AD,
Fields: []*discordgo.MessageEmbedField{ Fields: []*discordgo.MessageEmbedField{
{ {
Name: "anhgelus/gokord", Name: "anhgelus/gokord",
@ -31,6 +32,6 @@ func Credits(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.
}, },
}).Send() }).Send()
if err != nil { if err != nil {
utils.SendAlert("commands/credits.go - Sending credits", err.Error(), "guild_id", i.GuildID) logger.Alert("commands/credits.go - Sending credits", err.Error(), "guild_id", i.GuildID)
} }
} }

View file

@ -2,13 +2,14 @@ package commands
import ( import (
"fmt" "fmt"
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/cmd"
"github.com/anhgelus/gokord/logger"
"github.com/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/les-copaings-bot/exp"
"github.com/anhgelus/les-copaings-bot/user" "github.com/anhgelus/les-copaings-bot/user"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
) )
func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) {
c := user.GetCopaing(i.Member.User.ID, i.GuildID) // current user = member who used /rank c := user.GetCopaing(i.Member.User.ID, i.GuildID) // current user = member who used /rank
msg := "Votre niveau" msg := "Votre niveau"
m := i.Member m := i.Member
@ -18,12 +19,12 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opt
if u.Bot { if u.Bot {
err = resp.SetMessage("Imagine si les bots avaient un niveau :rolling_eyes:").IsEphemeral().Send() err = resp.SetMessage("Imagine si les bots avaient un niveau :rolling_eyes:").IsEphemeral().Send()
if err != nil { if err != nil {
utils.SendAlert("commands/rank.go - Reply error user is a bot", err.Error()) logger.Alert("commands/rank.go - Reply error user is a bot", err.Error())
} }
} }
m, err = s.GuildMember(i.GuildID, u.ID) m, err = s.GuildMember(i.GuildID, u.ID)
if err != nil { if err != nil {
utils.SendAlert( logger.Alert(
"commands/rank.go - Fetching guild member", "commands/rank.go - Fetching guild member",
err.Error(), err.Error(),
"discord_id", "discord_id",
@ -33,7 +34,7 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opt
) )
err = resp.SetMessage("Erreur : impossible de récupérer le membre").IsEphemeral().Send() err = resp.SetMessage("Erreur : impossible de récupérer le membre").IsEphemeral().Send()
if err != nil { if err != nil {
utils.SendAlert("commands/rank.go - Reply error fetching guild member", err.Error()) logger.Alert("commands/rank.go - Reply error fetching guild member", err.Error())
} }
return return
} }
@ -42,7 +43,7 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opt
} }
xp, err := c.GetXP() xp, err := c.GetXP()
if err != nil { if err != nil {
utils.SendAlert( logger.Alert(
"commands/rank.go - Fetching xp", "commands/rank.go - Fetching xp",
err.Error(), err.Error(),
"discord_id", "discord_id",
@ -52,7 +53,7 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opt
) )
err = resp.SetMessage("Erreur : impossible de récupérer l'XP").IsEphemeral().Send() err = resp.SetMessage("Erreur : impossible de récupérer l'XP").IsEphemeral().Send()
if err != nil { if err != nil {
utils.SendAlert("commands/rank.go - Reply error fetching xp", err.Error()) logger.Alert("commands/rank.go - Reply error fetching xp", err.Error())
} }
return return
} }
@ -66,6 +67,6 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opt
nxtLvlXP-xp, nxtLvlXP-xp,
)).Send() )).Send()
if err != nil { if err != nil {
utils.SendAlert("commands/rank.go - Sending rank", err.Error()) logger.Alert("commands/rank.go - Sending rank", err.Error())
} }
} }

View file

@ -2,44 +2,45 @@ package commands
import ( import (
"github.com/anhgelus/gokord" "github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/cmd"
"github.com/anhgelus/gokord/logger"
"github.com/anhgelus/les-copaings-bot/user" "github.com/anhgelus/les-copaings-bot/user"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
) )
func Reset(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { func Reset(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
var copaings []*user.Copaing var copaings []*user.Copaing
gokord.DB.Where("guild_id = ?", i.GuildID).Delete(&copaings) gokord.DB.Where("guild_id = ?", i.GuildID).Delete(&copaings)
if err := resp.IsEphemeral().SetMessage("L'XP a été reset.").Send(); err != nil { if err := resp.IsEphemeral().SetMessage("L'XP a été reset.").Send(); err != nil {
utils.SendAlert("commands/reset.go - Sending success (all)", err.Error()) logger.Alert("commands/reset.go - Sending success (all)", err.Error())
} }
} }
func ResetUser(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { func ResetUser(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) {
resp.IsEphemeral() resp.IsEphemeral()
v, ok := optMap["user"] v, ok := optMap["user"]
if !ok { if !ok {
if err := resp.SetMessage("Le user n'a pas été renseigné.").Send(); err != nil { if err := resp.SetMessage("Le user n'a pas été renseigné.").Send(); err != nil {
utils.SendAlert("commands/reset.go - Copaing not set", err.Error()) logger.Alert("commands/reset.go - Copaing not set", err.Error())
} }
return return
} }
m := v.UserValue(s) m := v.UserValue(s)
if m.Bot { if m.Bot {
if err := resp.SetMessage("Les bots n'ont pas de niveau :upside_down:").Send(); err != nil { if err := resp.SetMessage("Les bots n'ont pas de niveau :upside_down:").Send(); err != nil {
utils.SendAlert("commands/reset.go - Copaing not set", err.Error()) logger.Alert("commands/reset.go - Copaing not set", err.Error())
} }
return return
} }
err := user.GetCopaing(m.ID, i.GuildID).Delete() err := user.GetCopaing(m.ID, i.GuildID).Delete()
if err != nil { if err != nil {
utils.SendAlert("commands/reset.go - Copaing not deleted", err.Error(), "discord_id", m.ID, "guild_id", i.GuildID) logger.Alert("commands/reset.go - Copaing not deleted", err.Error(), "discord_id", m.ID, "guild_id", i.GuildID)
err = resp.SetMessage("Erreur : impossible de reset l'utilisateur").Send() err = resp.SetMessage("Erreur : impossible de reset l'utilisateur").Send()
if err != nil { if err != nil {
utils.SendAlert("commands/reset.go - Error deleting", err.Error()) logger.Alert("commands/reset.go - Error deleting", err.Error())
} }
} }
if err = resp.SetMessage("Le user bien été reset.").Send(); err != nil { if err = resp.SetMessage("Le user bien été reset.").Send(); err != nil {
utils.SendAlert("commands/reset.go - Sending success (user)", err.Error()) logger.Alert("commands/reset.go - Sending success (user)", err.Error())
} }
} }

View file

@ -2,7 +2,8 @@ package commands
import ( import (
"fmt" "fmt"
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/cmd"
"github.com/anhgelus/gokord/logger"
"github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/config"
"github.com/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/les-copaings-bot/exp"
"github.com/anhgelus/les-copaings-bot/user" "github.com/anhgelus/les-copaings-bot/user"
@ -10,10 +11,10 @@ import (
"sync" "sync"
) )
func Top(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { func Top(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
err := resp.IsDeferred().Send() err := resp.IsDeferred().Send()
if err != nil { if err != nil {
utils.SendAlert("commands/top.go - Sending deferred", err.Error()) logger.Alert("commands/top.go - Sending deferred", err.Error())
return return
} }
embeds := make([]*discordgo.MessageEmbed, 3) embeds := make([]*discordgo.MessageEmbed, 3)
@ -23,18 +24,18 @@ func Top(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opti
defer wg.Done() defer wg.Done()
tops, err := user.GetBestXP(i.GuildID, n, d) tops, err := user.GetBestXP(i.GuildID, n, d)
if err != nil { if err != nil {
utils.SendAlert("commands/top.go - Fetching best xp", err.Error(), "n", n, "d", d, "id", id, "guild_id", i.GuildID) logger.Alert("commands/top.go - Fetching best xp", err.Error(), "n", n, "d", d, "id", id, "guild_id", i.GuildID)
embeds[id] = &discordgo.MessageEmbed{ embeds[id] = &discordgo.MessageEmbed{
Title: s, Title: s,
Description: "Erreur : impossible de récupérer la liste", Description: "Erreur : impossible de récupérer la liste",
Color: utils.Error, Color: 0x831010,
} }
return return
} }
embeds[id] = &discordgo.MessageEmbed{ embeds[id] = &discordgo.MessageEmbed{
Title: s, Title: s,
Description: genTopsMessage(tops), Description: genTopsMessage(tops),
Color: utils.Success, Color: 0x10E6AD,
} }
} }
cfg := config.GetGuildConfig(i.GuildID) cfg := config.GetGuildConfig(i.GuildID)
@ -57,7 +58,7 @@ func Top(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opti
} }
err = resp.Send() err = resp.Send()
if err != nil { if err != nil {
utils.SendAlert("commands/top.go - Sending response top", err.Error()) logger.Alert("commands/top.go - Sending response top", err.Error())
} }
}() }()
} }

View file

@ -2,7 +2,7 @@ package config
import ( import (
"github.com/anhgelus/gokord" "github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/logger"
"strings" "strings"
) )
@ -25,7 +25,7 @@ type XpRole struct {
func GetGuildConfig(guildID string) *GuildConfig { func GetGuildConfig(guildID string) *GuildConfig {
cfg := GuildConfig{GuildID: guildID} cfg := GuildConfig{GuildID: guildID}
if err := cfg.Load(); err != nil { if err := cfg.Load(); err != nil {
utils.SendAlert("config/guild.go - Loading guild config", err.Error(), "guild_id", guildID) logger.Alert("config/guild.go - Loading guild config", err.Error(), "guild_id", guildID)
return nil return nil
} }
return &cfg return &cfg

View file

@ -2,7 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/logger"
"github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/config"
"github.com/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/les-copaings-bot/exp"
"github.com/anhgelus/les-copaings-bot/user" "github.com/anhgelus/les-copaings-bot/user"
@ -37,7 +37,7 @@ func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) {
xp := min(exp.MessageXP(uint(len(trimmed)), exp.CalcDiversity(trimmed)), MaxXpPerMessage) xp := min(exp.MessageXP(uint(len(trimmed)), exp.CalcDiversity(trimmed)), MaxXpPerMessage)
c.AddXP(s, m.Member, xp, func(_ uint, _ uint) { c.AddXP(s, m.Member, xp, func(_ uint, _ uint) {
if err := s.MessageReactionAdd(m.ChannelID, m.Message.ID, "⬆"); err != nil { if err := s.MessageReactionAdd(m.ChannelID, m.Message.ID, "⬆"); err != nil {
utils.SendAlert( logger.Alert(
"events.go - add reaction for new level", err.Error(), "events.go - add reaction for new level", err.Error(),
"channel id", m.ChannelID, "channel id", m.ChannelID,
"message id", m.Message.ID, "message id", m.Message.ID,
@ -69,7 +69,7 @@ func genMapKey(guildID string, userID string) string {
} }
func onConnection(_ *discordgo.Session, e *discordgo.VoiceStateUpdate) { func onConnection(_ *discordgo.Session, e *discordgo.VoiceStateUpdate) {
utils.SendDebug("User connected", "username", e.Member.DisplayName()) logger.Debug("User connected", "username", e.Member.DisplayName())
connectedSince[genMapKey(e.GuildID, e.UserID)] = time.Now().Unix() connectedSince[genMapKey(e.GuildID, e.UserID)] = time.Now().Unix()
} }
@ -79,17 +79,17 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate) {
// check the validity of user // check the validity of user
con, ok := connectedSince[genMapKey(e.GuildID, e.UserID)] con, ok := connectedSince[genMapKey(e.GuildID, e.UserID)]
if !ok || con == NotConnected { if !ok || con == NotConnected {
utils.SendWarn(fmt.Sprintf( logger.Warn(fmt.Sprintf(
"User %s diconnect from a vocal but was registered as not connected", e.Member.DisplayName(), "User %s diconnect from a vocal but was registered as not connected", e.Member.DisplayName(),
)) ))
return return
} }
timeInVocal := now - con timeInVocal := now - con
utils.SendDebug("User disconnected", "username", e.Member.DisplayName(), "time in vocal", timeInVocal) logger.Debug("User disconnected", "username", e.Member.DisplayName(), "time in vocal", timeInVocal)
connectedSince[genMapKey(e.GuildID, e.UserID)] = NotConnected connectedSince[genMapKey(e.GuildID, e.UserID)] = NotConnected
// add exp // add exp
if timeInVocal < 0 { if timeInVocal < 0 {
utils.SendAlert( logger.Alert(
"events.go - Calculating time spent in vocal", "the time is negative", "events.go - Calculating time spent in vocal", "the time is negative",
"discord_id", e.UserID, "discord_id", e.UserID,
"guild_id", e.GuildID, "guild_id", e.GuildID,
@ -97,7 +97,7 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate) {
return return
} }
if timeInVocal > MaxTimeInVocal { if timeInVocal > MaxTimeInVocal {
utils.SendWarn(fmt.Sprintf("User %s spent more than 6 hours in vocal", e.Member.DisplayName())) logger.Warn(fmt.Sprintf("User %s spent more than 6 hours in vocal", e.Member.DisplayName()))
timeInVocal = MaxTimeInVocal timeInVocal = MaxTimeInVocal
} }
e.Member.GuildID = e.GuildID e.Member.GuildID = e.GuildID
@ -110,19 +110,19 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate) {
"%s est maintenant niveau %d", e.Member.Mention(), newLevel, "%s est maintenant niveau %d", e.Member.Mention(), newLevel,
)) ))
if err != nil { if err != nil {
utils.SendAlert("events.go - Sending new level in fallback channel", err.Error()) logger.Alert("events.go - Sending new level in fallback channel", err.Error())
} }
}) })
} }
func OnLeave(_ *discordgo.Session, e *discordgo.GuildMemberRemove) { func OnLeave(_ *discordgo.Session, e *discordgo.GuildMemberRemove) {
utils.SendDebug("Leave event", "user_id", e.User.ID) logger.Debug("Leave event", "user_id", e.User.ID)
if e.User.Bot { if e.User.Bot {
return return
} }
c := user.GetCopaing(e.User.ID, e.GuildID) c := user.GetCopaing(e.User.ID, e.GuildID)
if err := c.Delete(); err != nil { if err := c.Delete(); err != nil {
utils.SendAlert( logger.Alert(
"events.go - deleting user from db", err.Error(), "events.go - deleting user from db", err.Error(),
"user_id", e.User.ID, "user_id", e.User.ID,
"guild_id", e.GuildID, "guild_id", e.GuildID,

12
go.mod
View file

@ -3,7 +3,7 @@ module github.com/anhgelus/les-copaings-bot
go 1.24 go 1.24
require ( require (
github.com/anhgelus/gokord v0.10.3 github.com/anhgelus/gokord v0.11.1-0.20250806000243-ddfebe2ca6f1
github.com/bwmarrin/discordgo v0.29.0 github.com/bwmarrin/discordgo v0.29.0
github.com/joho/godotenv v1.5.1 github.com/joho/godotenv v1.5.1
github.com/pelletier/go-toml/v2 v2.2.4 github.com/pelletier/go-toml/v2 v2.2.4
@ -21,9 +21,9 @@ require (
github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect github.com/jinzhu/now v1.1.5 // indirect
github.com/redis/go-redis/v9 v9.9.0 // indirect github.com/redis/go-redis/v9 v9.12.0 // indirect
golang.org/x/crypto v0.38.0 // indirect golang.org/x/crypto v0.40.0 // indirect
golang.org/x/sync v0.14.0 // indirect golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.33.0 // indirect golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.25.0 // indirect golang.org/x/text v0.27.0 // indirect
) )

40
go.sum
View file

@ -1,17 +1,9 @@
github.com/anhgelus/gokord v0.7.0 h1:G9GrxD3/xEreXsiz3etKxbeHsNHrwT5I/VEKSWpyrj4= github.com/anhgelus/gokord v0.11.1-0.20250806000243-ddfebe2ca6f1 h1:irHDC/xUm65yLFx5HnVeCbM0qQRpm0i1vQHsyLXeEbo=
github.com/anhgelus/gokord v0.7.0/go.mod h1:SfGKyMMGjNS9F9ehiEb5Cc58P+uoDdLDGGYqXSiMCus= github.com/anhgelus/gokord v0.11.1-0.20250806000243-ddfebe2ca6f1/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k=
github.com/anhgelus/gokord v0.9.0 h1:vz7jHZ6papdt/xehe+nx4DxOLquPO6QukW8UzH81bGY=
github.com/anhgelus/gokord v0.9.0/go.mod h1:NSepHjTV61LUnuyGgHxEhZNMnWREErGFyOtRYPgdx/E=
github.com/anhgelus/gokord v0.10.0 h1:FaaMWntaezmSCvarcSMjfWr5OXVVwwzlDMnNX8gXaWE=
github.com/anhgelus/gokord v0.10.0/go.mod h1:NSepHjTV61LUnuyGgHxEhZNMnWREErGFyOtRYPgdx/E=
github.com/anhgelus/gokord v0.10.3 h1:4uKHRXFsRg1wRJQ3Sikz1MpL68cUZxyseRD+5hVe7tE=
github.com/anhgelus/gokord v0.10.3/go.mod h1:NSepHjTV61LUnuyGgHxEhZNMnWREErGFyOtRYPgdx/E=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= 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/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
github.com/bwmarrin/discordgo v0.28.1 h1:gXsuo2GBO7NbR6uqmrrBDplPUx2T3nzu775q/Rd1aG4=
github.com/bwmarrin/discordgo v0.28.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=
github.com/bwmarrin/discordgo v0.29.0 h1:FmWeXFaKUwrcL3Cx65c20bTRW+vOb6k8AnaP+EgjDno= github.com/bwmarrin/discordgo v0.29.0 h1:FmWeXFaKUwrcL3Cx65c20bTRW+vOb6k8AnaP+EgjDno=
github.com/bwmarrin/discordgo v0.29.0/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/bwmarrin/discordgo v0.29.0/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
@ -28,8 +20,6 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg=
github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ=
github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs=
github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M=
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
@ -44,28 +34,26 @@ github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= 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= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI= github.com/redis/go-redis/v9 v9.12.0 h1:XlVPGlflh4nxfhsNXPA8Qp6EmEfTo0rp8oaBzPipXnU=
github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/redis/go-redis/v9 v9.12.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
github.com/redis/go-redis/v9 v9.9.0 h1:URbPQ4xVQSQhZ27WMQVmZSo3uT3pL+4IdHVcYq2nVfM=
github.com/redis/go-redis/v9 v9.9.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@ -73,9 +61,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314=
gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
gorm.io/gorm v1.26.1 h1:ghB2gUI9FkS46luZtn6DLZ0f6ooBJ5IbVej2ENFDjRw=
gorm.io/gorm v1.26.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs=
gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4= gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=

25
main.go
View file

@ -5,7 +5,8 @@ import (
"errors" "errors"
"flag" "flag"
"github.com/anhgelus/gokord" "github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/utils" cmd "github.com/anhgelus/gokord/cmd"
"github.com/anhgelus/gokord/logger"
"github.com/anhgelus/les-copaings-bot/commands" "github.com/anhgelus/les-copaings-bot/commands"
"github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/config"
"github.com/anhgelus/les-copaings-bot/user" "github.com/anhgelus/les-copaings-bot/user"
@ -31,7 +32,7 @@ var (
func init() { func init() {
err := godotenv.Load() err := godotenv.Load()
if err != nil && !errors.Is(err, os.ErrNotExist) { if err != nil && !errors.Is(err, os.ErrNotExist) {
utils.SendWarn("Error while loading .env file", "error", err.Error()) logger.Warn("Error while loading .env file", "error", err.Error())
} }
flag.StringVar(&token, "token", os.Getenv("TOKEN"), "token of the bot") flag.StringVar(&token, "token", os.Getenv("TOKEN"), "token of the bot")
} }
@ -51,27 +52,27 @@ func main() {
adm := gokord.AdminPermission adm := gokord.AdminPermission
rankCmd := gokord.NewCommand("rank", "Affiche le niveau d'un copaing"). rankCmd := cmd.New("rank", "Affiche le niveau d'un copaing").
AddOption(gokord.NewOption( AddOption(cmd.NewOption(
discordgo.ApplicationCommandOptionUser, discordgo.ApplicationCommandOptionUser,
"copaing", "copaing",
"Le niveau du Copaing que vous souhaitez obtenir", "Le niveau du Copaing que vous souhaitez obtenir",
)). )).
SetHandler(commands.Rank) SetHandler(commands.Rank)
configCmd := gokord.NewCommand("config", "Modifie la config"). configCmd := cmd.New("config", "Modifie la config").
SetPermission(&adm). SetPermission(&adm).
SetHandler(commands.Config) SetHandler(commands.Config)
topCmd := gokord.NewCommand("top", "Copaings les plus actifs"). topCmd := cmd.New("top", "Copaings les plus actifs").
SetHandler(commands.Top) SetHandler(commands.Top)
resetCmd := gokord.NewCommand("reset", "Reset l'xp"). resetCmd := cmd.New("reset", "Reset l'xp").
SetHandler(commands.Reset). SetHandler(commands.Reset).
SetPermission(&adm) SetPermission(&adm)
resetUserCmd := gokord.NewCommand("reset-user", "Reset l'xp d'un utilisation"). resetUserCmd := cmd.New("reset-user", "Reset l'xp d'un utilisation").
AddOption(gokord.NewOption( AddOption(cmd.NewOption(
discordgo.ApplicationCommandOptionUser, discordgo.ApplicationCommandOptionUser,
"user", "user",
"Copaing a reset", "Copaing a reset",
@ -79,7 +80,7 @@ func main() {
SetHandler(commands.ResetUser). SetHandler(commands.ResetUser).
SetPermission(&adm) SetPermission(&adm)
creditsCmd := gokord.NewCommand("credits", "Crédits"). creditsCmd := cmd.New("credits", "Crédits").
SetHandler(commands.Credits) SetHandler(commands.Credits)
innovations, err := gokord.LoadInnovationFromJson(updatesData) innovations, err := gokord.LoadInnovationFromJson(updatesData)
@ -107,7 +108,7 @@ func main() {
Content: "Les Copaings Bot " + Version.String(), Content: "Les Copaings Bot " + Version.String(),
}, },
}, },
Commands: []gokord.CommandBuilder{ Commands: []cmd.CommandBuilder{
rankCmd, rankCmd,
configCmd, configCmd,
topCmd, topCmd,
@ -135,7 +136,7 @@ func afterInit(dg *discordgo.Session) {
dg.AddHandler(OnVoiceUpdate) dg.AddHandler(OnVoiceUpdate)
dg.AddHandler(OnLeave) dg.AddHandler(OnLeave)
stopPeriodicReducer = utils.NewTimer(24*time.Hour, func(stop chan<- interface{}) { stopPeriodicReducer = gokord.NewTimer(24*time.Hour, func(stop chan<- interface{}) {
user.PeriodicReducer(dg) user.PeriodicReducer(dg)
}) })

View file

@ -2,7 +2,7 @@ package user
import ( import (
"github.com/anhgelus/gokord" "github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/logger"
"github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/config"
"github.com/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/les-copaings-bot/exp"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
@ -16,7 +16,7 @@ func onNewLevel(dg *discordgo.Session, m *discordgo.Member, level uint) {
xpForLevel := exp.LevelXP(level) xpForLevel := exp.LevelXP(level)
for _, role := range cfg.XpRoles { for _, role := range cfg.XpRoles {
if role.XP <= xpForLevel && !slices.Contains(m.Roles, role.RoleID) { if role.XP <= xpForLevel && !slices.Contains(m.Roles, role.RoleID) {
utils.SendDebug( logger.Debug(
"Add role", "Add role",
"role_id", role.RoleID, "role_id", role.RoleID,
"user_id", m.User.ID, "user_id", m.User.ID,
@ -24,10 +24,10 @@ func onNewLevel(dg *discordgo.Session, m *discordgo.Member, level uint) {
) )
err := dg.GuildMemberRoleAdd(m.GuildID, m.User.ID, role.RoleID) err := dg.GuildMemberRoleAdd(m.GuildID, m.User.ID, role.RoleID)
if err != nil { if err != nil {
utils.SendAlert("user/level.go - Adding role", err.Error(), "role_id", role.RoleID) logger.Alert("user/level.go - Adding role", err.Error(), "role_id", role.RoleID)
} }
} else if role.XP > xpForLevel && slices.Contains(m.Roles, role.RoleID) { } else if role.XP > xpForLevel && slices.Contains(m.Roles, role.RoleID) {
utils.SendDebug( logger.Debug(
"Remove role", "Remove role",
"role_id", role.RoleID, "role_id", role.RoleID,
"user_id", m.User.ID, "user_id", m.User.ID,
@ -35,7 +35,7 @@ func onNewLevel(dg *discordgo.Session, m *discordgo.Member, level uint) {
) )
err := dg.GuildMemberRoleRemove(m.GuildID, m.User.ID, role.RoleID) err := dg.GuildMemberRoleRemove(m.GuildID, m.User.ID, role.RoleID)
if err != nil { if err != nil {
utils.SendAlert("user/level.go - Removing role", err.Error(), "role_id", role.RoleID) logger.Alert("user/level.go - Removing role", err.Error(), "role_id", role.RoleID)
} }
} }
} }
@ -44,7 +44,7 @@ func onNewLevel(dg *discordgo.Session, m *discordgo.Member, level uint) {
func (c *Copaing) OnNewLevel(dg *discordgo.Session, level uint) { func (c *Copaing) OnNewLevel(dg *discordgo.Session, level uint) {
m, err := dg.GuildMember(c.GuildID, c.DiscordID) m, err := dg.GuildMember(c.GuildID, c.DiscordID)
if err != nil { if err != nil {
utils.SendAlert( logger.Alert(
"user/level.go - Getting member for new level", err.Error(), "user/level.go - Getting member for new level", err.Error(),
"discord_id", c.DiscordID, "discord_id", c.DiscordID,
"guild_id", c.GuildID, "guild_id", c.GuildID,
@ -58,7 +58,7 @@ func PeriodicReducer(dg *discordgo.Session) {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
var cs []*Copaing var cs []*Copaing
if err := gokord.DB.Find(&cs).Error; err != nil { if err := gokord.DB.Find(&cs).Error; err != nil {
utils.SendAlert("user/level.go - Fetching all copaings", err.Error()) logger.Alert("user/level.go - Fetching all copaings", err.Error())
return return
} }
cxps := make([]*cXP, len(cs)) cxps := make([]*cXP, len(cs))
@ -71,7 +71,7 @@ func PeriodicReducer(dg *discordgo.Session) {
defer wg.Done() defer wg.Done()
xp, err := c.GetXP() xp, err := c.GetXP()
if err != nil { if err != nil {
utils.SendAlert("user/level.go - Getting XP", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID) logger.Alert("user/level.go - Getting XP", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID)
xp = 0 xp = 0
} }
cxps[i] = &cXP{ cxps[i] = &cXP{
@ -92,25 +92,25 @@ func PeriodicReducer(dg *discordgo.Session) {
Delete(&CopaingXP{}). Delete(&CopaingXP{}).
Error Error
if err != nil { if err != nil {
utils.SendAlert("user/level.go - Removing old XP", err.Error(), "guild_id", g.ID) logger.Alert("user/level.go - Removing old XP", err.Error(), "guild_id", g.ID)
} }
}() }()
} }
wg.Wait() wg.Wait()
for i, c := range cxps { for i, c := range cxps {
if i%50 == 49 { if i%50 == 49 {
utils.SendDebug("Sleeping...") logger.Debug("Sleeping...")
time.Sleep(15 * time.Second) // prevents spamming the API time.Sleep(15 * time.Second) // prevents spamming the API
} }
oldXp := c.GetXP() oldXp := c.GetXP()
xp, err := c.ToCopaing().GetXP() xp, err := c.ToCopaing().GetXP()
if err != nil { if err != nil {
utils.SendAlert("user/level.go - Getting XP", err.Error(), "guild_id", c.ID, "discord_id", c.DiscordID) logger.Alert("user/level.go - Getting XP", err.Error(), "guild_id", c.ID, "discord_id", c.DiscordID)
continue continue
} }
if exp.Level(oldXp) != exp.Level(xp) { if exp.Level(oldXp) != exp.Level(xp) {
c.OnNewLevel(dg, exp.Level(xp)) c.OnNewLevel(dg, exp.Level(xp))
} }
} }
utils.SendDebug("Periodic reduce finished", "len(guilds)", len(dg.State.Guilds)) logger.Debug("Periodic reduce finished", "len(guilds)", len(dg.State.Guilds))
} }

View file

@ -2,7 +2,7 @@ package user
import ( import (
"github.com/anhgelus/gokord" "github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/logger"
"time" "time"
) )
@ -34,7 +34,7 @@ const (
func GetCopaing(discordID string, guildID string) *Copaing { func GetCopaing(discordID string, guildID string) *Copaing {
c := Copaing{DiscordID: discordID, GuildID: guildID} c := Copaing{DiscordID: discordID, GuildID: guildID}
if err := c.Load(); err != nil { if err := c.Load(); err != nil {
utils.SendAlert( logger.Alert(
"user/member.go - Loading user", "user/member.go - Loading user",
err.Error(), err.Error(),
"discord_id", "discord_id",

View file

@ -2,7 +2,7 @@ package user
import ( import (
"github.com/anhgelus/gokord" "github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/logger"
"github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/config"
"github.com/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/les-copaings-bot/exp"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
@ -26,14 +26,14 @@ func (c *cXP) GetXP() uint {
func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn func(uint, uint)) { func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn func(uint, uint)) {
old, err := c.GetXP() old, err := c.GetXP()
if err != nil { if err != nil {
utils.SendAlert("user/xp.go - Getting xp", err.Error(), "discord_id", c.DiscordID, "guild_id", c.GuildID) logger.Alert("user/xp.go - Getting xp", err.Error(), "discord_id", c.DiscordID, "guild_id", c.GuildID)
return return
} }
pastLevel := exp.Level(old) pastLevel := exp.Level(old)
utils.SendDebug("Adding xp", "member", m.DisplayName(), "old xp", old, "xp to add", xp, "old level", pastLevel) logger.Debug("Adding xp", "member", m.DisplayName(), "old xp", old, "xp to add", xp, "old level", pastLevel)
c.CopaingXPs = append(c.CopaingXPs, CopaingXP{CopaingID: c.ID, XP: xp, GuildID: c.GuildID}) c.CopaingXPs = append(c.CopaingXPs, CopaingXP{CopaingID: c.ID, XP: xp, GuildID: c.GuildID})
if err = c.Save(); err != nil { if err = c.Save(); err != nil {
utils.SendAlert( logger.Alert(
"user/xp.go - Saving user", "user/xp.go - Saving user",
err.Error(), err.Error(),
"xp", "xp",
@ -76,7 +76,7 @@ func (c *Copaing) GetXPForDays(n uint) (uint, error) {
var cxp CopaingXP var cxp CopaingXP
err = gokord.DB.ScanRows(rows, &cxp) err = gokord.DB.ScanRows(rows, &cxp)
if err != nil { if err != nil {
utils.SendAlert("user/xp.go - Scanning rows", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID) logger.Alert("user/xp.go - Scanning rows", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID)
continue continue
} }
xp += cxp.XP xp += cxp.XP
@ -103,7 +103,7 @@ func GetBestXP(guildId string, n uint, d int) ([]CopaingAccess, error) {
var c Copaing var c Copaing
err = gokord.DB.ScanRows(rows, &c) err = gokord.DB.ScanRows(rows, &c)
if err != nil { if err != nil {
utils.SendAlert("user/xp.go - Scanning rows", err.Error(), "guild_id", guildId) logger.Alert("user/xp.go - Scanning rows", err.Error(), "guild_id", guildId)
continue continue
} }
wg.Add(1) wg.Add(1)
@ -111,7 +111,7 @@ func GetBestXP(guildId string, n uint, d int) ([]CopaingAccess, error) {
defer wg.Done() defer wg.Done()
xp, err := c.GetXPForDays(uint(d)) xp, err := c.GetXPForDays(uint(d))
if err != nil { if err != nil {
utils.SendAlert("user/xp.go - Fetching xp", err.Error(), "discord_id", c.DiscordID, "guild_id", guildId) logger.Alert("user/xp.go - Fetching xp", err.Error(), "discord_id", c.DiscordID, "guild_id", guildId)
return return
} }
l = append(l, &cXP{Cxp: xp, Copaing: &c}) l = append(l, &cXP{Cxp: xp, Copaing: &c})