from collections import AsyncIterable from typing import Callable, AsyncGenerator, Optional import discord async def async_filter(fun: Callable, iterable: AsyncIterable) -> AsyncGenerator: async for val in iterable: if fun(val): yield val def find_category(guild: discord.Guild, group: str) -> Optional[discord.CategoryChannel]: group = group.lower() for cat in guild.categories: if cat.name.lower() == group: return cat return None async def find_role_case_insensitive(guild: discord.Guild, name: str, prefix: str = '') -> Optional[discord.Role]: for role in await guild.fetch_roles(): if name.strip().lower() == role.name[len(prefix):].lower(): return role return None