有没有办法让我的 discord 机器人在播放完歌曲后断开与语音通道的连接?
Is there a way to make my discord bot disconnect from the voice channel after finishing playing a song?
我想知道是否有办法让我的 discord 机器人在播放完 youtube 视频的音频后离开语音频道。我尝试使用 sleep(duration of the video)
,但为了获取和下载要播放的视频,我使用了 pafy
,它给出了视频的持续时间,但采用 00:00:00 格式,这算作字符串,而不是整数。我更改了代码以在 after=lamda e: await vc.disconnect
断开连接,但它给我一个错误 'await' outside async function
。我播放音乐的代码如下:
channel = message.author.voice.channel
vc = await channel.connect()
url = contents
url = url.strip("play ")
video = pafy.new(url)
await message.channel.send("Now playing **%s**" % video.title)
audio = video.getbestaudio()
audio.download()
duration = video.duration
player = vc.play(discord.FFmpegPCMAudio('%s.webm' % video.title), after=lambda e: await vc.disconnect)
这是歌曲播放完毕后断开连接的方法(删除 after=
)。
在vc.play()
之后添加
while vc.is_playing():
await sleep(1)
await vc.disconnect()
我在我的机器人中使用的代码:
stop_event = asyncio.Event()
loop = asyncio.get_event_loop()
def after(error):
if error:
logging.error(error)
def clear():
stop_event.set()
loop.call_soon_threadsafe(clear)
audio = PCMVolumeTransformer(discord.FFmpegPCMAudio(file_path), 1)
client.play(audio, after=after)
await stop_event.wait()
await client.disconnect()
在这种情况下,vc.disconnect()
是一个必须等待的协程。
discord 播放器的 after
函数不能等待这样的异步函数。而是使用这样的东西:
def my_after(error):
coro = vc.disconnect()
fut = asyncio.run_coroutine_threadsafe(coro, client.loop)
try:
fut.result()
except:
# an error happened sending the message
pass
voice.play(discord.FFmpegPCMAudio(url), after=my_after)
我想知道是否有办法让我的 discord 机器人在播放完 youtube 视频的音频后离开语音频道。我尝试使用 sleep(duration of the video)
,但为了获取和下载要播放的视频,我使用了 pafy
,它给出了视频的持续时间,但采用 00:00:00 格式,这算作字符串,而不是整数。我更改了代码以在 after=lamda e: await vc.disconnect
断开连接,但它给我一个错误 'await' outside async function
。我播放音乐的代码如下:
channel = message.author.voice.channel
vc = await channel.connect()
url = contents
url = url.strip("play ")
video = pafy.new(url)
await message.channel.send("Now playing **%s**" % video.title)
audio = video.getbestaudio()
audio.download()
duration = video.duration
player = vc.play(discord.FFmpegPCMAudio('%s.webm' % video.title), after=lambda e: await vc.disconnect)
这是歌曲播放完毕后断开连接的方法(删除 after=
)。
在vc.play()
while vc.is_playing():
await sleep(1)
await vc.disconnect()
我在我的机器人中使用的代码:
stop_event = asyncio.Event()
loop = asyncio.get_event_loop()
def after(error):
if error:
logging.error(error)
def clear():
stop_event.set()
loop.call_soon_threadsafe(clear)
audio = PCMVolumeTransformer(discord.FFmpegPCMAudio(file_path), 1)
client.play(audio, after=after)
await stop_event.wait()
await client.disconnect()
在这种情况下,vc.disconnect()
是一个必须等待的协程。
discord 播放器的 after
函数不能等待这样的异步函数。而是使用这样的东西:
def my_after(error):
coro = vc.disconnect()
fut = asyncio.run_coroutine_threadsafe(coro, client.loop)
try:
fut.result()
except:
# an error happened sending the message
pass
voice.play(discord.FFmpegPCMAudio(url), after=my_after)