From e92582a23d23a48c0bc787a3594bc3d855a93949 Mon Sep 17 00:00:00 2001 From: Leander Furumo Date: Thu, 29 Oct 2026 23:18:31 +0100 Subject: [PATCH] clean up leftover guild commands in prod and warn about duplicates in dev Co-Authored-By: Claude Opus 5.5 --- README.md | 2 ++ src/run.py | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4b1d36d..9edcaad 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ Merk at konfigurasjonsfilen har felt for bl.a. databasekobling. Disse er ikke p `config_mode` bestemmer hvor slash-kommandoene synkroniseres. Med `dev` synkroniseres de bare til serveren i `dev_guild`, der de dukker opp med en gang. Med `prod` synkroniseres de globalt. +Bruk en egen botbruker når du utvikler lokalt. Kjører du `dev` med samme token som produksjonsbotten, får serveren i `dev_guild` både de globale kommandoene og kopiene, og alle kommandoer vises to ganger. Botten logger en advarsel når det skjer. I `prod` fjernes kommandoer som er igjen i `dev_guild` fra tidligere `dev`-kjøringer automatisk. + ### Valgfrie funksjoner Mangler et felt, skrus funksjonene som trenger det av når botten starter: diff --git a/src/run.py b/src/run.py index 87588c1..0019656 100644 --- a/src/run.py +++ b/src/run.py @@ -130,12 +130,24 @@ class Bot(commands.Bot): name = file[:-3] await bot.load_extension(f"cogs.{name}") - # Sync slash commands + # Sync slash commands. A sync only replaces the commands in its own scope, so commands left + # in the other scope (global or guild) from running in the other mode show up as duplicates + guild = discord.Object(id=self.guild_id) if self.config_mode == "prod": await self.tree.sync(guild=None) + try: + self.tree.clear_commands(guild=guild) + await self.tree.sync(guild=guild) + except discord.HTTPException as e: + self.logger.warning(f"Could not remove leftover guild commands in {self.guild_id}: {e}") else: - self.tree.copy_global_to(guild=discord.Object(id=self.guild_id)) - await self.tree.sync(guild=discord.Object(id=self.guild_id)) + self.tree.copy_global_to(guild=guild) + await self.tree.sync(guild=guild) + if global_commands := await self.tree.fetch_commands(): + self.logger.warning( + f"This bot application also has {len(global_commands)} global slash commands, which show up " + + "twice in the dev guild. Use a separate bot application for development, see the README" + ) async def close(self): """