如何为多个角色批量设置不同频道的权限?

时间:2021-02-28 12:54:06

标签: python discord discord.py

我有 5 个文本频道和 2 个语音频道。从频道到频道,我想为这些频道授予 4 个单独角色的权限。

text_channel_name = ['server-gateway', 'chatroom', 'gameplay-map', 'spectator-chat', 'log', 'staff-room']
voice_channel_name = ['player-voicechat','spectator-voicechat']
role_name = ['Mediator', 'Player', 'Ghost', 'Spectator'] # (not including admin role)

我希望我的频道设置如下:

<头>
频道名称 说明
服务器网关 即使是第一次进入的人也可以看到这个频道。
聊天室 任何有角色的人都可以进入这个房间并在这里聊天。
游戏地图 任何有角色的人都可以看到这一点,但只有有“中介”和“玩家”的角色才能在这里写东西。
观众聊天 只有具有“幽灵”和“旁观者”角色的人才能访问
日志,员工室 只有服务器管理员可以访问此频道
玩家语音聊天 只能被具有“中介”或“玩家”角色和管理员的人访问
旁观者语音聊天 只能被具有“幽灵”或“旁观者”角色和管理员的人访问

我应该如何在 discord.py 上像这样设置我的频道?我给了 'Mediator' 角色所有权限,除了管理服务器和管理角色权限。我是否必须取消某些权限才能使我的计划生效?

编辑:有人建议在为我的机器人制作新服务器时使用服务器模板,但从长远来看,我认为这不是可行的解决方案。我想让我的机器人获得尽可能少的帮助,所以我希望我的机器人在进入新服务器时自动运行设置过程。我剩下的工作是为不同渠道指定不同角色的权限以按预期工作。

我想问的是我可以用来为一个频道批量指定角色权限的格式(最好是同时在多个频道上运行的代码行)

1 个答案:

答案 0 :(得分:0)

如果您需要的频道集始终相同,您很可能希望在您的机器人加入的每个公会中创建自己的频道集,并具有预设权限。

频道是公会的属性,因此您可以在其中找到管理它们的方法,请查看:

Guild

discord.PermissionOverwrite

API Reference 中的示例:

overwrites = {
    guild.default_role: discord.PermissionOverwrite(read_messages=False),
    guild.me: discord.PermissionOverwrite(read_messages=True)
}

channel = await guild.create_text_channel('secret', overwrites=overwrites)

编辑: 这是一个使用旁观者聊天的简单功能示例,如注释中所示

#!/usr/bin/env python3
import discord
from discord.ext import commands

class Setup(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        
    @commands.Cog.listener()
    async def on_guild_join(self, guild):
        perms = discord.Permissions()
        perms.update(read_messages=True)
        names = ['ghost', 'spectator']
        overwrites = {
            guild.default_role: discord.PermissionOverwrite(read_messages=False),
            guild.me: discord.PermissionOverwrite(read_messages=True)
        }
        for n in names:
            role = await guild.create_role(name=n, permissions=perms)
            overwrites[role] = discord.PermissionOverwrite(read_messages=True)

        await guild.create_text_channel('spectator-chat', overwrites=overwrites)