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