discord.py 机器人可以在语音通话中静音其他人的声音吗?

Jac*_*Lee 5 python discord.py discord.py-rewrite

我是我们之间 Discord 公会的所有者,我在其中实施了一些机器人。当我们播放语音通话时,有时人们会忘记将自己静音,以便我们可以听到它们,这通常会揭示有价值的信息。

我正在尝试设计一组命令,让一个人可以轻松地将语音通道中的每个人静音。他们使用该命令claim "VC Name"在指定的语音通道上声明命令,然后使用该命令set_mute "true/false"将所有人静音或取消静音。我已经关闭了第一部分,但我正在努力处理实际上使语音通道成员静音/取消静音的第二部分的代码。

在阅读 discord.py 的文档时,我发现了一些可能有用的选项,但我不知道如何执行它们中的任何一个。

  1. discord.VoiceState文档):discord.VoiceState具有属性mutemutedself_mute。也许可以使用诸如member.VoiceState.mute = True,member.VoiceState.muted = True或 之类的东西来修改成员的语音状态member.VoiceState.self_mute = True。我不确定如何使用此方法,因为使用上述代码行会生成AttributeError.
  2. discord.Member.edit文档):member.Member.edit可以选择设置mute为 True。这实际上将成员设置为服务器静音(我似乎无法撤消它),所以我宁愿避免使用此选项,除非通过此方法有解决方案。
  3. 我可以设置分配给语音通道中所有成员的唯一角色,机器人可以根据命令设置发言权限。这是我现在正在使用的方法,但我想使用另一种方法(如果存在)。

这是我现在拥有的代码。在最后一条if/else语句下,我将把解决方案用于将通话中的成员静音和取消静音。

async def mute(ctx, setting):
    regex, claimed = re.compile(f"_VC: (Lobby [0-9])_"), False
    for role in cx.message.author.roles:
        if regex.search(role.name):
            claimed = True
            break
    if not claimed:
        await ctx.send("You have not claimed any of the game lobbies")
        return
    voice_channel = discord.utils.get(ctx.guild.channels, name=regex.search(role.name).group(1))
    for member in voice_channel.members:
        if setting.lower() == 'true':
            await member.voice_state.set_to_muted()
        elif setting.lower() == 'false':
            await member.voice_state.set_to_not_muted()
Run Code Online (Sandbox Code Playgroud)

小智 3

指示用户当前是否自行静音。

所以这意味着您不能设置任何值,此属性返回True/False取决于用户是否将自己静音。


  • 对于你的第二个选择,这似乎是最好的方法。是的,没有权限的成员无法取消静音,但您可以通过代码或手动取消静音。

  • 对于您的第三个选项,这是另一个解决方案,但当您可以使用时我不会建议它member.edit

所以我猜你正在尝试命名 2 个方法set_to_mutedset_to_unmuted但为此,你必须编辑 discord.py 库的主要 python 文件。相反,您可以创建 2 个作为member参数的异步函数,并且可以通过这种方式将它们静音。

async def set_to_muted(member: discord.Member):
    await member.edit(mute=True)

async def set_to_unmuted(member: discord.Member):
    await member.edit(mute=False)

@client.command()
async def mute(ctx, setting):
    voice_channel = discord.utils.get(ctx.guild.channels, name='')
    if setting.lower() == 'true':    
        for member in voice_channel.members:
            await set_to_muted(member)
    elif setting.lower() == 'false':    
        for member in voice_channel.members:
            await set_to_unmuted(member)
Run Code Online (Sandbox Code Playgroud)