161 lines
5.1 KiB
Python
161 lines
5.1 KiB
Python
#!/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")
|