diff options
| -rw-r--r-- | bot/exts/info/information.py | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/bot/exts/info/information.py b/bot/exts/info/information.py index 42385edfb..1ba8cf87e 100644 --- a/bot/exts/info/information.py +++ b/bot/exts/info/information.py @@ -546,33 +546,37 @@ class Information(Cog): return full_rules = await self.bot.api_client.get("rules", params={"link_format": "md"}) + available_keywords = set() + + for _, rule_keywords in full_rules: + available_keywords = available_keywords | set(rule_keywords) # Remove duplicates and sort the rule indices rule_numbers = sorted(set(rule_numbers)) - # Remove duplicate keywords - keywords = set(keywords) + # Remove duplicate keywords and preserve the order of initial keywords + keywords = list(dict.fromkeys(keywords)) invalid = ", ".join(str(index) for index in rule_numbers if index < 1 or index > len(full_rules)) - if invalid and not keywords: + if invalid: await ctx.send(shorten(":x: Invalid rule indices: " + invalid, 75, placeholder=" ...")) return - final_rules = set() - - for pick in rule_numbers: - self.bot.stats.incr(f"rule_uses.{pick}") - final_rules.add(f"**{pick}.** {full_rules[pick - 1][0]}") + final_rule_numbers = [] + final_rule_numbers.extend(rule_numbers) for keyword in keywords: + if keyword not in available_keywords: + break + for pick, rule in enumerate(full_rules): if keyword not in rule[1]: continue - self.bot.stats.incr(f"rule_uses.{pick + 1}") - final_rules.add(f"**{pick + 1}.** {full_rules[pick][0]}") + final_rule_numbers.append(pick + 1) + break - if not rule_numbers and not final_rules: + if not rule_numbers and not final_rule_numbers: # This would mean that only keywords where used and no match for them was found await ctx.send( f"There are currently no rules that correspond to keywords: **{', '.join(keywords)}**.\n" @@ -580,6 +584,13 @@ class Information(Cog): f"<#{constants.Channels.meta}> or <#{constants.Channels.dev_contrib}>") return + for rule_number in final_rule_numbers: + self.bot.stats.incr(f"rule_uses.{rule_number}") + + final_rule_numbers.sort() + final_rule_numbers = set(final_rule_numbers) + final_rules = [f"**{rule_number}.** {full_rules[rule_number - 1][0]}" for rule_number in final_rule_numbers] + await LinePaginator.paginate(final_rules, ctx, rules_embed, max_lines=3) |