krenko/__init__.py

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")