From 858dbf4004909ad422eff4fdbf86c6358c013640 Mon Sep 17 00:00:00 2001 From: zukki259 Date: Mon, 24 Aug 2026 02:14:52 +0900 Subject: [PATCH] Catch typing() failures so Discord replies never go silent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reply_channel.typing() の async with を try の外に置いていたため、 その __aenter__(=タイピング表示リクエストの送信)が失敗すると on_message 自体が落ち、on_message 内の except にも届かず、ユーザーには何の応答も 返らなかった。スレッド作成には成功しても "Send Messages in Threads" 権限が無いだけでこの状態になりうる("Create Public Threads" とは別の 権限のため、片方だけ付与した構成は普通に起こる)。 try を async with の外側に広げ、typing() の失敗も含めて "⚠️ 応答の生成に失敗しました" を返せるようにした。 Co-Authored-By: Claude Opus 5 --- backend/app/core/discord/discord_bot.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/backend/app/core/discord/discord_bot.py b/backend/app/core/discord/discord_bot.py index d8d5add..3b64284 100644 --- a/backend/app/core/discord/discord_bot.py +++ b/backend/app/core/discord/discord_bot.py @@ -112,8 +112,11 @@ async def on_message(message: discord.Message): # (新規作成したスレッド、または元のチャンネル)に統一する。 reply_channel = await _ensure_thread(message, content) - async with reply_channel.typing(): - try: + try: + # typing() の開始(=タイピング表示のリクエスト送信)自体が権限不足で失敗しうる + # (スレッド作成には成功しても "Send Messages in Threads" が無いケースなど)ため、 + # try の外に置くと on_message ごと落ちて何の返信もされない。try の内側に入れる。 + async with reply_channel.typing(): if any(keyword in content for keyword in USELESS_TALK_KEYWORDS): redirect = await _generate_useless_talk_redirect(content) await _reply(message, reply_channel, redirect) @@ -147,9 +150,9 @@ async def on_message(message: discord.Message): if reply: record_message(reply) await _reply(message, reply_channel, reply or "(応答が空でした)") - except Exception: - logger.exception("Failed to generate reply for Discord mention") - await _reply(message, reply_channel, "⚠️ 応答の生成に失敗しました") + except Exception: + logger.exception("Failed to generate reply for Discord mention") + await _reply(message, reply_channel, "⚠️ 応答の生成に失敗しました") async def _generate_useless_talk_redirect(content: str) -> str: