group search multimatches by displayed name

This commit is contained in:
Cal 2024-06-28 18:57:10 -06:00
parent aeb0cf6854
commit 675236bb96

View file

@ -2397,28 +2397,35 @@ def at_search_result(matches, caller, query="", quiet=False, **kwargs):
query=query query=query
) )
for num, result in enumerate(matches): # group results by display name to properly disambiguate
# we need to consider that result could be a Command, where .aliases grouped_matches = defaultdict(list)
# is a list of strings for item in matches:
if hasattr(result.aliases, "all"): group_key = (
# result is a typeclassed entity where `.aliases` is an AliasHandler. item.get_display_name(caller)
aliases = result.aliases.all(return_objs=True) if hasattr(item, "get_display_name")
# remove pluralization aliases
aliases = [alias.db_key for alias in aliases if alias.db_category != "plural_key"]
else:
# result is likely a Command, where `.aliases` is a list of strings.
aliases = result.aliases
error += _MULTIMATCH_TEMPLATE.format(
number=num + 1,
name=(
result.get_display_name(caller)
if hasattr(result, "get_display_name")
else query else query
), )
aliases=" [{alias}]".format(alias=";".join(aliases)) if aliases else "", grouped_matches[group_key].append(item)
info=result.get_extra_info(caller),
) for key, match_list in grouped_matches.items():
for num, result in enumerate(match_list):
# we need to consider that result could be a Command, where .aliases
# is a list of strings
if hasattr(result.aliases, "all"):
# result is a typeclassed entity where `.aliases` is an AliasHandler.
aliases = result.aliases.all(return_objs=True)
# remove pluralization aliases
aliases = [alias.db_key for alias in aliases if alias.db_category != "plural_key"]
else:
# result is likely a Command, where `.aliases` is a list of strings.
aliases = result.aliases
error += _MULTIMATCH_TEMPLATE.format(
number=num + 1,
name=key,
aliases=" [{alias}]".format(alias=";".join(aliases)) if aliases else "",
info=result.get_extra_info(caller),
)
matches = None matches = None
else: else:
# exactly one match # exactly one match