diff options
| author | William Hergès <william@herges.fr> | 2025-09-27 18:23:27 +0200 |
|---|---|---|
| committer | William Hergès <william@herges.fr> | 2025-09-27 18:23:27 +0200 |
| commit | b1d3bca64702e66b5ecfe5c9ea5f43aa9dc1d1e6 (patch) | |
| tree | 67474ed704f529fe4941c179b7697b54099cc326 /main.go | |
| parent | c46d1c34a29b10dac2a059b9d78e99a3d5d76f96 (diff) | |
| parent | cfdba5f417bb31aac564d13becc09874f17d075d (diff) | |
Merge branch 'main' into feat/xp-boostfeat/xp-boost
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 177 |
1 files changed, 127 insertions, 50 deletions
@@ -2,19 +2,30 @@ package main import ( _ "embed" + "encoding/json" "errors" "flag" + "log/slog" "os" + "regexp" "time" "git.anhgelus.world/anhgelus/les-copaings-bot/commands" "git.anhgelus.world/anhgelus/les-copaings-bot/config" + "git.anhgelus.world/anhgelus/les-copaings-bot/exp" "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/bot" + "github.com/nyttikord/gokord/discord" + "github.com/nyttikord/gokord/discord/types" + "github.com/nyttikord/gokord/event" + "github.com/nyttikord/gokord/interaction" + "golang.org/x/image/font/opentype" + "gonum.org/v1/plot" + "gonum.org/v1/plot/font" ) var ( @@ -30,12 +41,86 @@ var ( stopPeriodicReducer chan<- interface{} ) +//go:embed assets/inter-variable.ttf +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()) + slog.Error("error while loading .env file", "error", err) } flag.StringVar(&token, "token", os.Getenv("TOKEN"), "token of the bot") + + // Use a nicer font + fontTTF, parseErr := opentype.Parse(interTTF) + if parseErr != nil { + panic(err) + } + inter := font.Font{Typeface: "Inter"} + font.DefaultCache.Add( + []font.Face{ + { + Font: inter, + Face: fontTTF, + }, + }) + plot.DefaultFont = inter + +} + +func handleDynamicMessageComponent( + b *gokord.Bot, + handler func( + bot.Session, + *event.InteractionCreate, + *interaction.MessageComponentData, + []string, *cmd.ResponseBuilder, + ), + pattern string, +) { + compiledPattern := regexp.MustCompile(pattern) + b.AddHandler(func(s bot.Session, i *event.InteractionCreate) { + if i.Type != types.InteractionMessageComponent { + return + } + + data := i.MessageComponentData() + parameters := compiledPattern.FindStringSubmatch(data.CustomID) + if parameters == nil { + return + } + parameters = parameters[1:] + handler(s, i, data, parameters, cmd.NewResponseBuilder(s, i)) + }) +} + +func handleDynamicModalComponent( + b *gokord.Bot, + handler func( + bot.Session, + *event.InteractionCreate, + *interaction.ModalSubmitData, + []string, + *cmd.ResponseBuilder, + ), + pattern string, +) { + compiledPattern := regexp.MustCompile(pattern) + b.AddHandler(func(s bot.Session, i *event.InteractionCreate) { + if i.Type != types.InteractionModalSubmit { + return + } + + data := i.ModalSubmitData() + content, _ := json.Marshal(data) + s.Logger().Debug(string(content)) + parameters := compiledPattern.FindStringSubmatch(data.CustomID) + if parameters == nil { + return + } + parameters = parameters[1:] + handler(s, i, data, parameters, cmd.NewResponseBuilder(s, i)) + }) } func main() { @@ -55,7 +140,7 @@ func main() { rankCmd := cmd.New("rank", "Affiche le niveau d'un copaing"). AddOption(cmd.NewOption( - discordgo.ApplicationCommandOptionUser, + types.CommandOptionUser, "copaing", "Le niveau du Copaing que vous souhaitez obtenir", )). @@ -63,7 +148,7 @@ func main() { configCmd := cmd.New("config", "Modifie la config"). SetPermission(&adm). - SetHandler(commands.Config) + SetHandler(commands.ConfigCommand) topCmd := cmd.New("top", "Copaings les plus actifs"). SetHandler(commands.Top) @@ -74,7 +159,7 @@ func main() { resetUserCmd := cmd.New("reset-user", "Reset l'xp d'un utilisation"). AddOption(cmd.NewOption( - discordgo.ApplicationCommandOptionUser, + types.CommandOptionUser, "user", "Copaing a reset", ).IsRequired()). @@ -86,12 +171,12 @@ func main() { statsCmd := cmd.New("stats", "Affiche des stats :D"). AddOption(cmd.NewOption( - discordgo.ApplicationCommandOptionInteger, + types.CommandOptionInteger, "days", "Nombre de jours à afficher dans le graphique", )). AddOption(cmd.NewOption( - discordgo.ApplicationCommandOptionUser, + types.CommandOptionUser, "user", "Utilisateur à inspecter", )). @@ -102,7 +187,7 @@ func main() { panic(err) } - bot := gokord.Bot{ + b := gokord.Bot{ Token: token, Status: []*gokord.Status{ { @@ -134,67 +219,59 @@ func main() { AfterInit: func(dg *discordgo.Session) { d := 24 * time.Hour if gokord.Debug { - d = 24 * time.Second + d = 3 * exp.DebugFactor * time.Second } user.PeriodicReducer(dg) stopPeriodicReducer = gokord.NewTimer(d, func(stop chan<- interface{}) { - logger.Debug("Periodic reducer") + dg.Logger().Debug("periodic reducer") user.PeriodicReducer(dg) }) }, Innovations: innovations, Version: &Version, - Intents: discordgo.IntentsAllWithoutPrivileged | - discordgo.IntentsMessageContent | - discordgo.IntentGuildMembers, + Intents: discord.IntentsAllWithoutPrivileged | + discord.IntentsMessageContent | + discord.IntentGuildMembers, } // interaction: /config - bot.HandleMessageComponent(func(s *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - if len(data.Values) != 1 { - logger.Alert("main.go - Handle config modify", "invalid data values", "values", data.Values) - return - } - switch data.Values[0] { - case config.ModifyXpRole: - config.HandleModifyXpRole(s, i, data, resp) - case config.ModifyFallbackChannel: - config.HandleModifyFallbackChannel(s, i, data, resp) - case config.ModifyDisChannel: - config.HandleModifyDisChannel(s, i, data, resp) - case config.ModifyTimeReduce: - config.HandleModifyPeriodicReduce(s, i, data, resp) - default: - logger.Alert("main.go - Detecting value", "unkown value", "value", data.Values[0]) - return - } - }, commands.ConfigModify) + b.HandleMessageComponent(commands.ConfigMessageComponent, commands.OpenConfig) // xp role related - bot.HandleMessageComponent(config.HandleXpRoleAddEdit, config.XpRoleAdd) - bot.HandleMessageComponent(config.HandleXpRoleAddEdit, config.XpRoleEdit) - bot.HandleMessageComponent(config.HandleXpRoleAddRole, config.XpRoleAddRole) - bot.HandleMessageComponent(config.HandleXpRoleEditRole, config.XpRoleEditRole) - bot.HandleMessageComponent(config.HandleXpRoleDel, config.XpRoleDel) - bot.HandleMessageComponent(config.HandleXpRoleDelRole, config.XpRoleDelRole) - bot.HandleModal(config.HandleXpRoleLevel, config.XpRoleAddLevel) - bot.HandleModal(config.HandleXpRoleLevel, config.XpRoleEditLevel) + b.HandleMessageComponent(config.HandleXpRole, config.ModifyXpRole) + b.HandleMessageComponent(config.HandleXpRoleNew, config.XpRoleNew) + b.HandleModal(config.HandleXpRoleAdd, config.XpRoleAdd) + handleDynamicMessageComponent(&b, config.HandleXpRoleEdit, config.XpRoleEditPattern) + handleDynamicMessageComponent(&b, config.HandleXpRoleEditRole, config.XpRoleEditRolePattern) + handleDynamicMessageComponent(&b, config.HandleXpRoleEditLevelStart, config.XpRoleEditLevelStartPattern) + handleDynamicModalComponent(&b, config.HandleXpRoleEditLevel, config.XpRoleEditLevelPattern) + handleDynamicMessageComponent(&b, config.HandleXpRoleDel, config.XpRoleDel) // channel related - bot.HandleMessageComponent(config.HandleFallbackChannelSet, config.FallbackChannelSet) - bot.HandleMessageComponent(config.HandleDisChannel, config.DisChannelAdd) - bot.HandleMessageComponent(config.HandleDisChannel, config.DisChannelDel) - bot.HandleMessageComponent(config.HandleDisChannelAddSet, config.DisChannelAddSet) - bot.HandleMessageComponent(config.HandleDisChannelDelSet, config.DisChannelDelSet) + b.HandleMessageComponent(func(s bot.Session, i *event.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) { + if config.HandleModifyFallbackChannel(s, i, data, resp) { + commands.ConfigMessageComponent(s, i, data, resp) + } + }, config.ModifyFallbackChannel) + b.HandleMessageComponent(func(s bot.Session, i *event.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) { + if config.HandleModifyDisChannel(s, i, data, resp) { + commands.ConfigMessageComponent(s, i, data, resp) + } + }, config.ModifyDisChannel) // reduce related - bot.HandleModal(config.HandleTimeReduceSet, config.TimeReduceSet) + b.HandleMessageComponent(config.HandleModifyPeriodicReduceCommand, config.ModifyTimeReduce) + b.HandleModal(func(s bot.Session, i *event.InteractionCreate, data *interaction.ModalSubmitData, resp *cmd.ResponseBuilder) { + if config.HandleTimeReduceSet(s, i, data, resp) { + commands.ConfigModal(s, i, data, resp) + } + }, config.TimeReduceSet) // xp handlers - bot.AddHandler(OnMessage) - bot.AddHandler(OnVoiceUpdate) - bot.AddHandler(OnLeave) + b.AddHandler(OnMessage) + b.AddHandler(OnVoiceUpdate) + b.AddHandler(OnLeave) - bot.Start() + b.Start() if stopPeriodicReducer != nil { stopPeriodicReducer <- true |
