Repository: Cog-Creators/Red-DiscordBot

Issue:
[Core V3] A lot of checks are broken
Thought I'd shed some light on some bugs regarding checks. I'm anticipating much of these to be rewritten anyway (esp. the core checks) however fixing these now will help, since they are a pain when testing rewritten cogs.

- Global checks are all failing because of async getters
- Core checks are spewing errors because of async getters
- Bank checks just aren't checks


Discussion:

Resolving patch:
diff --git a/cogs/bank/bank.py b/cogs/bank/bank.py
--- a/cogs/bank/bank.py
+++ b/cogs/bank/bank.py
@@ -5,20 +5,36 @@
 
 
 def check_global_setting_guildowner():
+    """
+    Command decorator. If the bank is not global, it checks if the author is
+     either the guildowner or has the administrator permission.
+    """
     async def pred(ctx: commands.Context):
-        if await bank.is_global():
-            return checks.is_owner()
-        else:
-            return checks.guildowner_or_permissions(administrator=True)
+        author = ctx.author
+        if await ctx.bot.is_owner(author):
+            return True
+        if not await bank.is_global():
+            permissions = ctx.channel.permissions_for(author)
+            return author == ctx.guild.owner or permissions.administrator
+
     return commands.check(pred)
 
 
 def check_global_setting_admin():
+    """
+    Command decorator. If the bank is not global, it checks if the author is
+     either a bot admin or has the manage_guild permission.
+    """
     async def pred(ctx: commands.Context):
-        if await bank.is_global():
-            return checks.is_owner()
-        else:
-            return checks.admin_or_permissions(manage_guild=True)
+        author = ctx.author
+        if await ctx.bot.is_owner(author):
+            return True
+        if not await bank.is_global():
+            permissions = ctx.channel.permissions_for(author)
+            is_guild_owner = author == ctx.guild.owner
+            admin_role = await ctx.bot.db.guild(ctx.guild).admin_role()
+            return admin_role in author.roles or is_guild_owner or permissions.manage_guild
+
     return commands.check(pred)
 
 
diff --git a/core/checks.py b/core/checks.py
--- a/core/checks.py
+++ b/core/checks.py
@@ -24,8 +24,9 @@ async def predicate(ctx):
         if ctx.guild is None:
             return has_perms_or_is_owner
         author = ctx.author
-        mod_role_id = ctx.bot.db.guild(ctx.guild).mod_role()
-        admin_role_id = ctx.bot.db.guild(ctx.guild).admin_role()
+        settings = ctx.bot.db.guild(ctx.guild)
+        mod_role_id = await settings.mod_role()
+        admin_role_id = await settings.admin_role()
 
         mod_role = discord.utils.get(ctx.guild.roles, id=mod_role_id)
         admin_role = discord.utils.get(ctx.guild.roles, id=admin_role_id)
@@ -45,7 +46,8 @@ async def predicate(ctx):
             return has_perms_or_is_owner
         author = ctx.author
         is_guild_owner = author == ctx.guild.owner
-        admin_role = ctx.bot.db.guild(ctx.guild).admin_role()
+        admin_role_id = await ctx.bot.db.guild(ctx.guild).admin_role()
+        admin_role = discord.utils.get(ctx.guild.roles, id=admin_role_id)
 
         return admin_role in author.roles or has_perms_or_is_owner or is_guild_owner
 
diff --git a/core/global_checks.py b/core/global_checks.py
--- a/core/global_checks.py
+++ b/core/global_checks.py
@@ -1,3 +1,4 @@
+"""The checks in this module run on every command."""
 from discord.ext import commands
 
 
@@ -5,22 +6,26 @@ def init_global_checks(bot):
 
     @bot.check
     async def global_perms(ctx):
+        """Check the user is/isn't globally whitelisted/blacklisted."""
         if await bot.is_owner(ctx.author):
             return True
 
-        if bot.db.whitelist():
-            return ctx.author.id in bot.db.whitelist()
+        whitelist = await bot.db.whitelist()
+        if whitelist:
+            return ctx.author.id in whitelist
 
-        return ctx.author.id not in bot.db.blacklist()
+        return ctx.author.id not in await bot.db.blacklist()
 
     @bot.check
     async def local_perms(ctx: commands.Context):
+        """Check the user is/isn't locally whitelisted/blacklisted."""
         if await bot.is_owner(ctx.author):
             return True
-        elif ctx.message.guild is None:
+        elif ctx.guild is None:
             return True
-        local_blacklist = bot.db.guild(ctx.guild).blacklist()
-        local_whitelist = bot.db.guild(ctx.guild).whitelist()
+        guild_settings = bot.db.guild(ctx.guild)
+        local_blacklist = await guild_settings.blacklist()
+        local_whitelist = await guild_settings.whitelist()
 
         if local_whitelist:
             return ctx.author.id in local_whitelist
@@ -29,4 +34,5 @@ async def local_perms(ctx: commands.Context):
 
     @bot.check
     async def bots(ctx):
+        """Check the user is not another bot."""
         return not ctx.author.bot


Test patch: