From d36ffedd70ed2a165f66455e53506fd572e9da8c Mon Sep 17 00:00:00 2001 From: Conatum Date: Thu, 25 May 2023 19:26:06 +0300 Subject: [PATCH] rewrite: Add command mention cache. --- src/core/cog.py | 28 ++++++++++++++++++++++++++++ src/modules/rooms/roomui.py | 5 +++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/core/cog.py b/src/core/cog.py index a307ad60..3bd09bec 100644 --- a/src/core/cog.py +++ b/src/core/cog.py @@ -1,6 +1,7 @@ from typing import Optional import discord +import discord.app_commands as appcmd from meta import LionBot, LionCog, LionContext from meta.app import shardname, appname @@ -42,6 +43,7 @@ class CoreCog(LionCog): self.app_cmd_cache: list[discord.app_commands.AppCommand] = [] self.cmd_name_cache: dict[str, discord.app_commands.AppCommand] = {} + self.mention_cache: dict[str, str] = {} async def cog_load(self): # Fetch (and possibly create) core data rows. @@ -62,10 +64,36 @@ class CoreCog(LionCog): await self.bot.add_cog(self.lions) # Load the app command cache + await self.reload_appcmd_cache() + + async def reload_appcmd_cache(self): for guildid in self.bot.testing_guilds: self.app_cmd_cache += await self.bot.tree.fetch_commands(guild=discord.Object(guildid)) self.app_cmd_cache += await self.bot.tree.fetch_commands() self.cmd_name_cache = {cmd.name: cmd for cmd in self.app_cmd_cache} + self.mention_cache = self._mention_cache_from(self.app_cmd_cache) + + def _mention_cache_from(self, cmds: list[appcmd.AppCommand | appcmd.AppCommandGroup]): + cache = {} + for cmd in cmds: + cache[cmd.qualified_name if isinstance(cmd, appcmd.AppCommandGroup) else cmd.name] = cmd.mention + subcommands = [option for option in cmd.options if isinstance(option, appcmd.AppCommandGroup)] + if subcommands: + subcache = self._mention_cache_from(subcommands) + cache |= subcache + return cache + + def mention_cmd(self, name): + """ + Create an application command mention for the given names. + + If not found in cache, creates a 'fake' mention with an invalid id. + """ + if name in self.mention_cache: + mention = self.mention_cache[name] + else: + mention = f"