【问题标题】:Checking for specific user that has joined a channel检查已加入频道的特定用户
【发布时间】:2020-05-14 16:54:49
【问题描述】:

当特定用户移动到 afk 语音通道时,我正在尝试播放 mp3 文件。

在 discord.py 中重写:

async def on_voice_state_update(member, before, after):
user = bot.get_user("my user id")
if after.afk and user == True:
    channel = bot.get_channel("the id of the channel I want the bot to connect to")
    voice = await channel.connect()
    voice.play(discord.FFmpegPCMAudio('directory of mp3 file'))
    await asyncio.sleep(7)
    await voice.disconnect()

问题

在我尝试在 if 语句中指定用户之前,这一切都有效: user == True

但是,一旦我包含此要求,它就会停止工作。

我的尝试

我试图给用户对象一个属性,例如user.connect == Trueuser.joined == True 等...但没有运气。

目标

在其完善的形式中,我不仅可以指定加入 afk 频道以使活动正常工作所需的用户,还可以获取另一个用户的频道 ID,以便机器人可以连接到该频道:

channel = bot.get_channel("the id the channel that a specified user is in")

编辑:

根据 Diggy 的回答,我将 if 语句更改为如下所示:

async def on_voice_state_update(member, prev, cur):
    if member.id == 'my user id' and cur.afk:
            channel = bot.get_channel('the channel id for the bot to connect to')
            voice = await channel.connect()
            voice.play(discord.FFmpegPCMAudio('dir of mp3 file'))
            await asyncio.sleep(7)
            await voice.disconnect()
    else:
            pass

但是,一旦我离开频道,它也会播放音频。

我尝试使用if member.id == 'my user id' and cur.afk and not prev.afk 指定一旦我离开频道就不会播放,但在我离开时它仍然会播放。

实验解决方案:

好的,所以我想让它只加入上一个频道,所以一旦我离开 afk 频道,它就会在没有问题的地方播放它。这使它可以在 afk 之前的频道中工作和播放,这很棒,但并不完美。它应该不需要加入 afk 频道:

async def on_voice_state_update(member, prev, cur):
    if member.id == 'my user id' and cur.afk:
            prevchannel = prev.channel.id
            channel = bot.get_channel(prevchannel)
            voice = await channel.connect()
            voice.play(discord.FFmpegPCMAudio('dir to mp3 file'))
            await asyncio.sleep('duration of mp3 file')
            await voice.disconnect()
    else:
            pass

我认为 elif 可能会像这样工作:

elif prev.afk is not None and cur.afk is None:
    pass

但它几乎只是忽略它。

-prevcur 参数有时也不起作用,所以我必须切换回 beforeafter

【问题讨论】:

    标签: python discord discord.py discord.py-rewrite


    【解决方案1】:

    您可以这样做的一种方法如下:

    async def on_voice_state_update(member, prev, cur):
        if member.id == your_user_id and cur.afk and not prev.afk:
            voice = await member.voice.channel.connect()
            voice.play(discord.FFmpegPCMAudio('directory of mp3 file'))
            await asyncio.sleep(7)
            await voice.disconnect()
    

    【讨论】:

    • 好的,我已经根据您提供的 if 语句中的成员 ID 选项对其进行了编辑,并且它有效。但是,一旦我离开 afk 频道,它也会播放音频。如果您需要参考,我已经编辑了帖子。
    • @ChonkyWonky 抱歉回复晚了。刚刚编辑了我的答案:and cur.afk and not prev.afk 检查您之前是否不在 afk 频道中,希望在您离开 AFK 频道时阻止它加入
    • 我想到了一个平庸的解决方案,就是让机器人加入上一个频道,这意味着当我离开 afk 时,它会加入那个频道而不是语音频道。但这有点临时。我编辑了帖子以防你想看看我做了什么。
    • 我刚试过这个,它很坏。现在,当我离开 afk 频道时,它似乎想加入第一个频道。我开始怀疑这是不是在炸我的树莓派,我什至在上面放了一个散热器以防止它过热(树莓派上的 discord.py)
    • 哈哈,不知怎么的。我以为我最初是这样做的,但不知何故它不起作用。非常感谢。
    【解决方案2】:

    在 discordpy 中,您可以检查频道中的用户并将列表返回给您。获得该列表后,您就可以检查相关用户是否在用户列表中,因此类似下面的代码可能就是您要查找的内容

    def user_check(userid, channelid):
        user = bot.get_user(userid)
        channel = bot.get_channel(channelid)
        if user in channel.members:
            return true
    

    【讨论】:

      猜你喜欢
      • 2021-02-10
      • 2021-05-03
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 2021-02-01
      • 2020-11-10
      • 2021-01-28
      相关资源
      最近更新 更多