commit 15bab7ac9e9898ad85bc14ac50bfc1704be2274a Author: Noah Metz Date: Tue Jul 8 16:05:10 2025 -0600 Initial setup diff --git a/__init__.py b/__init__.py new file mode 100755 index 0000000..bfe6399 --- /dev/null +++ b/__init__.py @@ -0,0 +1,160 @@ +#!/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")