Catch typing() failures so Discord replies never go silent

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 <noreply@anthropic.com>
This commit is contained in:
2026-08-24 02:14:52 +09:00
co-authored by Claude Opus 5
parent 70735567f2
commit 858dbf4004
+8 -5
View File
@@ -112,8 +112,11 @@ async def on_message(message: discord.Message):
# (新規作成したスレッド、または元のチャンネル)に統一する。 # (新規作成したスレッド、または元のチャンネル)に統一する。
reply_channel = await _ensure_thread(message, content) 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): if any(keyword in content for keyword in USELESS_TALK_KEYWORDS):
redirect = await _generate_useless_talk_redirect(content) redirect = await _generate_useless_talk_redirect(content)
await _reply(message, reply_channel, redirect) await _reply(message, reply_channel, redirect)
@@ -147,9 +150,9 @@ async def on_message(message: discord.Message):
if reply: if reply:
record_message(reply) record_message(reply)
await _reply(message, reply_channel, reply or "(応答が空でした)") await _reply(message, reply_channel, reply or "(応答が空でした)")
except Exception: except Exception:
logger.exception("Failed to generate reply for Discord mention") logger.exception("Failed to generate reply for Discord mention")
await _reply(message, reply_channel, "⚠️ 応答の生成に失敗しました") await _reply(message, reply_channel, "⚠️ 応答の生成に失敗しました")
async def _generate_useless_talk_redirect(content: str) -> str: async def _generate_useless_talk_redirect(content: str) -> str: