diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2026-01-22 20:10:21 +0100 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2026-01-22 20:10:21 +0100 |
| commit | 8255a2e51454049f3ac1532f6e1125f528691c37 (patch) | |
| tree | 064b7dbdd07efd85162c954d20c1dcd831ea84f6 | |
| parent | eee2a3873e11bef6bee2f71cf429c8a870c5383c (diff) | |
refactor(commands): use new handlers
| -rw-r--r-- | commands/config.go | 7 | ||||
| -rw-r--r-- | commands/credits.go | 12 | ||||
| -rw-r--r-- | commands/rank.go | 74 | ||||
| -rw-r--r-- | commands/reset.go | 60 | ||||
| -rw-r--r-- | commands/stats.go | 134 | ||||
| -rw-r--r-- | commands/top.go | 72 | ||||
| -rw-r--r-- | config/guild.go | 11 | ||||
| -rw-r--r-- | events.go | 33 | ||||
| -rw-r--r-- | main.go | 9 | ||||
| -rw-r--r-- | rolereact/events.go | 16 | ||||
| -rw-r--r-- | user/level.go | 22 | ||||
| -rw-r--r-- | user/xp.go | 9 |
12 files changed, 229 insertions, 230 deletions
diff --git a/commands/config.go b/commands/config.go index 1878bdb..12d1c4d 100644 --- a/commands/config.go +++ b/commands/config.go @@ -121,8 +121,7 @@ func ConfigResponse(guildID string) *interaction.Response { } func ConfigCommand(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand) { - err := dg.InteractionAPI().Respond(i.Interaction, ConfigResponse(i.GuildID)) - + err := dg.InteractionAPI().Respond(i.Interaction, ConfigResponse(i.GuildID)).Do(ctx) if err != nil { bot.Logger(ctx).Error("sending config", "error", err) } @@ -131,8 +130,8 @@ func ConfigCommand(ctx context.Context, dg bot.Session, i *interaction.Applicati func ConfigMessageComponent(ctx context.Context, dg bot.Session, i *interaction.MessageComponent) { response := ConfigResponse(i.GuildID) response.Type = types.InteractionResponseUpdateMessage - err := dg.InteractionAPI().Respond(i.Interaction, response) + err := dg.InteractionAPI().Respond(i.Interaction, response).Do(ctx) if err != nil { bot.Logger(ctx).Error("sending config", "error", err) } @@ -141,8 +140,8 @@ func ConfigMessageComponent(ctx context.Context, dg bot.Session, i *interaction. func ConfigModal(ctx context.Context, dg bot.Session, i *interaction.ModalSubmit) { response := ConfigResponse(i.GuildID) response.Type = types.InteractionResponseUpdateMessage - err := dg.InteractionAPI().Respond(i.Interaction, response) + err := dg.InteractionAPI().Respond(i.Interaction, response).Do(ctx) if err != nil { bot.Logger(ctx).Error("sending config", "error", err) } diff --git a/commands/credits.go b/commands/credits.go index 340ea57..21dd8c7 100644 --- a/commands/credits.go +++ b/commands/credits.go @@ -1,20 +1,22 @@ package commands import ( + "context" + "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/cmd" "github.com/nyttikord/gokord/bot" - "github.com/nyttikord/gokord/event" + "github.com/nyttikord/gokord/interaction" ) -func Credits(s bot.Session, _ *event.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { +func Credits(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand) { 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" msg += "Utilise :\n- [anhgelus/gokord](<https://github.com/anhgelus/gokord>)\n" msg += "- [Inter](<https://github.com/rsms/inter>)" - err := resp.SetMessage(msg).Send() + resp := interaction.NewMessageResponse().Message(msg).Response() + err := dg.InteractionAPI().Respond(i.Interaction, resp).Do(ctx) if err != nil { - s.Logger().Error("sending credits", "error", err) + bot.Logger(ctx).Error("sending credits", "error", err) } } diff --git a/commands/rank.go b/commands/rank.go index 3a017f6..53e4724 100644 --- a/commands/rank.go +++ b/commands/rank.go @@ -6,47 +6,49 @@ import ( "git.anhgelus.world/anhgelus/les-copaings-bot/exp" "git.anhgelus.world/anhgelus/les-copaings-bot/user" - "github.com/anhgelus/gokord/cmd" "github.com/nyttikord/gokord/bot" - "github.com/nyttikord/gokord/event" + "github.com/nyttikord/gokord/interaction" ) -func Rank(ctx context.Context) func(s bot.Session, i *event.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { - return func(s bot.Session, i *event.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { - c := user.GetCopaing(ctx, i.Member.User.ID, i.GuildID) // current user = member who used /rank - msg := "Votre niveau" - m := i.Member - var err error - if v, ok := optMap["copaing"]; ok { - u := v.UserValue(s.UserAPI()) - if u.Bot { - err = resp.SetMessage("Imagine si les bots avaient un niveau :rolling_eyes:").IsEphemeral().Send() - if err != nil { - s.Logger().Error("reply error user is a bot", "error", err) - } - return - } - m, err = s.GuildAPI().Member(i.GuildID, u.ID) - if err != nil { - s.Logger().Error("fetching guild member", "error", err, "user", u.Username, "guild", i.GuildID) - err = resp.SetMessage("Erreur : impossible de récupérer le membre").IsEphemeral().Send() - if err != nil { - s.Logger().Error("reply error fetching guild member", "error", err) - } - return - } - c = user.GetCopaing(ctx, u.ID, i.GuildID) // current user = member targeted by member who wrote /rank - msg = fmt.Sprintf("Le niveau de %s", m.DisplayName()) +func Rank(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand) { + c := user.GetCopaing(ctx, i.Member.User.ID, i.GuildID) // current user = member who used /rank + msg := "Votre niveau" + m := i.Member + opts := i.OptionMap() + var resp *interaction.Response + defer func() { + err := dg.InteractionAPI().Respond(i.Interaction, resp).Do(ctx) + if err != nil { + bot.Logger(ctx).Error("replying to interaction", "error", err) + } + }() + var err error + if v, ok := opts["copaing"]; ok { + u := v.UserValue(ctx) + if u.Bot { + resp = interaction.NewMessageResponse(). + IsEphemeral(). + Message("Imagine si les bots avaient un niveau :rolling_eyes:"). + Response() + return } - xp := c.XP - lvl := exp.Level(xp) - nxtLvlXP := exp.LevelXP(lvl + 1) - err = resp.SetMessage(fmt.Sprintf( - "%s : **%d**\n> XP : %d\n> Prochain niveau dans %d XP", - msg, lvl, xp, nxtLvlXP-xp, - )).Send() + m, err = dg.GuildAPI().Member(i.GuildID, u.ID).Do(ctx) if err != nil { - s.Logger().Error("sending rank", "error", err) + bot.Logger(ctx).Error("fetching guild member", "error", err, "user", u.Username, "guild", i.GuildID) + resp = interaction.NewMessageResponse(). + IsEphemeral(). + Message("Erreur : impossible de récupérer le membre"). + Response() + return } + c = user.GetCopaing(ctx, u.ID, i.GuildID) // current user = member targeted by member who wrote /rank + msg = fmt.Sprintf("Le niveau de %s", m.DisplayName()) } + xp := c.XP + lvl := exp.Level(xp) + nxtLvlXP := exp.LevelXP(lvl + 1) + resp = interaction.NewMessageResponse().Message(fmt.Sprintf( + "%s : **%d**\n> XP : %d\n> Prochain niveau dans %d XP", + msg, lvl, xp, nxtLvlXP-xp, + )).Response() } diff --git a/commands/reset.go b/commands/reset.go index ae31781..9f2debc 100644 --- a/commands/reset.go +++ b/commands/reset.go @@ -5,47 +5,45 @@ import ( "git.anhgelus.world/anhgelus/les-copaings-bot/user" "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/cmd" "github.com/nyttikord/gokord/bot" - "github.com/nyttikord/gokord/event" + "github.com/nyttikord/gokord/interaction" ) -func Reset(s bot.Session, i *event.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { +func Reset(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand) { var copaings []*user.Copaing //TODO: delete everything from cache gokord.DB.Where("guild_id = ?", i.GuildID).Delete(&copaings) - if err := resp.IsEphemeral().SetMessage("L'XP a été reset.").Send(); err != nil { - s.Logger().Error("sending reset success", "error", err) + resp := interaction.NewMessageResponse().IsEphemeral().Message("L'XP a été reset.").Response() + err := dg.InteractionAPI().Respond(i.Interaction, resp).Do(ctx) + if err != nil { + bot.Logger(ctx).Error("sending reset success", "error", err) } } -func ResetUser(ctx context.Context) func(s bot.Session, i *event.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { - return func(s bot.Session, i *event.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { - resp.IsEphemeral() - v, ok := optMap["user"] - if !ok { - if err := resp.SetMessage("Le user n'a pas été renseigné.").Send(); err != nil { - s.Logger().Error("sending error copaing not set", "error", err) - } - 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 { - s.Logger().Error("sending error bot does not have xp", "error", err) - } - return - } - err := user.GetCopaing(ctx, m.ID, i.GuildID).Delete(ctx) +func ResetUser(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand) { + resp := interaction.NewMessageResponse().IsEphemeral() + defer func() { + err := dg.InteractionAPI().Respond(i.Interaction, resp.Response()).Do(ctx) if err != nil { - s.Logger().Error("deleting copaing", "error", err, "user", m.Username, "guild", i.GuildID) - err = resp.SetMessage("Erreur : impossible de reset l'utilisateur").Send() - if err != nil { - s.Logger().Error("sending error while deleting", "error", err) - } - } - if err = resp.SetMessage("Le user bien été reset.").Send(); err != nil { - s.Logger().Error("sending reset success", "error", err) + bot.Logger(ctx).Error("replying to interaction", "error", err) } + }() + opts := i.OptionMap() + v, ok := opts["user"] + if !ok { + resp.Message("Le user n'a pas été renseigné.") + return + } + m := v.UserValue(ctx) + if m.Bot { + resp.Message("Les bots n'ont pas de niveau :upside_down:") + return + } + err := user.GetCopaing(ctx, m.ID, i.GuildID).Delete(ctx) + if err != nil { + bot.Logger(ctx).Error("deleting copaing", "error", err, "user", m.Username, "guild", i.GuildID) + resp.Message("Erreur : impossible de reset l'utilisateur") + return } + resp.Message("Le user bien été reset.") } diff --git a/commands/stats.go b/commands/stats.go index 716616d..92402c8 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -11,15 +11,15 @@ import ( "slices" "time" + "git.anhgelus.world/anhgelus/les-copaings-bot/common" "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/jackc/pgx/v5/pgtype" "github.com/nyttikord/gokord/bot" - "github.com/nyttikord/gokord/channel" - "github.com/nyttikord/gokord/event" + "github.com/nyttikord/gokord/discord/request" + "github.com/nyttikord/gokord/interaction" "gonum.org/v1/plot" "gonum.org/v1/plot/plotter" "gonum.org/v1/plot/vg" @@ -47,72 +47,72 @@ var colors = []color.RGBA{ {193, 18, 31, 255}, } -func Stats(ctx context.Context) func(s bot.Session, i *event.InteractionCreate, opt cmd.OptionMap, resp *cmd.ResponseBuilder) { - return func(s bot.Session, i *event.InteractionCreate, opt cmd.OptionMap, resp *cmd.ResponseBuilder) { - cfg := config.GetGuildConfig(i.GuildID) - days := 15 - if gokord.Debug { - days = 90 - } - if v, ok := opt["days"]; ok { - in := v.IntValue() - 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 { - s.Logger().Error("sending error invalid days", "error", err) - } - return - } - days = int(in) - } - err := resp.IsDeferred().Send() +func Stats(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand) { + cfg := config.GetGuildConfig(i.GuildID) + days := 15 + if common.IsDebug(ctx) { + days = 90 + } + + resp := interaction.NewMessageResponse() + defer func() { + err := dg.InteractionAPI().Respond(i.Interaction, resp.Response()).Do(ctx) if err != nil { - s.Logger().Error("sending deferred", "error", err) + bot.Logger(ctx).Error("replying to interaction", "error", err) + } + }() + + opts := i.OptionMap() + if v, ok := opts["days"]; ok { + in := v.IntValue() + 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) + resp.Message(msg) return } - go func() { - var w io.WriterTo - if v, ok := opt["user"]; ok { - w, err = statsMember(ctx, s, i, days, v.UserValue(s.UserAPI()).ID) - } else { - w, err = statsAll(s, i, days) - } - if err != nil { - s.Logger().Error("generating stats", "error", err, "guild", i.GuildID) - if err = resp.IsEphemeral().SetMessage("Il y a eu une erreur...").Send(); err != nil { - s.Logger().Error("sending error occurred", "error", err) - } - return - } - b := new(bytes.Buffer) - _, err = w.WriteTo(b) - if err != nil { - s.Logger().Error("writing png", "error", err) - } - err = resp.AddFile(&channel.File{ - Name: "plot.png", - ContentType: "image/png", - Reader: b, - }).Send() - if err != nil { - s.Logger().Error("sending stats", "error", err) - } - }() + days = int(in) + } + err := dg.InteractionAPI().Respond(i.Interaction, interaction.NewDeferredResponse()).Do(ctx) + if err != nil { + bot.Logger(ctx).Error("sending deferred", "error", err) } + var w io.WriterTo + if v, ok := opts["user"]; ok { + w, err = statsMember(ctx, dg, i, days, v.UserValue(ctx).ID) + } else { + w, err = statsAll(ctx, dg, i, days) + } + if err != nil { + bot.Logger(ctx).Error("generating stats", "error", err, "guild", i.GuildID) + resp.Message("Il y a eu une erreur...") + return + } + b := new(bytes.Buffer) + _, err = w.WriteTo(b) + if err != nil { + bot.Logger(ctx).Error("writing png", "error", err) + resp.Message("Il y a eu une erreur...") + return + } + resp.AddFile(&request.File{ + Name: "plot.png", + ContentType: "image/png", + Reader: b, + }) } -func statsAll(s bot.Session, i *event.InteractionCreate, days int) (io.WriterTo, error) { - return stats(s, i, days, func(before, after string) *gorm.DB { +func statsAll(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand, days int) (io.WriterTo, error) { + return stats(ctx, dg, i, days, func(before, after string) *gorm.DB { return gokord.DB.Raw(before+"WHERE guild_id = ? and created_at > ?"+after, i.GuildID, exp.TimeStampNDaysBefore(uint(days))) }) } -func statsMember(ctx context.Context, s bot.Session, i *event.InteractionCreate, days int, discordID string) (io.WriterTo, error) { - _, err := s.GuildAPI().Member(i.GuildID, discordID) +func statsMember(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand, days int, discordID string) (io.WriterTo, error) { + _, err := dg.GuildAPI().Member(i.GuildID, discordID).Do(ctx) if err != nil { return nil, err } - return stats(s, i, days, func(before, after string) *gorm.DB { + return stats(ctx, dg, i, days, func(before, after string) *gorm.DB { return gokord.DB.Raw( before+"WHERE guild_id = ? and created_at > ? and copaing_id = ?"+after, i.GuildID, exp.TimeStampNDaysBefore(uint(days)), user.GetCopaing(ctx, discordID, i.GuildID).ID, @@ -120,12 +120,12 @@ func statsMember(ctx context.Context, s bot.Session, i *event.InteractionCreate, }) } -func stats(s bot.Session, i *event.InteractionCreate, days int, execSql func(before, after string) *gorm.DB) (io.WriterTo, error) { +func stats(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand, days int, execSql func(before, after string) *gorm.DB) (io.WriterTo, error) { var rawData []*data - if gokord.Debug { + if common.IsDebug(ctx) { var rawCopaingData []*user.CopaingXP if err := execSql("SELECT * FROM copaing_xps ", "").Scan(&rawCopaingData).Error; err != nil { - s.Logger().Error("fetching result", "error", err) + bot.Logger(ctx).Error("fetching result", "error", err) return nil, err } rawData = make([]*data, len(rawCopaingData)) @@ -141,7 +141,7 @@ func stats(s bot.Session, i *event.InteractionCreate, days int, execSql func(bef 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 { - s.Logger().Error("fetching result", "error", err) + bot.Logger(ctx).Error("fetching result", "error", err) return nil, err } rawData = make([]*data, len(rawDbData)) @@ -163,10 +163,10 @@ func stats(s bot.Session, i *event.InteractionCreate, days int, execSql func(bef var cp user.Copaing if err := gokord.DB.First(&cp, raw.CopaingID).Error; err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { - s.Logger().Error("finding copaing", "error", err, "copaing", raw.CopaingID) + bot.Logger(ctx).Error("finding copaing", "error", err, "copaing", raw.CopaingID) return nil, err } - s.Logger().Warn("copaing not found, skipping", "copaing", raw.CopaingID) + bot.Logger(ctx).Warn("copaing not found, skipping", "copaing", raw.CopaingID) continue } copaings[raw.CopaingID] = &cp @@ -184,7 +184,7 @@ func stats(s bot.Session, i *event.InteractionCreate, days int, execSql func(bef stats[raw.CopaingID] = pts } t := raw.CreatedAt.Unix() - now - if !gokord.Debug { + if !common.IsDebug(ctx) { t = int64(math.Ceil(float64(t) / (24 * 60 * 60))) } else { t = int64(math.Ceil(float64(t) / exp.DebugFactor)) @@ -194,10 +194,10 @@ func stats(s bot.Session, i *event.InteractionCreate, days int, execSql func(bef Y: float64(raw.XP), } } - return generatePlot(s, i, copaings, stats) + return generatePlot(ctx, dg, i, copaings, stats) } -func generatePlot(s bot.Session, i *event.InteractionCreate, copaings map[int]*user.Copaing, stats map[int][]plotter.XY) (io.WriterTo, error) { +func generatePlot(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand, copaings map[int]*user.Copaing, stats map[int][]plotter.XY) (io.WriterTo, error) { p := plot.New() fontSizeTitle := vg.Length(16) fontSize := vg.Length(12) @@ -223,9 +223,9 @@ func generatePlot(s bot.Session, i *event.InteractionCreate, copaings map[int]*u cnt := 0 for in, c := range copaings { - m, err := s.GuildAPI().Member(i.GuildID, c.DiscordID) + m, err := dg.GuildAPI().Member(i.GuildID, c.DiscordID).Do(ctx) if err != nil { - s.Logger().Error("fetching guild member", "error", err) + bot.Logger(ctx).Error("fetching guild member", "error", err) return nil, err } slices.SortFunc(stats[in], func(a, b plotter.XY) int { diff --git a/commands/top.go b/commands/top.go index a6ed992..867cf26 100644 --- a/commands/top.go +++ b/commands/top.go @@ -8,53 +8,51 @@ import ( "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/cmd" "github.com/nyttikord/gokord/bot" "github.com/nyttikord/gokord/channel" - "github.com/nyttikord/gokord/event" + "github.com/nyttikord/gokord/interaction" ) -func Top(ctx context.Context) func(s bot.Session, i *event.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { - return func(s bot.Session, i *event.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { - embeds := make([]*channel.MessageEmbed, 3) - var wg sync.WaitGroup +func Top(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand) { + embeds := make([]*channel.MessageEmbed, 3) + var wg sync.WaitGroup - fn := func(str string, n uint, d int, id int) { - tops := user.GetBestXP(ctx, i.GuildID, n, d) - embeds[id] = &channel.MessageEmbed{ - Title: str, - Description: genTopsMessage(tops), - Color: 0x10E6AD, - } - } - - cfg := config.GetGuildConfig(i.GuildID) - if cfg.DaysXPRemains > 30 { - wg.Go(func() { - fn(fmt.Sprintf("Top %d jours", cfg.DaysXPRemains), 10, -1, 0) - }) + fn := func(str string, n uint, d int, id int) { + tops := user.GetBestXP(ctx, i.GuildID, n, d) + embeds[id] = &channel.MessageEmbed{ + Title: str, + Description: genTopsMessage(tops), + Color: 0x10E6AD, } + } + cfg := config.GetGuildConfig(i.GuildID) + if cfg.DaysXPRemains > 30 { wg.Go(func() { - fn("Top 30 jours", 5, 30, 1) - }) - wg.Go(func() { - fn("Top 7 jours", 5, 7, 2) + fn(fmt.Sprintf("Top %d jours", cfg.DaysXPRemains), 10, -1, 0) }) + } - wg.Wait() - if cfg.DaysXPRemains > 30 { - resp.AddEmbed(embeds[0]). - AddEmbed(embeds[1]). - AddEmbed(embeds[2]) - } else { - resp.AddEmbed(embeds[1]). - AddEmbed(embeds[2]) - } - err := resp.Send() - if err != nil { - s.Logger().Error("sending response top", "error", err) - } + wg.Go(func() { + fn("Top 30 jours", 5, 30, 1) + }) + wg.Go(func() { + fn("Top 7 jours", 5, 7, 2) + }) + + wg.Wait() + resp := interaction.NewMessageResponse() + if cfg.DaysXPRemains > 30 { + resp.AddEmbed(embeds[0]). + AddEmbed(embeds[1]). + AddEmbed(embeds[2]) + } else { + resp.AddEmbed(embeds[1]). + AddEmbed(embeds[2]) + } + err := dg.InteractionAPI().Respond(i.Interaction, resp.Response()).Do(ctx) + if err != nil { + bot.Logger(ctx).Error("sending response top", "error", err) } } diff --git a/config/guild.go b/config/guild.go index 8799186..c1df2c9 100644 --- a/config/guild.go +++ b/config/guild.go @@ -1,6 +1,7 @@ package config import ( + "context" "strings" "github.com/anhgelus/gokord" @@ -51,21 +52,21 @@ func (cfg *GuildConfig) Save() error { return gokord.DB.Save(cfg).Error } -func (cfg *GuildConfig) IsDisabled(s bot.Session, channelID string) bool { +func (cfg *GuildConfig) IsDisabled(ctx context.Context, s bot.Session, channelID string) bool { ok := true for channelID != "" && ok { ok = !strings.Contains(cfg.DisabledChannels, channelID) c, err := s.ChannelAPI().State.Channel(channelID) if err != nil { - s.Logger().Error("unable to find channel %s in state", "error", err, "channel", c) - c, err = s.ChannelAPI().Channel(channelID) + bot.Logger(ctx).Error("unable to find channel %s in state", "error", err, "channel", c) + c, err = s.ChannelAPI().Channel(channelID).Do(ctx) if err == nil { err = s.ChannelAPI().State.ChannelAdd(c) if err != nil { - s.Logger().Error("unable to add channel to state", "error", err, "channel", c) + bot.Logger(ctx).Error("unable to add channel to state", "error", err, "channel", c) } } else { - s.Logger().Error("unable to fetch channel", "error", err, "channel", c) + bot.Logger(ctx).Error("unable to fetch channel", "error", err, "channel", c) return false } } @@ -28,7 +28,7 @@ func OnMessage(ctx context.Context, s bot.Session, m *event.MessageCreate) { return } cfg := config.GetGuildConfig(m.GuildID) - if cfg.IsDisabled(s, m.ChannelID) { + if cfg.IsDisabled(ctx, s, m.ChannelID) { return } cc := user.GetCopaing(ctx, m.Author.ID, m.GuildID) @@ -39,7 +39,7 @@ func OnMessage(ctx context.Context, s bot.Session, m *event.MessageCreate) { xp := min(exp.MessageXP(uint(len(trimmed)), exp.CalcDiversity(trimmed)), MaxXpPerMessage) cc.AddXP(ctx, s, m.Member, xp, func(_ uint, _ uint) { if err := s.ChannelAPI().MessageReactionAdd(m.ChannelID, m.Message.ID, "⬆"); err != nil { - s.Logger().Error( + bot.Logger(ctx).Error( "add reaction for new level", "error", err, "channel", m.ChannelID, @@ -54,13 +54,14 @@ func OnVoiceUpdate(ctx context.Context, s bot.Session, e *event.VoiceStateUpdate return } cfg := config.GetGuildConfig(e.GuildID) - if (e.BeforeUpdate == nil || cfg.IsDisabled(s, e.BeforeUpdate.ChannelID)) && e.ChannelID != "" { - if cfg.IsDisabled(s, e.ChannelID) { + dis := cfg.IsDisabled(ctx, s, e.BeforeUpdate.ChannelID) + if (e.BeforeUpdate == nil || dis) && e.ChannelID != "" { + if dis { return } - onConnection(s, e) - } else if e.BeforeUpdate != nil && (e.ChannelID == "" || cfg.IsDisabled(s, e.ChannelID)) { - if cfg.IsDisabled(s, e.BeforeUpdate.ChannelID) { + onConnection(ctx, s, e) + } else if e.BeforeUpdate != nil && (e.ChannelID == "" || dis) { + if dis { return } onDisconnect(ctx, s, e) @@ -71,8 +72,8 @@ func genMapKey(guildID string, userID string) string { return fmt.Sprintf("%s:%s", guildID, userID) } -func onConnection(s bot.Session, e *event.VoiceStateUpdate) { - s.Logger().Debug("user connected", "user", e.Member.DisplayName()) +func onConnection(ctx context.Context, s bot.Session, e *event.VoiceStateUpdate) { + bot.Logger(ctx).Debug("user connected", "user", e.Member.DisplayName()) connectedSince[genMapKey(e.GuildID, e.UserID)] = time.Now().Unix() } @@ -82,18 +83,18 @@ func onDisconnect(ctx context.Context, s bot.Session, e *event.VoiceStateUpdate) // check the validity of user con, ok := connectedSince[genMapKey(e.GuildID, e.UserID)] if !ok || con == NotConnected { - s.Logger().Warn( + bot.Logger(ctx).Warn( "user disconnect from a vocal but was registered as not connected", "user", e.Member.DisplayName(), ) return } timeInVocal := now - con - s.Logger().Debug("user disconnected", "user", e.Member.DisplayName(), "time in vocal", timeInVocal) + bot.Logger(ctx).Debug("user disconnected", "user", e.Member.DisplayName(), "time in vocal", timeInVocal) connectedSince[genMapKey(e.GuildID, e.UserID)] = NotConnected // add exp if timeInVocal < 0 { - s.Logger().Warn("time spent in vocal is negative", "user", e.Member.DisplayName(), "guild", e.GuildID) + bot.Logger(ctx).Warn("time spent in vocal is negative", "user", e.Member.DisplayName(), "guild", e.GuildID) return } timeInVocal = min(timeInVocal, MaxTimeInVocal) @@ -105,20 +106,20 @@ func onDisconnect(ctx context.Context, s bot.Session, e *event.VoiceStateUpdate) } _, err := s.ChannelAPI().MessageSend(cfg.FallbackChannel, fmt.Sprintf( "%s est maintenant niveau %d", e.Member.Mention(), newLevel, - )) + )).Do(ctx) if err != nil { - s.Logger().Error("sending new level in fallback channel", "error", err) + bot.Logger(ctx).Error("sending new level in fallback channel", "error", err) } }) } func OnLeave(ctx context.Context, s bot.Session, e *event.GuildMemberRemove) { - s.Logger().Debug("leave event", "user", e.User.Username) + bot.Logger(ctx).Debug("leave event", "user", e.User.Username) if e.User.Bot { return } c := user.GetCopaing(ctx, e.User.ID, e.GuildID) if err := c.Delete(ctx); err != nil { - s.Logger().Error("deleting user", "user", e.User.Username, "guild", e.GuildID) + bot.Logger(ctx).Error("deleting user", "user", e.User.Username, "guild", e.GuildID) } } @@ -213,6 +213,15 @@ func main() { dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleSetReaction, rolereact.SetRoleReaction) dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleDelRole, rolereact.DelRole) + // commands + intrs.HandleCommand("rank", commands.Rank) + intrs.HandleCommand("config", commands.ConfigCommand) + intrs.HandleCommand("top", commands.Top) + intrs.HandleCommand("reset", commands.Reset) + intrs.HandleCommand("reset-user", commands.ResetUser) + intrs.HandleCommand("credits", commands.Credits) + intrs.HandleCommand("rolereact", rolereact.HandleCommand) + // interaction: /config intrs.HandleMessageComponent(commands.OpenConfig, commands.ConfigMessageComponent) // xp role related diff --git a/rolereact/events.go b/rolereact/events.go index 54400eb..090b924 100644 --- a/rolereact/events.go +++ b/rolereact/events.go @@ -13,11 +13,7 @@ type RoleReact struct { RoleID string } -func HandleReactionAdd( - _ context.Context, - s bot.Session, - e *event.MessageReactionAdd, -) { +func HandleReactionAdd(ctx context.Context, s bot.Session, e *event.MessageReactionAdd) { results := []RoleReact{} oldGokord.DB.Model(&config.RoleReact{}). Joins("JOIN role_react_messages ON role_reacts.role_react_message_id = role_react_messages.id"). @@ -26,16 +22,12 @@ func HandleReactionAdd( for _, role := range results { err := s.GuildAPI().MemberRoleAdd(e.GuildID, e.UserID, role.RoleID) if err != nil { - s.Logger().Error("Unable to add role after member added reaction", "error", err) + bot.Logger(ctx).Error("Unable to add role after member added reaction", "error", err) } } } -func HandleReactionRemove( - _ context.Context, - s bot.Session, - e *event.MessageReactionRemove, -) { +func HandleReactionRemove(ctx context.Context, s bot.Session, e *event.MessageReactionRemove) { results := []RoleReact{} oldGokord.DB.Model(&config.RoleReact{}). Joins("JOIN role_react_messages ON role_reacts.role_react_message_id = role_react_messages.id"). @@ -44,7 +36,7 @@ func HandleReactionRemove( for _, role := range results { err := s.GuildAPI().MemberRoleRemove(e.GuildID, e.UserID, role.RoleID) if err != nil { - s.Logger().Error("Unable to remove role after member removed reaction", "error", err) + bot.Logger(ctx).Error("Unable to remove role after member removed reaction", "error", err) } } } diff --git a/user/level.go b/user/level.go index 41fb291..feec35b 100644 --- a/user/level.go +++ b/user/level.go @@ -13,32 +13,26 @@ import ( "github.com/nyttikord/gokord/user" ) -func onNewLevel(s bot.Session, m *user.Member, level uint) { +func onNewLevel(ctx context.Context, s bot.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) { - s.Logger().Debug("add role", "role", role.RoleID, "user", m.DisplayName(), "guild", m.GuildID) + bot.Logger(ctx).Debug("add role", "role", role.RoleID, "user", m.DisplayName(), "guild", m.GuildID) err := s.GuildAPI().MemberRoleAdd(m.GuildID, m.User.ID, role.RoleID) if err != nil { - s.Logger().Error( + bot.Logger(ctx).Error( "adding role", - "error", err, - "role", role.RoleID, - "user", m.DisplayName(), - "guild", m.GuildID, + "error", err, "role", role.RoleID, "user", m.DisplayName(), "guild", m.GuildID, ) } } else if role.XP > xpForLevel && slices.Contains(m.Roles, role.RoleID) { - s.Logger().Debug("remove role", "role", role.RoleID, "user", m.DisplayName(), "guild", m.GuildID) + bot.Logger(ctx).Debug("remove role", "role", role.RoleID, "user", m.DisplayName(), "guild", m.GuildID) err := s.GuildAPI().MemberRoleRemove(m.GuildID, m.User.ID, role.RoleID) if err != nil { - s.Logger().Error( + bot.Logger(ctx).Error( "removing role", - "error", err, - "role", role.RoleID, - "user", m.DisplayName(), - "guild", m.GuildID, + "error", err, "role", role.RoleID, "user", m.DisplayName(), "guild", m.GuildID, ) } } @@ -51,7 +45,7 @@ func (c *CopaingCached) onNewLevel(ctx context.Context, s bot.Session, level uin bot.Logger(ctx).Error("getting member for new level", "error", err, "user", c.DiscordID, "guild", c.GuildID) return } - onNewLevel(s, m, level) + onNewLevel(ctx, s, m, level) } func PeriodicReducer(ctx context.Context, s bot.Session) { @@ -26,17 +26,20 @@ func (c *cXP) GetXP() uint { func (cc *CopaingCached) AddXP(ctx context.Context, s bot.Session, m *user.Member, xp uint, fn func(uint, uint)) { old := cc.XP pastLevel := exp.Level(old) - s.Logger().Debug("adding xp", "user", m.DisplayName(), "old", old, "to add", xp) + bot.Logger(ctx).Debug("adding xp", "user", m.DisplayName(), "old", old, "to add", xp) cc.XP += xp cc.XPToAdd += xp if err := cc.Save(ctx); err != nil { - s.Logger().Error("saving user in state", "error", err, "user", m.DisplayName(), "xp", xp, "guild", cc.GuildID) + bot.Logger(ctx).Error( + "saving user in state", + "error", err, "user", m.DisplayName(), "xp", xp, "guild", cc.GuildID, + ) return } newLevel := exp.Level(old + xp) if newLevel > pastLevel { fn(old+xp, newLevel) - onNewLevel(s, m, newLevel) + onNewLevel(ctx, s, m, newLevel) } } |
