package plugin import ( "fmt" "log/slog" "regexp" "strconv" "strings" "time" "gogobee/internal/db" "maunium.net/go/mautrix" ) var countdownLabelRe = regexp.MustCompile(`"([^"]+)"\s+(\d{4}-\d{2}-\d{2})`) // CountdownPlugin manages countdown timers to specific dates. type CountdownPlugin struct { Base } // NewCountdownPlugin creates a new countdown plugin. func NewCountdownPlugin(client *mautrix.Client) *CountdownPlugin { return &CountdownPlugin{ Base: NewBase(client), } } func (p *CountdownPlugin) Name() string { return "countdown" } func (p *CountdownPlugin) Commands() []CommandDef { return []CommandDef{ {Name: "countdown", Description: "Manage countdowns to dates", Usage: "!countdown [add/private/mine/remove/id]", Category: "Personal"}, } } func (p *CountdownPlugin) Init() error { // Auto-complete old countdowns p.completeOldCountdowns() return nil } func (p *CountdownPlugin) OnReaction(_ ReactionContext) error { return nil } func (p *CountdownPlugin) OnMessage(ctx MessageContext) error { if !p.IsCommand(ctx.Body, "countdown") { return nil } args := strings.TrimSpace(p.GetArgs(ctx.Body, "countdown")) switch { case strings.HasPrefix(strings.ToLower(args), "add "): return p.handleAdd(ctx, args[4:], true) case strings.HasPrefix(strings.ToLower(args), "private "): return p.handleAdd(ctx, args[8:], false) case strings.ToLower(args) == "mine": return p.handleMine(ctx) case strings.HasPrefix(strings.ToLower(args), "remove "): return p.handleRemove(ctx, strings.TrimSpace(args[7:])) case args == "": return p.handleList(ctx) default: // Try to parse as an ID if _, err := strconv.Atoi(args); err == nil { return p.handleShow(ctx, args) } return p.SendReply(ctx.RoomID, ctx.EventID, "Usage: !countdown add \"