Месяц назад я сделал музыкального бота для сервера разногласий, используя discord.py. Еще неделю назад это работало хорошо, но теперь, когда я использую команду join
, бот не может подключиться к голосовому каналу. Вот код команды:
class MonClient(discord.Client):
async def on_ready(self):
self.voice = None # contains the <VoiceClient> object created by <chan.connect> in the join command
async def on_message(self,message):
if message.author.bot:
pass
elif message.content[0] == "!": # the command prefix is "!"
parts = message.content.split(" ")
command = parts[0][1:]
if command == "join":
if message.author.voice != None and self.voice == None:
chan = message.author.voice.channel
await message.channel.send("before connecting to voice channel")
self.voice = await chan.connect()
await message.channel.send("after connecting to voice channel")
else:
await message.channel.send("Bot already connected to voice channel or user not connected to voice channel")
Точнее, бот успешно отправляет «перед подключением к голосовому каналу» в текстовом канале, затем показывается, что он присоединился к голосовому каналу с помощью пользовательского интерфейса Discord (его изображение отображается в списке участников, подключенных к голосовому каналу, есть звук подключения к голосовому каналу). А вот второе сообщение "после подключения к голосовому каналу" никогда не отправляется. Мы по-прежнему можем использовать другие команды бота, но переменная self.voice
по-прежнему содержит None
, поэтому, очевидно, бот не может воспроизводить музыку.
Я предполагаю, что асинхронный метод connect
останавливается на чем-то на неопределенное время, но я не могу понять, что, потому что нет сообщения об ошибке, даже TimeoutError, описанного в документации. С интернет-соединением все в порядке, и, как я уже сказал, бот работал хорошо две или три недели, так что теперь я действительно не знаю, как лучше понять, что блокирует соединение.
В Stackoverflow есть несколько других вопросов по аналогичным проблемам, но предложенные ответы не имели отношения к моей проблеме: в ответе предлагался другой метод получения объекта голосового канала для подключения, но я уже получил хороший объект, поскольку бот по крайней мере показан для подключения к голосовому каналу; и еще один ответ был связан со строками @client.command()
, которые я не использую.
Убедитесь, что ваша библиотека обновлена, недавно Discord внес изменения. Это сработало для меня.
pip install -U discord