Gemini3Proが出てAIエージェントの新時代が到来したと思う今日この頃
新しくDiscordでAIエージェントBOTを作ろうかなと思った時に行き詰まったところがあったので備忘録的にまとめます
これから僕と同じようにDiscordで自作のBOTを作ろうと考えてる人の参考になれば幸いです
ボイスチャンネルからBOTが勝手に退出してしまう
結論から言うとDiscord.pyの公式リポジトリを見に行けばリファレンスは載っていました
ちゃんと呼んでる人はとても偉いです
僕は読まずに過去の知見で手探りに実装した悪い子です
とりあえず...
Botに@メンションしたら、メンションしたユーザーの居るボイスチャンネルに接続するような実装をしていました
async def on_message(self, message: discord.Message):
# ボットがメンションされたかチェック
if self.bot.user.mentioned_in(message):
# ユーザーがVCにいる場合
if user_in_voice:
await asyncio.sleep(2)
if message.guild.voice_client:
if message.guild.voice_client.channel != message.author.voice.channel:
await message.guild.voice_client.move_to(message.author.voice.channel)
else:
await message.author.voice.channel.connect()
return
よし、これで呼んだらボイスチャンネルに来てくれるかな〜とワクワクでメンションしてみたところ...
と思ったらしばらくすると勝手に退出してしまいました涙
BOTのコンソールを見てみると次のようなログが連続して流れていました
Unclosed connection
client_connection: Connection<ConnectionKey(host= ...
なんだこれ昔作った時はこんなことなかったぞ🤔
と思ってログの内容からライブラリの互換性やプロキシ設定、BOTのパーミッションの設定ミスかなといろいろ設定し直してみたのですが治らず...
と調べていると過去おんなじエラーに遭遇しているユーザーを発見👀
どうやらボイスチャンネルへの接続が不安定になる不具合があったらしく、Discord.pyにissueが上がっていました
ふむふむ...と読み進めつつ公式リポジトリを見に行ってみるとREADMEに次のような記載がありました

ボイスチャンネルを利用するためにdiscord.py[voice]というのを入れなければいけなかったみたいです!
PyNaClのインストールも一緒にしました👉
$ pip i -U "discord.py[voice]"
$ pip i -U pynacl
両方ともインストールしてからBOTを再起動させたら無事解決✨
あとがき
テキストチャンネルのみで運用していると気づきにくいところなので不具合に気付くのが遅れてしまいました
幸い追加でインストールするだけで問題が解決したのでよかったです
皆さんの助けになりますよーに
