使用dpytest时set_permission_overrides无法分配管理频道权限
问题原因及解决方案
你当前代码的问题在于:
- 你用
dpytest.set_permission_overrides设置的是单个频道的权限覆盖,只会修改机器人在该频道内的局部权限; - 但你打印的
guild_permissions.manage_channels是服务器全局级别的权限,两者不属于同一权限维度,所以返回false是预期结果。
根据你的需求,分两种场景给出解决方案:
场景1:需要给机器人设置服务器级别的「管理频道」权限
如果要让机器人在整个服务器都拥有管理频道的权限,应该修改机器人的角色权限,而非频道覆盖:
@pytest_asyncio.fixture(params=BOT_FIXTURE) async def bot(request) -> AsyncGenerator[Tuple[commands.Bot, str], None]: b = commands.Bot( command_prefix=settings.DISCORD_COMMAND_PREFIX, intents=intents, strip_after_prefix=True, help_command=None, ) dpytest.configure(b) guild = dpytest.get_config().guilds[0] bot_member = guild.get_member(b.user.id) # 获取机器人的角色(默认创建的机器人角色是列表第二个元素,第一个是@everyone) bot_role = bot_member.roles[1] # 给角色添加「管理频道」权限 await bot_role.edit(permissions=bot_role.permissions | discord.Permissions(manage_channels=True)) # 此时服务器级权限会返回True print('guild permissions?', bot_member.guild_permissions.manage_channels)
场景2:仅需给机器人设置指定频道的「管理频道」权限
你的原权限设置逻辑是正确的,但检查权限的方式错了。应该检查机器人在目标频道内的实际权限,而非服务器全局权限:
@pytest_asyncio.fixture(params=BOT_FIXTURE) async def bot(request) -> AsyncGenerator[Tuple[commands.Bot, str], None]: b = commands.Bot( command_prefix=settings.DISCORD_COMMAND_PREFIX, intents=intents, strip_after_prefix=True, help_command=None, ) dpytest.configure(b) guild = dpytest.get_config().guilds[0] target_channel = guild.text_channels[0] bot_member = guild.get_member(b.user.id) await dpytest.set_permission_overrides( target=bot_member, channel=target_channel, manage_channels=True ) # 检查该频道内的实际权限,会返回True print('channel permissions?', target_channel.permissions_for(bot_member).manage_channels)
补充说明
guild_permissions:仅反映基于服务器角色配置的全局权限,不会包含频道级的权限覆盖;channel.permissions_for(member):会综合服务器角色权限和频道的权限覆盖规则,计算出成员在该频道的实际可用权限。
内容的提问来源于stack exchange,提问作者Aarti Joshi
相关产品推荐
相关产品推荐

