[Core] Multiple mod admin roles (#2783)

* Adds Schema versioning
  - Adds Migration tool
  - Adds tool to migrate to allow multiple admin and mod roles
  - Supports Multiple mod and admin roles

* Ensures migration is run prior to cog load and connection to discord

* Updates to not rely on singular mod/admin role id

* Update requires logic for multiple mod/admin roles

* Add new commands for managing mod/admin roles

* Feedback

Update strings
Update docstrings
Add aliases

* Use snowflakelist

* paginate

* Change variable name

* Fix mistake

* handle settings view fix

* Fix name error

* I'm bad at Ux

* style fix
This commit is contained in:
DiscordLiz
2019-06-23 23:36:00 -04:00
committed by Michael H
parent 71d0bd0d07
commit 6bdc9606f6
8 changed files with 161 additions and 99 deletions

View File

@@ -123,29 +123,25 @@ async def is_mod_or_superior(
If the wrong type of ``obj`` was passed.
"""
user = None
if isinstance(obj, discord.Message):
user = obj.author
elif isinstance(obj, discord.Member):
user = obj
elif isinstance(obj, discord.Role):
pass
if obj.id in await bot.db.guild(obj.guild).mod_role():
return True
if obj.id in await bot.db.guild(obj.guild).admin_role():
return True
return False
else:
raise TypeError("Only messages, members or roles may be passed")
server = obj.guild
admin_role_id = await bot.db.guild(server).admin_role()
mod_role_id = await bot.db.guild(server).mod_role()
if isinstance(obj, discord.Role):
return obj.id in [admin_role_id, mod_role_id]
if await bot.is_owner(user):
return True
elif discord.utils.find(lambda r: r.id in (admin_role_id, mod_role_id), user.roles):
if await bot.is_mod(user):
return True
else:
return False
return False
def strfdelta(delta: timedelta):
@@ -208,27 +204,21 @@ async def is_admin_or_superior(
If the wrong type of ``obj`` was passed.
"""
user = None
if isinstance(obj, discord.Message):
user = obj.author
elif isinstance(obj, discord.Member):
user = obj
elif isinstance(obj, discord.Role):
pass
return obj.id in await bot.db.guild(obj.guild).admin_role()
else:
raise TypeError("Only messages, members or roles may be passed")
admin_role_id = await bot.db.guild(obj.guild).admin_role()
if isinstance(obj, discord.Role):
return obj.id == admin_role_id
if user and await bot.is_owner(user):
if await bot.is_owner(user):
return True
elif discord.utils.get(user.roles, id=admin_role_id):
if await bot.is_admin(user):
return True
else:
return False
return False
async def check_permissions(ctx: "Context", perms: Dict[str, bool]) -> bool: