discrawl/internal/cli/analytics.go
2026-05-08 09:49:13 +01:00

105 lines
2.5 KiB
Go

package cli
import (
"errors"
"flag"
"fmt"
"io"
"strings"
"github.com/openclaw/discrawl/internal/report"
)
func (r *runtime) runAnalytics(args []string) error {
if len(args) == 0 {
printAnalyticsUsage(r.stdout)
return nil
}
subcommand := strings.TrimSpace(args[0])
subArgs := args[1:]
switch subcommand {
case "quiet":
return r.withLocalStoreRead(true, func() error {
return r.runAnalyticsQuiet(subArgs)
})
case "trends":
return r.withLocalStoreRead(true, func() error {
return r.runAnalyticsTrends(subArgs)
})
default:
return usageErr(fmt.Errorf("unknown analytics subcommand %q", subcommand))
}
}
func printAnalyticsUsage(w io.Writer) {
_, _ = fmt.Fprintln(w, "Usage: discrawl analytics <subcommand> [flags]")
_, _ = fmt.Fprintln(w)
_, _ = fmt.Fprintln(w, "Subcommands:")
_, _ = fmt.Fprintln(w, " quiet Channels with no activity in the lookback window.")
_, _ = fmt.Fprintln(w, " trends Week-over-week message counts per channel.")
}
func (r *runtime) runAnalyticsQuiet(args []string) error {
fs := flag.NewFlagSet("analytics quiet", flag.ContinueOnError)
fs.SetOutput(io.Discard)
since := fs.String("since", "30d", "")
guild := fs.String("guild", "", "")
if err := fs.Parse(args); err != nil {
return usageErr(err)
}
if fs.NArg() != 0 {
return usageErr(errors.New("analytics quiet takes no positional arguments"))
}
lookback, err := parseLookback(*since)
if err != nil {
return usageErr(fmt.Errorf("parse --since: %w", err))
}
guildID := strings.TrimSpace(*guild)
if guildID == "" {
guildID = r.cfg.EffectiveDefaultGuildID()
}
quiet, err := report.BuildQuiet(r.ctx, r.store, report.QuietOptions{
Since: lookback,
GuildID: guildID,
})
if err != nil {
return err
}
return r.print(quiet)
}
func (r *runtime) runAnalyticsTrends(args []string) error {
fs := flag.NewFlagSet("analytics trends", flag.ContinueOnError)
fs.SetOutput(io.Discard)
weeks := fs.Int("weeks", 8, "")
guild := fs.String("guild", "", "")
channel := fs.String("channel", "", "")
if err := fs.Parse(args); err != nil {
return usageErr(err)
}
if fs.NArg() != 0 {
return usageErr(errors.New("analytics trends takes no positional arguments"))
}
if *weeks < 0 {
return usageErr(errors.New("--weeks must be zero or greater"))
}
guildID := strings.TrimSpace(*guild)
if guildID == "" {
guildID = r.cfg.EffectiveDefaultGuildID()
}
trends, err := report.BuildTrends(r.ctx, r.store, report.TrendsOptions{
Weeks: *weeks,
GuildID: guildID,
Channel: *channel,
})
if err != nil {
return err
}
return r.print(trends)
}