diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-08-21 15:41:40 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-08-21 15:41:40 +0200 |
| commit | e00f05d7c636f9a1b7a10930402cfeb9331f6631 (patch) | |
| tree | a84053c6f902f9769ac7a88c17d208a9fcd1ab0b /commands | |
| parent | d98e5704f9a3d4fd98800bbc4bd48e1b0a442d3f (diff) | |
feat(command): fetch stats
Diffstat (limited to 'commands')
| -rw-r--r-- | commands/credits.go | 2 | ||||
| -rw-r--r-- | commands/stats.go | 62 |
2 files changed, 63 insertions, 1 deletions
diff --git a/commands/credits.go b/commands/credits.go index 9682d0e..5c3c4bd 100644 --- a/commands/credits.go +++ b/commands/credits.go @@ -10,7 +10,7 @@ import ( func Credits(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { 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 += "Host du bot : " + gokord.BaseCfg.GetAuthor() + ".\n\n" msg += "Utilise :\n- [anhgelus/gokord](<https://github.com/anhgelus/gokord>)" err := resp.SetMessage(msg).Send() if err != nil { diff --git a/commands/stats.go b/commands/stats.go new file mode 100644 index 0000000..80a9b1b --- /dev/null +++ b/commands/stats.go @@ -0,0 +1,62 @@ +package commands + +import ( + "time" + + "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/bwmarrin/discordgo" +) + +type data struct { + CreatedAt time.Time + XP int + CopaingID int + copaing *user.Copaing +} + +func Stats(_ *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionMap, resp *cmd.ResponseBuilder) { + cfg := config.GetGuildConfig(i.GuildID) + days := cfg.DaysXPRemains + if v, ok := opt["days"]; ok { + in := v.IntValue() + if in < 0 || uint(in) > days { + if err := resp.SetMessage("Nombre de jours invalide").IsEphemeral().Send(); err != nil { + logger.Alert("commands/stats.go - Sending invalid days", err.Error()) + } + return + } + days = uint(in) + } + var stats []*data + res := gokord.DB.Raw( + `SELECT "created_at"::date::text, sum(xp) as xp, copaing_id FROM copaing_xps GROUP BY "created_at"::date `+ + ` WHERE guild_id = ? and created_at < ?`, + i.GuildID, exp.TimeStampNDaysBefore(days), + ) + if res.Error != nil { + logger.Alert("commands/stats.go - Fetching XP data", res.Error.Error(), "guild_id", i.GuildID) + return + } + if err := res.Scan(&stats).Error; err != nil { + logger.Alert("commands/stats.go - Scanning result", err.Error(), "res") + return + } + copaings := map[int]*user.Copaing{} + for _, s := range stats { + c, ok := copaings[s.CopaingID] + if ok { + s.copaing = c + } else { + if err := gokord.DB.First(s.copaing, s.CopaingID).Error; err != nil { + logger.Alert("commands/stats.go - Finding copaing", err.Error(), "id", s.CopaingID) + return + } + copaings[s.CopaingID] = s.copaing + } + } +} |
