#!/usr/bin/env python3 import discord from discord import app_commands from discord.app_commands import Choice import re from requests import get from sys import argv from os import environ from json import loads from traceback import format_exc def get_cards(query: str): print(f"{mana_cost}\t{name}: {type_line}") for line in oracle_text.split('\n'): print(f"\t{line}") intents = discord.Intents.default() client = discord.Client(intents=intents) tree = app_commands.CommandTree(client) @client.event async def on_ready(): await tree.sync() print(f"Logged in as {client.user}") mana_numbers = [ "<:mana0:292901467382087680>", "<:mana1:292901508373282827>", "<:mana2:292901509060886528>", "<:mana3:292901508771610624>", "<:mana4:292901508712890379>", "<:mana5:292901508796645386>", "<:mana6:292901508780130304>", "<:mana7:292901508540792835>", "<:mana8:292901508830330880>", "<:mana9:292901508826005504>", "<:mana10:292901508851302400>", "<:mana11:292901508838850570>", "<:mana12:292901508838850560>", "<:mana13:292901508872142858>", "<:mana14:292901508855627776>", "<:mana15:1013559311055732826>", "<:mana16:292901508708564993>" ] mana_symbols = { "W": "<:manaw:1007102126813610074>", "U": "<:manau:292901508754702338>", "B": "<:manab:292901508872273920>", "R": "<:manar:292901508796645397>", "G": "<:manag:292901508654301185>", "C": "<:manac:292901508943577088>", "S": "<:manas:292901509081858058>", "W/U": "<:manawu:292901508696113153>", "W/B": "<:manawb:292901509044109312>", "B/R": "<:manabr:292901508939382784>", "B/G": "<:manabg:292901508863754241>", "U/B": "<:manaub:292901509056692224>", "U/R": "<:manaur:292901509010817024>", "R/G": "<:manarg:292901508738056193>", "R/W": "<:manarw:292901508834525190>", "G/W": "<:managw:292901508977000448>", "G/U": "<:managu:292901509035851788>", "2/W": "<:mana2w:292901508771741696>", "2/U": "<:mana2u:292901508721410058>", "2/B": "<:mana2b:292901508469489667>", "2/R": "<:mana2r:292901508310368259>", "2/G": "<:mana2g:292901508695982080>", "C/P": "<:manacp:1271312850740187137>", "W/P": "<:manawp:292901508826005515>", "U/P": "<:manaup:292901508780130305>", "B/P": "<:manabp:292901508922474496>", "R/P": "<:manarp:292901509023137792>", "G/P": "<:managp:292901508964679680>", "HW": "<:manahw:936814586663948398>", "HR": "<:manahr:936814586382921752>", "X": "<:manax:292901509082120202>", "Y": "<:manay:936814586638766151>", "Z": "<:manaz:936814586680713276>", "T": "<:manat:292901509073731584>", "Q": "<:manaq:292901508834394123>", "E": "<:manae:292901508947640320>", "P": "<:manap:1260458912046645319>", "A": "<:manaa:936814586680713276>", "CHAOS": "<:manachaos:292901508712890369>", "∞": "<:manainfinity:936814586731040898>", } @tree.command( name="search", description="Search scryfall with an advanced expression", ) @app_commands.choices(sort=[ Choice(name="Released", value="released"), Choice(name="Name", value="name"), Choice(name="Collector Number", value="set"), Choice(name="Price", value="usd"), ]) async def search(interaction, query: str, sort: Choice[str] = "released", max: int = 5): print(f"Processing: {query}") try: resp = get("https://api.scryfall.com/cards/search", params={"q": query, "order": sort, "include_variations": True}) obj = loads(resp.text) if resp.status_code != 200: raise Exception(obj.get("details", "unknown error")) num_cards = obj["total_cards"] embed = discord.Embed(title=f"{query}: {num_cards} results", type="rich") num_cards = 0 for card in obj["data"]: name = card["name"] type_line = card["type_line"] mana_cost = card.get("mana_cost") #mana_cost = re.sub("{([0-9]*)}", "{MANA\\1}", mana_cost) mana_cost = mana_cost.format(*mana_numbers, **mana_symbols) name_str = f"{mana_cost}\t{name}: {type_line}" oracle_str = card.get("oracle_text") #oracle_str = re.sub("{([0-9]*)}", ":mana\\1:", oracle_str) oracle_str = oracle_str.format(*mana_numbers, **mana_symbols) if len(embed) + len(oracle_str) + len(name_str) > 6000: break embed.add_field(name=name_str, value=oracle_str, inline=False) num_cards += 1 if num_cards >= max: break await interaction.response.send_message(embed=embed) except (Exception, discord.HTTPException) as e: print(format_exc()) embed = discord.Embed(type="rich") embed.add_field(name=f"\"{query}\" error", value=str(e)) await interaction.response.send_message(embed=embed) token = environ.get("DISCORD_BOT_TOKEN") if token: client.run(token) else: print("Set DISCORD_BOT_TOKEN environment and run again")