def _sqlite_adapters(): def adapt_ieee(eui64): return str(eui64) aiosqlite.register_adapter(t.EUI64, adapt_ieee) aiosqlite.register_adapter(t.ExtendedPanId, adapt_ieee) def convert_ieee(s): return t.EUI64.convert(s.decode()) aiosqlite.register_converter("ieee", convert_ieee)
def __init__(self, bot): self.bot = bot aiosqlite.register_adapter(commands.Command, lambda x: pickle.dumps(x)) bot.loop.create_task(self.cmd_init()) async def react_and_wait(msg: discord.Message, **kwargs) -> tuple: """ Allows for users to respond with either a string or an emoji representation of it. The kwarg should be written as {"str_repr"=emoji}. """ for emote in kwargs.values(): await msg.add_reaction(emote) def check_msg(_msg): return all( (_msg.content in kwargs.keys(), _msg.channel == msg.channel, _msg.author == msg.author)) def check_reaction(_reaction, user): return all((_reaction.emoji in kwargs.keys(), _reaction.message == msg, user == msg.author)) # ?tag wait_for multiple in dpy for more info done, pending = await asyncio.wait( (self.bot.wait_for("message", check=check_msg), self.bot.wait_for("reaction_add", check=check_reaction)), return_when=asyncio.FIRST_COMPLETED, timeout=60 # TODO: Configurable timeout ) try: coro = done.pop().result() except IndexError: return await msg.channel.send("Choice timed out.") for future in done: future.exception() for future in pending: future.cancel() if isinstance(coro, discord.Message): return coro.content, "message", coro else: reaction, _ = coro return {v: k for k, v in kwargs.items() }.get(str(reaction.emoji)), "reaction_add", coro bot.react_and_wait = react_and_wait