async def svgdb_embed(card: dict) -> dict: card_id = card["card_id"] data = await svgdb_get(card_id) title = card_data.effective_card_name(card) description = ("Provided by [svgdb.me](https://svgdb.me). " "This bot is not affiliated with svgdb.") fields = [ dict(name=label, value=f"[en]({en}) [jp]({jp})") for label, en, jp in data ] url = f"https://svgdb.me/cards/{card_id}" return dict(title=title, description=description, fields=fields, url=url)
async def art_gen(ctx, query: list, which: str): """Helper function for art commands""" async with ctx.typing(): cards = await card_data.get() results = card_data.find(cards, query) if not results: raise CardNotFoundError(query) result = results[0] card_id = result["card_id"] card_name = card_data.effective_card_name(result) async with ctx.typing(): image = await card_art.get_asset(card_id, which) if image is None: raise CardArtError(card_id, card_name) else: await ctx.send(card_name, file=discord.File(image, "0.png"))
async def cards(ctx, *query): """List all matching cards. Keyword search is supported. Examples: - search 6pp shadow gold spell - search earth sigil - search havencraft "repair mode" - search legendary "steel rebellion" """ async with ctx.typing(): cards = await card_data.get() results = card_data.find(cards, query) if not results: raise CardNotFoundError(query) else: max_results = 20 if len(results) <= max_results: lines = [f"Found {len(results)} cards:"] lines += [card_data.effective_card_name(card) for card in results] await ctx.send("\n".join(lines)) else: lo = 0 hi = max_results lines = [f"Found {len(results)} cards, displaying {lo+1}-{hi}:"] lines += [ card_data.effective_card_name(card) for card in results[lo:hi] ] msg = await ctx.send("\n".join(lines)) await msg.add_reaction("⬅️") await msg.add_reaction("➡️") def check(reaction, user): return (user != bot.user and reaction.message.id == msg.id and reaction.emoji in ["➡️", "⬅️"]) while True: try: reaction, usr = await bot.wait_for("reaction_add", timeout=30.0, check=check) except asyncio.TimeoutError: await msg.remove_reaction("➡️", bot.user) await msg.remove_reaction("⬅️", bot.user) break else: if reaction.emoji == "➡️": hi = min(len(results), hi + max_results) lo = hi - max_results elif reaction.emoji == "⬅️": lo = max(0, lo - max_results) hi = lo + max_results lines = [ f"Found {len(results)} cards, displaying {lo+1}-{hi}:" ] lines += [ card_data.effective_card_name(card) for card in results[lo:hi] ] await msg.edit(content="\n".join(lines))
async def cards(ctx, *query): """List all matching cards. Keyword search is supported. Examples: - search 6pp shadow gold spell - search earth sigil - search havencraft "repair mode" - search legendary "steel rebellion" """ async with ctx.typing(): cards = await card_data.get() results = card_data.find(cards, query) if not results: raise CardNotFoundError(query) else: counter = 0 max_results = 20 lines = [f"Found {len(results)} cards:"] lines += [ card_data.effective_card_name(card) for card in results[:max_results] ] lines += [ f"(displaying {counter*max_results+1}-{min(len(results), counter*max_results+max_results)} of {len(results)})" ] msg = await ctx.send("\n".join(lines)) if len(results) > max_results: await msg.add_reaction("➡️") def check(reaction, user): return (user != bot.user and reaction.message.id == msg.id and (str(reaction.emoji) == "➡️" or str(reaction.emoji) == "⬅️")) max_counter = int(len(results) / max_results) if len(results) % max_results == 0: max_counter -= 1 while True: try: Reaction, usr = await bot.wait_for("reaction_add", timeout=30.0, check=check) # prevReact = discord.Reaction except asyncio.TimeoutError: await msg.clear_reaction("➡️") await msg.clear_reaction("⬅️") break else: if Reaction.emoji == "➡️": counter += 1 lines = [ card_data.effective_card_name(card) for card in results[counter * max_results:counter * max_results + max_results] ] lines += [ f"(displaying {counter*max_results+1}-{min(len(results), counter*max_results+max_results)} of {len(results)})" ] if len(lines) > 0: await msg.edit(content="\n".join(lines)) if counter > 0: await msg.add_reaction("⬅️") if counter >= max_counter: await msg.clear_reaction("➡️") elif Reaction.emoji == "⬅️": counter -= 1 lines = [ card_data.effective_card_name(card) for card in results[counter * max_results:counter * max_results + max_results] ] if (counter * max_results + max_results < len(results) and len(results[counter * max_results + max_results:]) > 0): await msg.add_reaction("➡️") if counter >= 0: lines += [ f"(displaying {counter*max_results+1}-{min(len(results), counter*max_results+max_results)} of {len(results)})" ] await msg.edit(content="\n".join(lines)) if counter == 0: await msg.clear_reaction("⬅️")
def find(cards, query): return [ card_data.effective_card_name(card) for card in card_data.find(cards, query.split()) ]