Discord Py 使用 on_voice_state_update

问题描述 投票:0回答:1

我目前正在尝试制作一个机器人,当某个人加入时,它会加入 VC,当他们离开时,它会离开 VC。

我希望机器人仅在特定用户处于 VC 时才处于 VC,然后当所述用户断开连接时机器人将立即离开。

我遇到的问题是试图找出如何让机器人离开。

@bot.event

async def on_voice_state_update(成员,之前,之后): targetID = bot.get_user(USERID)

if after.channel is not None and member.id == targetID.id:
    await member.voice.channel.connect()

这就是我用来让机器人加入的方法,似乎工作没有问题,但无论我尝试什么,我都无法弄清楚如何让机器人在同一个用户离开 VC 后离开。

如有任何帮助,我们将不胜感激,谢谢。

任何时候我能够让机器人离开,它都会在加入时立即离开,我知道这样做的原因,但我只是不知道如何防止它,或者用另一种方法让机器人仅在以下情况下离开用户离开。

python discord discord.py
1个回答
0
投票
  1. 你的
    bot.get_user(USERID)
    返回了一个NoneType,它当然没有ID可以与
    member.id
    进行比较。所以,我将
    await
    bot.fetch_user
    一起使用。但如果它对你有效,那就这样了。
  2. 因为获取用户的 id 对我来说不起作用,所以我坚持比较用户对象。
  3. 您问题的实际答案很简单,只需使用列表来存储用户加入的 VC,然后在用户离开时退出 VC。您需要一个列表的原因是因为没有办法(至少我知道)可以找到用户所在的最后一个 VC。拥有一个列表还意味着您可以为多个人进行代码监视不同的风险投资。

这是我的代码:


VCs = {} #VC list

@bot.event
async def on_voice_state_update(member, before, after):
    target = await bot.fetch_user(USERID)

    if after.channel is not None and member == target:
        VCs[member.id] = member.voice.channel
        await member.voice.channel.connect()

    elif after.channel is None and member == target:
        for i in bot.voice_clients: #Check through all VCs bot is currently in
            if i.channel == VCs[member.id]: #If VC is the one the user was in
                VCs.pop(member.id) #Remove the VC from the list
                await i.disconnect(force=False) #Disconnect from the VC
© www.soinside.com 2019 - 2024. All rights reserved.