perf: cache static command menu layout to avoid redundant loop processing

This commit is contained in:
Fd
2026-07-16 07:15:38 +07:00
parent 5f16856959
commit ef888b7256
+40 -27
View File
@@ -3,6 +3,7 @@ package general
import ( import (
"fmt" "fmt"
"strings" "strings"
"sync"
"time" "time"
hc "neo/context" hc "neo/context"
@@ -13,6 +14,38 @@ func init() {
core.Default.Register(Help) core.Default.Register(Help)
} }
var (
cachedMenu string
menuOnce sync.Once
)
// buildMenuCache generates the static portion of the help menu
func buildMenuCache(prefix string) {
var sb strings.Builder
cmdMap := make(map[string][]string)
for _, cmd := range core.Default.GetCommands() {
cat := cmd.Category
if cat == "" {
cat = "general"
}
cmdMap[cat] = append(cmdMap[cat], cmd.Name)
}
for cat, cmds := range cmdMap {
sb.WriteString(fmt.Sprintf("\n*📃%s*\n", strings.ToUpper(cat)))
for i, cmdName := range cmds {
branch := "├"
if i == len(cmds)-1 {
branch = "└"
}
sb.WriteString(fmt.Sprintf("%s %s%s\n", branch, prefix, cmdName))
}
}
cachedMenu = sb.String()
}
var Help = &core.Command{ var Help = &core.Command{
Name: "help", Name: "help",
Aliases: []string{"?", "h", "menu"}, Aliases: []string{"?", "h", "menu"},
@@ -42,38 +75,18 @@ var Help = &core.Command{
pushName = "User" pushName = "User"
} }
// Header
var sb strings.Builder
sb.WriteString(fmt.Sprintf("%s *%s*👋\n📬 Need help? Here are all of my commands\n", greeting, pushName))
// Group commands by category (simulate json object array appending)
cmdMap := make(map[string][]string)
for _, cmd := range core.Default.GetCommands() {
cat := cmd.Category
if cat == "" {
cat = "general"
}
cmdMap[cat] = append(cmdMap[cat], cmd.Name)
}
prefix := ctx.Prefix() prefix := ctx.Prefix()
if prefix == "" { if prefix == "" {
// fallback if they called it somehow internally without prefix
prefix = "." prefix = "."
} }
// Print categories // Calculate the static command layout part only once
for cat, cmds := range cmdMap { menuOnce.Do(func() {
sb.WriteString(fmt.Sprintf("\n*📃%s*\n", strings.ToUpper(cat))) buildMenuCache(prefix)
for i, cmdName := range cmds { })
branch := "├"
if i == len(cmds)-1 {
branch = "└"
}
sb.WriteString(fmt.Sprintf("%s %s%s\n", branch, prefix, cmdName))
}
}
ctx.Reply(sb.String()) header := fmt.Sprintf("%s *%s*👋\n📬 Need help? Here are all of my commands\n", greeting, pushName)
ctx.Reply(header + cachedMenu)
}, },
} }