1
0
Fork 0
mirror of https://github.com/diamondburned/arikawa.git synced 2025-03-31 06:44:54 +00:00

cmdroute: Fix Autocompleter handling (#423)

* handle group with cmdroute/autocompleter

* handle autocompleter: find all options
This commit is contained in:
蒟蒻 2024-03-19 14:09:44 +08:00 committed by GitHub
parent 5089b62bb2
commit 529272a9a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -316,18 +316,42 @@ type autocompleterData struct {
data discord.AutocompleteOption 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) { 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] node, ok := r.nodes[data.Name]
if !ok { if !ok {
return autocompleterData{}, false return autocompleterData{}, false
} }
switch node := node.(type) { switch node := node.(type) {
case routeNodeSub: case routeNodeSub:
if len(data.Options) != 1 || data.Type != discord.SubcommandGroupOptionType { if len(data.Options) != 1 || data.Type != discord.SubcommandGroupOptionType {
break 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: case routeNodeCommand:
if node.autocomplete == nil { if node.autocomplete == nil {
break break
@ -341,7 +365,6 @@ func (r *Router) findAutocompleter(ev *discord.InteractionEvent, data discord.Au
data: data, data: data,
}, true }, true
} }
return autocompleterData{}, false return autocompleterData{}, false
} }