我正在尝试与discord.py建立音乐机器人。但是,我希望漫游器在一段时间(例如5分钟)内保持不活动状态。不活动是指该机器人没有播放任何歌曲。
开始播放歌曲的命令是
voice.play(discord.FFmpegPCMAudio(audio))
和voice.stop()
停止播放歌曲
voice object是discord.VoiceClient
。
答案 0 :(得分:1)
嘿,我知道这个帖子已经快一年了,但我想我得到了一个代码,值得为仍然有这个问题的任何人发布。
@commands.Cog.listener()
async def on_voice_state_update(self, member, before, after):
if not member.id == self.bot.user.id:
return
elif before.channel is None:
voice = after.channel.guild.voice_client
time = 0
while True:
await asyncio.sleep(1)
time = time + 1
if voice.is_playing() and not voice.is_paused():
time = 0
if time == 600:
await voice.disconnect()
if not voice.is_connected():
break
首先,我发现将它放在 on_voice_state_update
事件中更好,因为将它放在 play 命令的 after 语句中会导致它在每次歌曲结束时运行该循环。
(如果您了解此代码的工作原理,则无需阅读其余部分,我只是要解释一下。)
好的,首先我们检查我们的机器人是否是触发事件的机器人:
if not member.id == self.bot.user.id:
return
之后我们检查它是否是一个加入事件:
elif before.channel is None:
如果 before 通道为 none,则表示机器人不在语音通道中,然后它加入了我们正在寻找的通道。
然后如果它首先进入 elif 语句,它会声明变量 voice
。我发现获得它的最快方法是使用像 voice = after.channel.guild.voice_client
这样的 after 语句,它可以让您访问公会语音客户端!
然后我们进入代码的主要部分!这是机器人将运行以检查机器人是否正在播放的循环:
time = 0
while True:
await asyncio.sleep(1)
time = time + 1
if player.is_playing or player.is_paused:
time = 0
if time == 600:
await voice.disconnect()
if not player.is_connected:
break
因此,我们创建了一个名为 time 的变量,它会在检测到机器人未播放时每秒加 1,并确认机器人实际上并未暂停……然后,如果机器人再次开始播放,它将返回零。但是如果它达到 600,也就是 10 分钟,它会断开机器人与通道的连接,然后它会中断循环。
哦,不要担心 @commands.Cog.listener()
这只是因为我在齿轮中使用它。如果不是,则应将其更改为 @client.event
并从函数语句中删除 self。
抱歉,我完全进入了教程模式,我只是想向人们解释我的代码,哈哈。
答案 1 :(得分:0)
您可以使用is_playing()
方法检测是否未播放音频。因此,如果要这样做,我将使用asyncio模块执行类似的操作。
while True:
await asyncio.sleep(5)
if voice.is_playing() == False:
await voice.disconnect()
break
答案 2 :(得分:0)
我认为这应该有效。如果可以共享代码,我可以检查一下,但是可以尝试一下。就像@StarbuckBarista所说的那样,我们需要更多地了解您的代码。
while voice.is_playing(): #Checks if voice is playing
await asyncio.sleep(1) #While it's playing it sleeps for 1 second
else:
await asyncio.sleep(15) #If it's not playing it waits 15 seconds
while voice.is_playing(): #and checks once again if the bot is not playing
break #if it's playing it breaks
else:
await voice.disconnect() #if not it disconnects