Source code for curious.commands.conditions

"""
Commonly used conditions.

.. currentmodule:: curious.commands.conditions
"""

from curious.commands import Context, condition


[docs]def is_owner(): """ A :func:`.condition` that ensures the author of the message is the owner of the bot. The owner is checked automatically by using the application info of the bot. Example:: @command() @is_owner() async def kill(ctx: Context): await ctx.bot.kill() """ def _condition(ctx: Context): # If the application info request has not been completed # yet we cannot guarantee the command could be ran. if ctx.bot.application_info is None: return False owner = ctx.bot.application_info.owner return ctx.message.author_id == owner.id return condition(_condition)
[docs]def author_has_permissions(bypass_owner: bool = True, **permissions): """ A :func:`.condition` that ensures the author of the message has all of the specified permissions. Example:: @command() @author_has_permissions(kick_members=True) async def kick(ctx: Context, member: Member): await member.kick() await ctx.channel.messages.send(':wave:') :param bypass_owner: Determines if the owner of the bot can run the command regardless of if the condition failed or not. :param permissions: A mapping of permissions to check. """ def _condition(ctx: Context): perms = ctx.channel.effective_permissions(ctx.author) return all(getattr(perms, name, None) is value for name, value in permissions.items()) return condition(_condition, bypass_owner=bypass_owner)
[docs]def bot_has_permissions(bypass_owner: bool = False, **permissions): """ A :func:`.condition` that ensures the bot has all of the specified permissions. Example:: @command() @bot_has_permissions(send_messages=True) async def test(ctx: Context): await ctx.channel.messages.send('The bot can send messages.') :param bypass_owner: Determines if the owner of the bot can run the command regardless of if the condition failed or not. :param permissions: A mapping of permissions to check. """ def _condition(ctx: Context): perms = ctx.channel.me_permissions return all(getattr(perms, name, None) is value for name, value in permissions.items()) return condition(_condition, bypass_owner=bypass_owner)
author_has_perms = author_has_permissions bot_has_perms = bot_has_permissions
[docs]def author_has_roles(*roles: str, bypass_owner: bool = True): """ A :func:`.condition` that ensures the author of the message has all of the specified roles. The role names must all be exact matches. Example:: @command() @author_has_roles('Cool') async def cool(ctx: Context): await ctx.channel.messages.send('You are cool.') :param roles: A collection of role names. :param bypass_owner: Determines if the owner of the bot can run the command regardless of if the condition failed or not. """ def _condition(ctx: Context): if ctx.guild is None: return False author_roles = {role.name for role in ctx.author.roles} return all(role in author_roles for role in roles) return condition(_condition, bypass_owner=bypass_owner)
[docs]def bot_has_roles(*roles: str, bypass_owner: bool = False): """ A :func:`.condition` that ensures the bot has all of the specified roles. The role names must all be exact matches. Example:: @command() @bot_has_roles('Cool') async def cool(ctx: Context): await ctx.channel.messages.send('The bot is cool.') :param roles: A collection of role names. :param bypass_owner: Determines if the owner of the bot can run the command regardless of if the condition failed or not. """ def _condition(ctx: Context): if ctx.guild is None: return False bot_roles = {role.name for role in ctx.guild.me.roles} return all(role in bot_roles for role in roles) return condition(_condition, bypass_owner=bypass_owner)
[docs]def is_guild_owner(bypass_owner: bool = True): """ A :func:`.condition` that ensures the author of the message is also the owner of the guild. Example:: @command() @is_guild_owner() async def test(ctx: Context): await ctx.channel.messages.send('You are the owner of this guild.') :param bypass_owner: Determines if the owner of the bot can run the command regardless of if the condition failed or not. """ def _condition(ctx: Context): if ctx.guild is None: return False return ctx.message.author_id == ctx.guild.owner_id return condition(_condition, bypass_owner=bypass_owner)