diff --git a/bot.py b/bot.py index 223ff15..57a7bfe 100644 --- a/bot.py +++ b/bot.py @@ -9,7 +9,7 @@ from modules.common.boot_notice import post_boot_notice # Version consists of: # Major.Enhancement.Minor.Patch.Test (Test is alphanumeric; doesn’t trigger auto update) -VERSION = "0.3.9.6.a4" +VERSION = "0.3.9.6.a5" # ---------- Env loading ---------- @@ -111,7 +111,7 @@ async def _guild_selfcheck(g: discord.Guild, c): @bot.event async def on_ready(): - import asyncio # safe inside function; ensures availability + import asyncio print(f"Logged in as {bot.user} (ID: {bot.user.id})") print("[Intents] members:", bot.intents.members, @@ -126,51 +126,73 @@ async def on_ready(): except Exception as e: print("[SelfCheck] failed:", repr(e)) - # Slash command sync (env-aware dev guild) + always print what exists after sync + # ---------- Slash command scope & sync ---------- + # + # Toggle here (or set SHAI_SLASH_GUILD_ONLY=true/false): + guild_only = env_cfg.bool("slash_guild_only", True) + + # Choose target guilds for "instant" registration + target_gids = set() + for key in ("home_guild_id", "dev_guild_id"): + val = env_cfg.get(key) + if val: + try: + target_gids.add(int(val)) + except Exception: + pass + try: - dev_gid = env_cfg.get("dev_guild_id") + if guild_only and target_gids: + print(f"[Slash] Mode: GUILD-ONLY to {sorted(target_gids)}") + + # Copy all currently-loaded global commands to each target guild + for gid in sorted(target_gids): + g = bot.get_guild(gid) + if not g: + print(f"[Slash] Guild {gid}: not in cache; skipping copy/sync.") + continue + bot.tree.copy_global_to(guild=g) + g_cmds = await bot.tree.sync(guild=g) + names = ", ".join(f"/{c.name}" for c in g_cmds) if g_cmds else "(none)" + print(f"[Slash] Synced {len(g_cmds)} commands to {g.name} ({g.id}): {names}") + + # Now remove global commands so only guild-scoped remain + bot.tree.clear_commands(guild=None) + cleared = await bot.tree.sync() # push empty global set (purges old global copies) + print(f"[Slash] Cleared global commands (now {len(cleared)}).") - if dev_gid: - guild = bot.get_guild(int(dev_gid)) - if guild: - synced = await bot.tree.sync(guild=guild) - print(f"[Slash] Synced {len(synced)} commands to {guild.name} ({guild.id})") - else: - synced = await bot.tree.sync() - print(f"[Slash] Synced {len(synced)} commands globally (dev_guild_id not in cache)") else: - synced = await bot.tree.sync() - print(f"[Slash] Synced {len(synced)} commands globally") + print("[Slash] Mode: GLOBAL") + # Purge any old per-guild copies in target guilds (to avoid dupes), + # then sync globally once. + for gid in sorted(target_gids): + g = bot.get_guild(gid) + if not g: + print(f"[Slash] Guild {gid}: not in cache; skip purge.") + continue + bot.tree.clear_commands(guild=g) + await bot.tree.sync(guild=g) + print(f"[Slash] Purged guild-specific commands in {g.name} ({g.id}).") - # --- List what actually exists after sync --- + global_cmds = await bot.tree.sync() + names = ", ".join(f"/{c.name}" for c in global_cmds) if global_cmds else "(none)" + print(f"[Slash] Synced {len(global_cmds)} commands globally: {names}") + + # --- Always print what actually exists after sync --- def _fmt_cmds(cmds): try: - names = [f"/{c.name}" for c in cmds] - return ", ".join(names) if names else "(none)" + return ", ".join(f"/{c.name}" for c in cmds) if cmds else "(none)" except Exception: return "(unreadable)" - # Global commands + # Global list try: global_cmds = await bot.tree.fetch_commands() print(f"[Slash] Global commands ({len(global_cmds)}): {_fmt_cmds(global_cmds)}") except Exception as e: print("[Slash] Failed to fetch global commands:", repr(e)) - # Target guilds to inspect: dev + home (if provided) - target_gids = set() - if dev_gid: - try: - target_gids.add(int(dev_gid)) - except Exception: - pass - home_gid = env_cfg.get("home_guild_id") - if home_gid: - try: - target_gids.add(int(home_gid)) - except Exception: - pass - + # Guild lists for gid in sorted(target_gids): g = bot.get_guild(gid) if not g: @@ -181,7 +203,6 @@ async def on_ready(): print(f"[Slash] {g.name} ({g.id}) guild commands ({len(g_cmds)}): {_fmt_cmds(g_cmds)}") except Exception as e: print(f"[Slash] Failed to fetch commands for guild {gid}:", repr(e)) - # --- end list --- except Exception as e: print("[Slash] Sync failed:", repr(e)) diff --git a/modules/pirate_report/pirate_report.py b/modules/pirate_report/pirate_report.py index 5b6d654..4122307 100644 --- a/modules/pirate_report/pirate_report.py +++ b/modules/pirate_report/pirate_report.py @@ -649,30 +649,4 @@ class PirateReportCog(commands.Cog): dm.remove('reports', lambda r: r.get('report_id') == msg.id) async def setup(bot): - cog = PirateReportCog(bot) - await bot.add_cog(cog) - - home_gid = cfg(bot).int('home_guild_id', 0) - guild_obj = discord.Object(id=home_gid) if home_gid else None - - def _rm(name: str): - try: - bot.tree.remove_command(name, guild=guild_obj) - except Exception: - try: - bot.tree.remove_command(name, guild=None) - except Exception: - pass - - # make re-loads idempotent - for name in ("report", "edit_pirate", "encounter"): - _rm(name) - - if home_gid: - bot.tree.add_command(cog.report, guild=guild_obj) - bot.tree.add_command(cog.edit_pirate, guild=guild_obj) - bot.tree.add_command(cog.encounter, guild=guild_obj) - else: - bot.tree.add_command(cog.report) - bot.tree.add_command(cog.edit_pirate) - bot.tree.add_command(cog.encounter) + await bot.add_cog(PirateReportCog(bot)) \ No newline at end of file diff --git a/modules/spicepay/spicepay.py b/modules/spicepay/spicepay.py index 91d6d59..dd82f95 100644 --- a/modules/spicepay/spicepay.py +++ b/modules/spicepay/spicepay.py @@ -900,39 +900,3 @@ class SpicePayCog(commands.Cog): async def setup(bot: commands.Bot): cog = SpicePayCog(bot) await bot.add_cog(cog) - - # If you use cfg(bot), great; otherwise fall back to DEFAULT. - try: - from modules.common.settings import cfg as _cfg - home_gid = _cfg(bot).int('home_guild_id', 0) - except Exception: - try: - home_gid = int(bot.config['DEFAULT'].get('home_guild_id', '0')) - except Exception: - home_gid = 0 - - guild_obj = discord.Object(id=home_gid) if home_gid else None - - # Make reloads safe: remove if present, then add. - def _rm(name: str): - try: - bot.tree.remove_command(name, guild=guild_obj) - except Exception: - try: - bot.tree.remove_command(name, guild=None) - except Exception: - pass - - for name in ("spicepay", "spicepay_resume", "spicepay_cancel", "spicepay_config"): - _rm(name) - - if home_gid: - bot.tree.add_command(cog.spicepay, guild=guild_obj) - bot.tree.add_command(cog.spicepay_resume, guild=guild_obj) - bot.tree.add_command(cog.spicepay_cancel, guild=guild_obj) - bot.tree.add_command(cog.spicepay_config, guild=guild_obj) - else: - bot.tree.add_command(cog.spicepay) - bot.tree.add_command(cog.spicepay_resume) - bot.tree.add_command(cog.spicepay_cancel) - bot.tree.add_command(cog.spicepay_config)