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 (
"fmt"
"strings"
"sync"
"time"
hc "neo/context"
@@ -13,6 +14,38 @@ func init() {
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{
Name: "help",
Aliases: []string{"?", "h", "menu"},
@@ -42,38 +75,18 @@ var Help = &core.Command{
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()
if prefix == "" {
// fallback if they called it somehow internally without prefix
prefix = "."
}
// Print categories
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))
}
}
// Calculate the static command layout part only once
menuOnce.Do(func() {
buildMenuCache(prefix)
})
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)
},
}