From 885dc310e3f70c7d9043954f8bbc18b2ea5a0ba1 Mon Sep 17 00:00:00 2001 From: mingmxren Date: Sun, 1 Mar 2026 02:25:29 +0800 Subject: [PATCH] feat(commands): add command definitions and channel-aware registry --- pkg/commands/definition.go | 9 +++++++++ pkg/commands/registry.go | 26 ++++++++++++++++++++++++++ pkg/commands/registry_test.go | 21 +++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 pkg/commands/definition.go create mode 100644 pkg/commands/registry.go create mode 100644 pkg/commands/registry_test.go diff --git a/pkg/commands/definition.go b/pkg/commands/definition.go new file mode 100644 index 000000000..f1f67bcb8 --- /dev/null +++ b/pkg/commands/definition.go @@ -0,0 +1,9 @@ +package commands + +type Definition struct { + Name string + Description string + Usage string + Aliases []string + Channels []string +} diff --git a/pkg/commands/registry.go b/pkg/commands/registry.go new file mode 100644 index 000000000..481b79870 --- /dev/null +++ b/pkg/commands/registry.go @@ -0,0 +1,26 @@ +package commands + +type Registry struct { + defs []Definition +} + +func NewRegistry(defs []Definition) *Registry { + return &Registry{defs: defs} +} + +func (r *Registry) ForChannel(channel string) []Definition { + out := make([]Definition, 0, len(r.defs)) + for _, d := range r.defs { + if len(d.Channels) == 0 { + out = append(out, d) + continue + } + for _, ch := range d.Channels { + if ch == channel { + out = append(out, d) + break + } + } + } + return out +} diff --git a/pkg/commands/registry_test.go b/pkg/commands/registry_test.go new file mode 100644 index 000000000..ac31866ea --- /dev/null +++ b/pkg/commands/registry_test.go @@ -0,0 +1,21 @@ +package commands + +import "testing" + +func TestRegistry_FilterByChannel(t *testing.T) { + defs := []Definition{ + {Name: "help", Description: "Show help"}, + {Name: "admin", Description: "Admin only", Channels: []string{"telegram"}}, + } + r := NewRegistry(defs) + + gotTG := r.ForChannel("telegram") + if len(gotTG) != 2 { + t.Fatalf("telegram defs = %d, want 2", len(gotTG)) + } + + gotWA := r.ForChannel("whatsapp") + if len(gotWA) != 1 || gotWA[0].Name != "help" { + t.Fatalf("whatsapp defs = %+v, want only help", gotWA) + } +}