From 529272a9a9d458b5e4f0aa69d5fa86999120d76c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=9F=E8=92=BB?= <41978811+patyhank@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:09:44 +0800 Subject: [PATCH] cmdroute: Fix Autocompleter handling (#423) * handle group with cmdroute/autocompleter * handle autocompleter: find all options --- api/cmdroute/router.go | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/api/cmdroute/router.go b/api/cmdroute/router.go index 4a264cd0..e54862ba 100644 --- a/api/cmdroute/router.go +++ b/api/cmdroute/router.go @@ -316,18 +316,42 @@ type autocompleterData struct { data discord.AutocompleteOption } +// findAutocompleter finds the autocomplete handler for the given option name. +// It checks the current router and its groups. func (r *Router) findAutocompleter(ev *discord.InteractionEvent, data discord.AutocompleteOption) (autocompleterData, bool) { + found, ok := r.findAutocompleterOnce(ev, data) + if ok { + return found, true + } + + for _, sub := range r.groups { + found, ok = sub.findAutocompleterOnce(ev, data) + if ok { + return found, true + } + } + + return autocompleterData{}, false +} + +// findAutocompleter finds the autocomplete handler for the given option name. +// It only checks the current router and not its groups. +func (r *Router) findAutocompleterOnce(ev *discord.InteractionEvent, data discord.AutocompleteOption) (autocompleterData, bool) { node, ok := r.nodes[data.Name] if !ok { return autocompleterData{}, false } - switch node := node.(type) { case routeNodeSub: if len(data.Options) != 1 || data.Type != discord.SubcommandGroupOptionType { break } - return node.findAutocompleter(ev, data.Options[0]) + for _, option := range data.Options { + found, ok := node.findAutocompleter(ev, option) + if ok { + return found, true + } + } case routeNodeCommand: if node.autocomplete == nil { break @@ -341,7 +365,6 @@ func (r *Router) findAutocompleter(ev *discord.InteractionEvent, data discord.Au data: data, }, true } - return autocompleterData{}, false }