[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: :param role:
:return: :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: if member is None:
member = ctx.author 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)) await ctx.send(_(USER_HIERARCHY_ISSUE_ADD).format(role=role, member=member))
return return
if not self.pass_hierarchy_check(ctx, role): 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: if member is None:
member = ctx.author 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)) await ctx.send(_(USER_HIERARCHY_ISSUE_REMOVE).format(role=role, member=member))
return return
if not self.pass_hierarchy_check(ctx, role): if not self.pass_hierarchy_check(ctx, role):
@ -365,7 +369,7 @@ class Admin(commands.Cog):
NOTE: The role is case sensitive! NOTE: The role is case sensitive!
""" """
# noinspection PyTypeChecker # noinspection PyTypeChecker
await self._addrole(ctx, ctx.author, selfrole) await self._addrole(ctx, ctx.author, selfrole, check_user=False)
@selfrole.command(name="remove") @selfrole.command(name="remove")
async def selfrole_remove(self, ctx: commands.Context, *, selfrole: SelfRole): async def selfrole_remove(self, ctx: commands.Context, *, selfrole: SelfRole):
@ -376,7 +380,7 @@ class Admin(commands.Cog):
NOTE: The role is case sensitive! NOTE: The role is case sensitive!
""" """
# noinspection PyTypeChecker # noinspection PyTypeChecker
await self._removerole(ctx, ctx.author, selfrole) await self._removerole(ctx, ctx.author, selfrole, check_user=False)
@selfrole.command(name="list") @selfrole.command(name="list")
async def selfrole_list(self, ctx: commands.Context): async def selfrole_list(self, ctx: commands.Context):
@ -406,6 +410,13 @@ class Admin(commands.Cog):
NOTE: The role is case sensitive! 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: async with self.conf.guild(ctx.guild).selfroles() as curr_selfroles:
if role.id not in curr_selfroles: if role.id not in curr_selfroles:
curr_selfroles.append(role.id) curr_selfroles.append(role.id)
@ -421,6 +432,13 @@ class Admin(commands.Cog):
NOTE: The role is case sensitive! 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: async with self.conf.guild(ctx.guild).selfroles() as curr_selfroles:
curr_selfroles.remove(role.id) curr_selfroles.remove(role.id)