嘿,我知道这个帖子已经快一年了,但我认为我有一个代码值得发布给任何仍然有这个问题的人。
@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 事件中,因为将它放在播放命令的 after 语句中会导致它在每次歌曲结束时运行该循环。
(如果您了解此代码的工作原理,则无需阅读其余部分,我将对其进行解释。)
好的,首先我们检查我们的机器人是否是触发事件的机器人:
if not member.id == self.bot.user.id:
return
之后我们检查它是否是一个加入事件:
elif before.channel is 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。
对不起,我在教程模式下已经满了,我只是想向人们解释我的代码,哈哈。