我做了一个不和谐的监狱命令,它不起作用,机器人在线,但由于某种原因它不起作用“其他命令起作用”
@client.command()
@commands.has_permissions(administrator=True)
async def jail(ctx, member: discord.Member, *, reason=None):
color = 0xFFB6C1
jailed_role = discord.utils.get(ctx.guild.roles, name="jailed")
if not jailed_role:
embed = discord.Embed(title="Failed!", description="Jail role not found, creating one.", color=color)
await ctx.send(embed=embed)
try:
jailed_role = await ctx.guild.create_role(name="jailed")
embed = discord.Embed(title="Jail role created", color=color)
await ctx.send(embed=embed)
except discord.Forbidden:
embed = discord.Embed(title="Failed!", description="Bot does not have permission to create the 'jailed' role.", color=color)
await ctx.send(embed=embed)
return
for channel in ctx.guild.channels:
await jailed_role.set_permissions(channel, view_channel=False)
if jailed_role not in member.roles:
for role in member.roles:
if role != jailed_role:
try:
await member.remove_roles(role)
except discord.Forbidden:
embed = discord.Embed(title="Failed!", description=f"Bot does not have permission to remove the role {role.name} from {member.mention}.", color=color)
await ctx.send(embed=embed)
return
try:
await member.add_roles(jailed_role, reason=reason)
embed = discord.Embed(title="Jailed!", description=f"{member.mention} has been jailed!", color=color)
embed.add_field(name="Reason:", value=reason)
await ctx.send(embed=embed)
except discord.Forbidden:
embed = discord.Embed(title="Failed!", description=f"Bot does not have permission to assign the 'jailed' role to {member.mention}.", color=color)
await ctx.send(embed=embed)
else:
embed = discord.Embed(title="Failed!", description=f"{member.mention} is already jailed.", color=color)
await ctx.send(embed=embed)
我尝试了很多东西,但似乎没有任何效果,如果有人能够修复它,那就太好了。
我认为这就是您正在寻找的..我在您的代码中看到的唯一问题是每次您授予某人该角色时都会设置被监禁的权限。理论上,您只需要执行一次 - 创建角色时。
另请注意,我添加了一项优化以避免删除“@everyone”角色,因为该角色无法删除并且会导致错误。
overwrite = discord.PermissionOverwrite()
overwrite.update(read_message_history = False, read_messages = False)
for channel in ctx.guild.channels:
await channel.set_permissions(jailed_role, overwrite=overwrite) # set the permissions for each channel
if jailed_role not in member.roles:
for role in member.roles:
if role != jailed_role:
try:
if role.name == "@everyone": # will skipp @everyone since this role cant be removed
continue
await member.remove_roles(role)
except discord.Forbidden:
embed = discord.Embed(title="Failed!", description=f"Bot does not have permission to remove the role {role.name} from {member.mention}.", color=color)
await ctx.send(embed=embed)
return