async def receive_command(command: Command) -> bool: """Returns whether the received command was recognized and executed.""" if command.name not in registered_aliases: return False name = registered_aliases[command.name] func_wrapper = registered_commands[name] # Let the user know the command was recognized, and that a response should follow. await command.trigger_typing() if not permissions.can_execute(command): await command.respond( response = f"✗ Lacking permission.", embed = permissions_embed( # Can only lack permission in a guild. guild_id = command.guild_id(), command_wrappers = [func_wrapper] ) ) return False if len(func_wrapper.required_args) > len(command.args): missing_args = func_wrapper.required_args[len(command.args):] missing_arg_str = "`<" + "`>, <`".join(missing_args) + ">`" await command.respond_err(f"Missing required argument(s) {missing_arg_str}.") return False parsed_args = parse_args(command.args, arg_count=len(func_wrapper.required_args) + len(func_wrapper.optional_args)) await func_wrapper.execute(command, *parsed_args) return True
async def test_disable(): mock_command = MockCommand("disable", "disable", context=MockMessage(channel=MockChannel(guild=MockGuild(_id=3)))) set_permission_filter(guild_id=3, command_wrapper=get_wrapper("disable"), permission_filter="user:<@0>") assert await receive_command(mock_command) assert "✓" in mock_command.response expected_embed = permissions_embed(guild_id=3, command_wrappers=[get_wrapper("disable")]) assert mock_command.response_embed.fields[0].name == expected_embed.fields[0].name assert mock_command.response_embed.fields[0].value == expected_embed.fields[0].value assert not get_permission_filter(guild_id=3, command_wrapper=get_wrapper("disable"))
async def cmd_disable(command: Command, commands_str: str): if not command.guild_id(): await command.respond_err("Cannot change permissions in DM channels.") return command_wrappers = get_command_wrappers(commands_str) for command_wrapper in command_wrappers: permissions.set_permission_filter(guild_id=command.guild_id(), command_wrapper=command_wrapper, permission_filter=None) await command.respond(response="✓ Command permissions changed.", embed=permissions_embed( guild_id=command.guild_id(), command_wrappers=command_wrappers))
async def cmd_enable(command: Command, commands_str: str, perms_filter: Optional[str]=None): if not command.guild_id(): await command.respond_err("Cannot change permissions in DM channels.") return if perms_filter and not await validate_filter(command, perms_filter, filter_context): # `validate_filter` responds for us. return command_wrappers = get_command_wrappers(commands_str) for command_wrapper in command_wrappers: permissions.set_permission_filter( guild_id = command.guild_id(), command_wrapper = command_wrapper, permission_filter = perms_filter or f"role:<@&{command.context.guild.default_role.id}>" ) await command.respond( response = "✓ Command permissions changed.", embed = permissions_embed( guild_id = command.guild_id(), command_wrappers = command_wrappers ) )