#!/usr/bin/env python3 import discord from discord import app_commands from discord.app_commands import Choice from requests import get from sys import argv from os import environ from json import loads from traceback import format_exc from emotes import mana_format 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}") @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"] oracle_str = mana_format(card.get("oracle_text")) mana_cost = mana_format(card.get("mana_cost")) name_str = f"{mana_cost}\t{name}: {type_line}" 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")