From 675236bb9689e08dc287e438c6fe0c2fae8a0782 Mon Sep 17 00:00:00 2001 From: Cal Date: Fri, 28 Jun 2024 18:57:10 -0600 Subject: [PATCH] group search multimatches by displayed name --- evennia/utils/utils.py | 49 ++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/evennia/utils/utils.py b/evennia/utils/utils.py index cc92baee47..360213ba3a 100644 --- a/evennia/utils/utils.py +++ b/evennia/utils/utils.py @@ -2397,28 +2397,35 @@ def at_search_result(matches, caller, query="", quiet=False, **kwargs): query=query ) - for num, result in enumerate(matches): - # 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=( - result.get_display_name(caller) - if hasattr(result, "get_display_name") + # group results by display name to properly disambiguate + grouped_matches = defaultdict(list) + for item in matches: + group_key = ( + item.get_display_name(caller) + if hasattr(item, "get_display_name") else query - ), - aliases=" [{alias}]".format(alias=";".join(aliases)) if aliases else "", - info=result.get_extra_info(caller), - ) + ) + grouped_matches[group_key].append(item) + + 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 else: # exactly one match