aboutsummaryrefslogtreecommitdiff
path: root/commands/stats.go
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2026-01-17 20:52:13 +0000
committerAnhgelus Morhtuuzh <william@herges.fr>2026-01-17 20:52:13 +0000
commita3543d79561a3754540b921c54c3c177016c2397 (patch)
tree318b29652c4f59a7f6a16ff7a566b1a9935d069d /commands/stats.go
parent05ec1c26fe884097efe8fe1490916c518028e597 (diff)
parentc661541e45dddd6a082af66fcf7df7ba7dfdc6a6 (diff)
Merge pull request '[Perf] Member state' (#5) from perf/member-state into main
Reviewed-on: https://git.anhgelus.world/anhgelus/les-copaings-bot/pulls/5
Diffstat (limited to 'commands/stats.go')
-rw-r--r--commands/stats.go97
1 files changed, 50 insertions, 47 deletions
diff --git a/commands/stats.go b/commands/stats.go
index 4fc35ae..716616d 100644
--- a/commands/stats.go
+++ b/commands/stats.go
@@ -2,6 +2,7 @@ package commands
import (
"bytes"
+ "context"
"errors"
"fmt"
"image/color"
@@ -46,56 +47,58 @@ var colors = []color.RGBA{
{193, 18, 31, 255},
}
-func Stats(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
+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
}
- days = int(in)
- }
- err := resp.IsDeferred().Send()
- if err != nil {
- s.Logger().Error("sending deferred", "error", err)
- return
- }
- go func() {
- var w io.WriterTo
- if v, ok := opt["user"]; ok {
- w, err = statsMember(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)
+ 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
}
- return
- }
- b := new(bytes.Buffer)
- _, err = w.WriteTo(b)
- if err != nil {
- s.Logger().Error("writing png", "error", err)
+ days = int(in)
}
- err = resp.AddFile(&channel.File{
- Name: "plot.png",
- ContentType: "image/png",
- Reader: b,
- }).Send()
+ err := resp.IsDeferred().Send()
if err != nil {
- s.Logger().Error("sending stats", "error", err)
+ s.Logger().Error("sending deferred", "error", err)
+ 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)
+ }
+ }()
+ }
}
func statsAll(s bot.Session, i *event.InteractionCreate, days int) (io.WriterTo, error) {
@@ -104,7 +107,7 @@ func statsAll(s bot.Session, i *event.InteractionCreate, days int) (io.WriterTo,
})
}
-func statsMember(s bot.Session, i *event.InteractionCreate, days int, discordID string) (io.WriterTo, error) {
+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)
if err != nil {
return nil, err
@@ -112,7 +115,7 @@ func statsMember(s bot.Session, i *event.InteractionCreate, days int, discordID
return stats(s, 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(discordID, i.GuildID).ID,
+ i.GuildID, exp.TimeStampNDaysBefore(uint(days)), user.GetCopaing(ctx, discordID, i.GuildID).ID,
)
})
}