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

Can a discord.py bot mute the voice of others in a voice call?

我是 Among Us Discord 公会的所有者,我在其中实施了一些机器人。当我们重播语音通话时,有时人们会忘记将自己静音以便我们能听到他们的声音,这通常会透露出有价值的信息。

我正在尝试设计一组命令,让一个人可以轻松地将语音通道中的所有人静音。他们使用命令 claim "VC Name" 来获取指定语音通道的命令,然后使用命令 set_mute "true/false" 将所有人静音或取消静音。第一部分我听不懂,但我正在努力处理第二部分的代码,实际上 mutes/unmutes 语音频道成员。

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

  1. discord.VoiceState (Documentation):discord.VoiceState 具有属性 mutemutedself_mute。也许可以用 member.VoiceState.mute = Truemember.VoiceState.muted = Truemember.VoiceState.self_mute = True 之类的方式修改成员的语音状态。我不确定如何使用此方法,因为使用上面的代码行会导致 AttributeError.
  2. discord.Member.edit (Documentation):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()

Indicates if the user is currently muted by their own accord.

所以这意味着你不能设置任何值,这个属性 returns True/False 取决于用户是否静音 his/herself。


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

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

所以我猜你正在尝试制作名为 set_to_mutedset_to_unmuted 的 2 个方法,但是为此,你必须编辑 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)