【问题标题】:set_permissions works correctly only on administratorsset_permissions 仅适用于管理员
【发布时间】:2020-02-18 00:36:35
【问题描述】:

我的 set_permissions 命令有问题。我的代码中的freeze 命令适用于每个用户,但melt 命令只适用于每个用户第一次。当没有用户拥有频道权限时,melt 对所有人都有效,但当使用freeze 时,melt 仅对管理员有效。有什么办法解决这个问题?

@bot.command(name="freeze")
async def zamroz(ctx):
    try:
        if ctx.message.author.guild_permissions.value == 2146959359:
            for channel in ctx.guild.text_channels:
                for member in channel.members:
                    if member.bot == False:
                        await channel.set_permissions(member, read_messages=False, read_message_history=False)
        else:
            await ctx.send("Lack of permissions")
            await ctx.channel.last_message.delete(delay=2)
    except:
        pass

@bot.command(name="melt")
async def odmroz(ctx):
    try:
        if ctx.message.author.guild_permissions.value == 2146959359:
            for channel in ctx.guild.text_channels:
                for member in channel.members:
                    if member.bot == False:
                        await channel.set_permissions(member, overwrite=None)
        else:
            await ctx.send("Lack of permissions")
            await ctx.channel.last_message.delete(delay=2)
    except:
        pass

【问题讨论】:

    标签: python python-3.x bots discord discord.py


    【解决方案1】:

    channel.members 返回可以看到频道的所有成员的列表。

    如果您使用冻结命令,您将剥夺所有成员(机器人除外)从频道读取消息和消息历史记录的权限。换句话说,他们再也看不到频道了。

    因此,在运行 melt 命令时,channel.members 将不会返回任何成员,因为没有成员可以看到该频道。

    将其替换为guild.members 将始终返回服务器的所有成员,无论他们是否可以看到频道。

    @bot.command(name="freeze")
    async def zamroz(ctx):
        try:
            if ctx.message.author.guild_permissions.value == 2146959359:
                for channel in ctx.guild.text_channels:
                    for member in ctx.guild.members:
                        if member.bot == False:
                            await channel.set_permissions(member, read_messages=False, read_message_history=False)
            else:
                await ctx.send("Lack of permissions")
                await ctx.channel.last_message.delete(delay=2)
        except:
            pass
    
    @bot.command(name="melt")
    async def odmroz(ctx):
        try:
            if ctx.message.author.guild_permissions.value == 2146959359:
                for channel in ctx.guild.text_channels:
                    for member in ctx.guild.members:
                        if member.bot == False:
                            await channel.set_permissions(member, overwrite=None)
            else:
                await ctx.send("Lack of permissions")
                await ctx.channel.last_message.delete(delay=2)
        except:
            pass
    

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2015-03-03
      • 2017-01-29
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多