Функция StreamPlayer "после" не вызывается - PullRequest
0 голосов
/ 30 июня 2018

Я создаю диссон-бота, который может воспроизводить музыку, но я немного застрял, потому что когда бот заканчивает играть музыку, должен покинуть текущий голосовой канал. Однако этого не происходит, вместо этого моя after функция vc.disconnect вообще не вызывается, хотя я следовал инструкциям на странице FAQ.

vc = await bot.join_voice_channel(ctx.message.author.voice_channel)
player = await vc.create_ytdl_player(arg.split(' ')[1], after=vc.disconnect)
player.start()

1 Ответ

0 голосов
/ 30 июня 2018

Проблема в том, что vc.disconnect является сопрограммой. Вы должны обращаться с этим по-другому, так как вызов after не ожидает сопрограммы, так как голосовой плеер просто Thread.

Согласно документам , вот как это должно быть обработано:

def my_after():
    coro = vc.disconnect()
    fut = asyncio.run_coroutine_threadsafe(coro, client.loop)
    try:
        fut.result()
    except:
        pass

player = await voice.create_ytdl_player(url, after=my_after)
player.start()

Также, как отмечено в документах , следующее предупреждение:

Внимание

Эта функция является частью 3.5.1+ и 3.4.4+. Если вы не используете эти версии Python затем используют discord.compat..

Это означает, что если вы используете Python 3.4.0-3.4.3 или 3.5.0, ваш my_after должен быть изменен на следующее:

def my_after():
    from discord.compat import run_coroutine_threadsafe
    coro = vc.disconnect()
    fut = run_coroutine_threadsafe(coro, client.loop)
    try:
        fut.result()
    except:
        pass
...