From 14eba332af4f65176674fd106dc1d3cd265165ef Mon Sep 17 00:00:00 2001 From: Neko Date: Thu, 20 Aug 2026 11:11:07 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20commands.command=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cogs/admin.py | 46 ++++++++++++++++------------------------------ 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/src/cogs/admin.py b/src/cogs/admin.py index 540c1ef..2b31fe8 100644 --- a/src/cogs/admin.py +++ b/src/cogs/admin.py @@ -19,16 +19,6 @@ class Admin(commands.Cog): - admin_group = app_commands.Group( - name="admin", - description="管理者向けコマンド", - ) - reset_group = app_commands.Group( - name="reset", - description="管理者向けリセットコマンド", - parent=admin_group, - ) - def __init__(self, bot: commands.Bot): self.bot = bot self._relearn_lock = asyncio.Lock() @@ -101,11 +91,11 @@ def _reset_and_relearn_sync(self) -> tuple[int, int, int]: update_compounds(self.bot.db) return learned_message_count, cleared_token_count, recalculated_token_count - @reset_group.command( + @commands.command( name="learn", description="学習データをリセットして全メッセージを再学習します", ) - async def reset_learn(self, interaction: discord.Interaction): + async def reset_learn(self, ctx: commands.Context): embed_helper = EmbedHelper(function_name="Admin Reset learn") if ADMIN_USER_ID is None: @@ -113,15 +103,15 @@ async def reset_learn(self, interaction: discord.Interaction): title="設定エラー", description="config.py に ADMIN_USER_ID が設定されていません。", ) - await interaction.response.send_message(embed=embed, ephemeral=True) + await ctx.author.send(embed=embed) return - if not self._is_admin_user(interaction.user.id): + if not self._is_admin_user(ctx.author.id): embed = embed_helper.create_error_embed( title="権限エラー", description="このコマンドは管理者のみ実行できます。", ) - await interaction.response.send_message(embed=embed, ephemeral=True) + await ctx.author.send(embed=embed) return if self._relearn_lock.locked(): @@ -129,11 +119,9 @@ async def reset_learn(self, interaction: discord.Interaction): title="処理中", description="現在、再学習処理を実行中です。完了まで待ってください。", ) - await interaction.response.send_message(embed=embed, ephemeral=True) + await ctx.author.send(embed=embed) return - await interaction.response.defer(ephemeral=True, thinking=True) - async with self._relearn_lock: try: ( @@ -146,7 +134,7 @@ async def reset_learn(self, interaction: discord.Interaction): title="再学習エラー", description="再学習中にエラーが発生しました。ログを確認してください。", ) - await interaction.followup.send(embed=embed, ephemeral=True) + await ctx.author.send(embed=embed) print(f"[Admin] Reset learn command failed: {error}") return @@ -159,13 +147,13 @@ async def reset_learn(self, interaction: discord.Interaction): f"tokensを再計算したメッセージ: {recalculated_token_count}件" ), ) - await interaction.followup.send(embed=embed, ephemeral=True) + await ctx.author.send(embed=embed) - @admin_group.command( + @commands.command( name="server_stats", description="導入サーバーごとのメッセージ数と収集ユーザー数を表示します", ) - async def server_stats(self, interaction: discord.Interaction): + async def server_stats(self, ctx: commands.Context): embed_helper = EmbedHelper(function_name="Admin Server Stats") if ADMIN_USER_ID is None: @@ -173,19 +161,17 @@ async def server_stats(self, interaction: discord.Interaction): title="設定エラー", description="config.py に ADMIN_USER_ID が設定されていません。", ) - await interaction.response.send_message(embed=embed, ephemeral=True) + await ctx.author.send(embed=embed) return - if not self._is_admin_user(interaction.user.id): + if not self._is_admin_user(ctx.author.id): embed = embed_helper.create_error_embed( title="権限エラー", description="このコマンドは管理者のみ実行できます。", ) - await interaction.response.send_message(embed=embed, ephemeral=True) + await ctx.author.send(embed=embed) return - await interaction.response.defer(ephemeral=True, thinking=True) - try: stats = await asyncio.to_thread(get_guild_collection_stats, self.bot.db) except Exception as error: @@ -193,7 +179,7 @@ async def server_stats(self, interaction: discord.Interaction): title="集計エラー", description="サーバー集計の取得中にエラーが発生しました。", ) - await interaction.followup.send(embed=embed, ephemeral=True) + await ctx.author.send(embed=embed) print(f"[Admin] Collection stats command failed: {error}") return @@ -203,7 +189,7 @@ async def server_stats(self, interaction: discord.Interaction): title="データなし", description="表示可能なサーバー情報がありません。", ) - await interaction.followup.send(embed=embed, ephemeral=True) + await ctx.author.send(embed=embed) return max_desc_len = 3800 @@ -223,7 +209,7 @@ async def server_stats(self, interaction: discord.Interaction): title="導入サーバー集計", description="\n".join(description_lines), ) - await interaction.followup.send(embed=embed, ephemeral=True) + await ctx.author.send(embed=embed) async def setup(bot: commands.Bot): From df0ccbd8ef3edf0b27afcacc43b69a30ec341582 Mon Sep 17 00:00:00 2001 From: Neko Date: Thu, 20 Aug 2026 15:08:47 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E3=82=A8=E3=83=A9=E3=83=BC=E5=87=A6?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cogs/admin.py | 111 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 101 insertions(+), 10 deletions(-) diff --git a/src/cogs/admin.py b/src/cogs/admin.py index 2b31fe8..7503ba6 100644 --- a/src/cogs/admin.py +++ b/src/cogs/admin.py @@ -103,7 +103,7 @@ async def reset_learn(self, ctx: commands.Context): title="設定エラー", description="config.py に ADMIN_USER_ID が設定されていません。", ) - await ctx.author.send(embed=embed) + await ctx.reply(embed=embed) return if not self._is_admin_user(ctx.author.id): @@ -111,7 +111,7 @@ async def reset_learn(self, ctx: commands.Context): title="権限エラー", description="このコマンドは管理者のみ実行できます。", ) - await ctx.author.send(embed=embed) + await ctx.reply(embed=embed) return if self._relearn_lock.locked(): @@ -119,7 +119,20 @@ async def reset_learn(self, ctx: commands.Context): title="処理中", description="現在、再学習処理を実行中です。完了まで待ってください。", ) - await ctx.author.send(embed=embed) + try: + await ctx.author.send(embed=embed) + except discord.Forbidden: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return + except discord.HTTPException: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return return async with self._relearn_lock: @@ -134,7 +147,20 @@ async def reset_learn(self, ctx: commands.Context): title="再学習エラー", description="再学習中にエラーが発生しました。ログを確認してください。", ) - await ctx.author.send(embed=embed) + try: + await ctx.author.send(embed=embed) + except discord.Forbidden: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return + except discord.HTTPException: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return print(f"[Admin] Reset learn command failed: {error}") return @@ -147,7 +173,20 @@ async def reset_learn(self, ctx: commands.Context): f"tokensを再計算したメッセージ: {recalculated_token_count}件" ), ) - await ctx.author.send(embed=embed) + try: + await ctx.author.send(embed=embed) + except discord.Forbidden: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return + except discord.HTTPException: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return @commands.command( name="server_stats", @@ -161,7 +200,20 @@ async def server_stats(self, ctx: commands.Context): title="設定エラー", description="config.py に ADMIN_USER_ID が設定されていません。", ) - await ctx.author.send(embed=embed) + try: + await ctx.author.send(embed=embed) + except discord.Forbidden: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return + except discord.HTTPException: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return return if not self._is_admin_user(ctx.author.id): @@ -169,7 +221,7 @@ async def server_stats(self, ctx: commands.Context): title="権限エラー", description="このコマンドは管理者のみ実行できます。", ) - await ctx.author.send(embed=embed) + await ctx.reply(embed=embed) return try: @@ -179,7 +231,20 @@ async def server_stats(self, ctx: commands.Context): title="集計エラー", description="サーバー集計の取得中にエラーが発生しました。", ) - await ctx.author.send(embed=embed) + try: + await ctx.author.send(embed=embed) + except discord.Forbidden: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return + except discord.HTTPException: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return print(f"[Admin] Collection stats command failed: {error}") return @@ -189,7 +254,20 @@ async def server_stats(self, ctx: commands.Context): title="データなし", description="表示可能なサーバー情報がありません。", ) - await ctx.author.send(embed=embed) + try: + await ctx.author.send(embed=embed) + except discord.Forbidden: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return + except discord.HTTPException: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return return max_desc_len = 3800 @@ -209,7 +287,20 @@ async def server_stats(self, ctx: commands.Context): title="導入サーバー集計", description="\n".join(description_lines), ) - await ctx.author.send(embed=embed) + try: + await ctx.author.send(embed=embed) + except discord.Forbidden: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return + except discord.HTTPException: + await ctx.reply(embed_helper.create_error_embed( + title="DMに送信できませんでした。", + description="DMを受け取れるようにしてください。" + )) + return async def setup(bot: commands.Bot):