[Admin] Fixes hierarchy issues in [p]selfrole and [p]selfroleset (#3331)

* More fixes

* Update admin.py
This commit is contained in:
Flame442 2020-01-12 15:01:45 -08:00 committed by Michael H
parent 8514dbe96a
commit fe7770c833

View File

@ -116,12 +116,14 @@ class Admin(commands.Cog):
:param role:
:return:
"""
return ctx.author.top_role > role
return ctx.author.top_role > role or ctx.author == ctx.guild.owner
async def _addrole(self, ctx: commands.Context, member: discord.Member, role: discord.Role):
async def _addrole(
self, ctx: commands.Context, member: discord.Member, role: discord.Role, *, check_user=True
):
if member is None:
member = ctx.author
if not self.pass_user_hierarchy_check(ctx, role):
if check_user and not self.pass_user_hierarchy_check(ctx, role):
await ctx.send(_(USER_HIERARCHY_ISSUE_ADD).format(role=role, member=member))
return
if not self.pass_hierarchy_check(ctx, role):
@ -141,10 +143,12 @@ class Admin(commands.Cog):
)
)
async def _removerole(self, ctx: commands.Context, member: discord.Member, role: discord.Role):
async def _removerole(
self, ctx: commands.Context, member: discord.Member, role: discord.Role, *, check_user=True
):
if member is None:
member = ctx.author
if not self.pass_user_hierarchy_check(ctx, role):
if check_user and not self.pass_user_hierarchy_check(ctx, role):
await ctx.send(_(USER_HIERARCHY_ISSUE_REMOVE).format(role=role, member=member))
return
if not self.pass_hierarchy_check(ctx, role):
@ -365,7 +369,7 @@ class Admin(commands.Cog):
NOTE: The role is case sensitive!
"""
# noinspection PyTypeChecker
await self._addrole(ctx, ctx.author, selfrole)
await self._addrole(ctx, ctx.author, selfrole, check_user=False)
@selfrole.command(name="remove")
async def selfrole_remove(self, ctx: commands.Context, *, selfrole: SelfRole):
@ -376,7 +380,7 @@ class Admin(commands.Cog):
NOTE: The role is case sensitive!
"""
# noinspection PyTypeChecker
await self._removerole(ctx, ctx.author, selfrole)
await self._removerole(ctx, ctx.author, selfrole, check_user=False)
@selfrole.command(name="list")
async def selfrole_list(self, ctx: commands.Context):
@ -406,6 +410,13 @@ class Admin(commands.Cog):
NOTE: The role is case sensitive!
"""
if not self.pass_user_hierarchy_check(ctx, role):
await ctx.send(
_(
"I cannot let you add {role.name} as a selfrole because that role is higher than or equal to your highest role in the Discord hierarchy."
).format(role=role)
)
return
async with self.conf.guild(ctx.guild).selfroles() as curr_selfroles:
if role.id not in curr_selfroles:
curr_selfroles.append(role.id)
@ -421,6 +432,13 @@ class Admin(commands.Cog):
NOTE: The role is case sensitive!
"""
if not self.pass_user_hierarchy_check(ctx, role):
await ctx.send(
_(
"I cannot let you remove {role.name} from being a selfrole because that role is higher than or equal to your highest role in the Discord hierarchy."
).format(role=role)
)
return
async with self.conf.guild(ctx.guild).selfroles() as curr_selfroles:
curr_selfroles.remove(role.id)