aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go177
1 files changed, 127 insertions, 50 deletions
diff --git a/main.go b/main.go
index facf243..56753e1 100644
--- a/main.go
+++ b/main.go
@@ -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