Files
xiao/commands/search/magic.js
T
Dragon Fire d941950f57 Fix
2024-04-03 18:11:55 -04:00

93 lines
2.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const Command = require('../../framework/Command');
const request = require('node-superfetch');
const { MessageEmbed } = require('discord.js');
const { stripIndents } = require('common-tags');
const logos = require('../../assets/json/logos');
const funny = [
'cheatyface',
'rainbow dash',
'pinkie pie',
'twilight sparkle',
'applejack',
'fluttershy',
'rarity',
'nightmare moon',
'princess luna',
'discord',
'discord, lord of disharmony'
];
module.exports = class MagicCommand extends Command {
constructor(client) {
super(client, {
name: 'magic',
aliases: ['mtg', 'mtg-card', 'magic-the-gathering', 'magic-the-gathering-card'],
group: 'search',
memberName: 'magic',
description: 'Responds with info on a Magic: The Gathering card.',
credit: [
{
name: 'Wizards of the Coast',
url: 'https://company.wizards.com/en',
reason: 'Original Game',
reasonURL: 'https://magic.wizards.com/en'
},
{
name: 'Scryfall',
url: 'https://scryfall.com/',
reason: 'API',
reasonURL: 'https://scryfall.com/docs/api'
}
],
args: [
{
key: 'query',
type: 'string',
max: 500,
default: ''
}
]
});
}
async run(msg, { query }) {
const card = query ? await this.search(query) : await this.random();
if (!card) return msg.say('Could not find any results.');
const isMDFC = Boolean(card.card_faces);
const oracleText = isMDFC ? card.card_faces.map(c => c.oracle_text).join('\n\n//\n\n') : card.oracle_text;
const manaCost = isMDFC ? card.card_faces.map(c => c.mana_cost).join(' // ') : card.mana_cost;
const embed = new MessageEmbed()
.setURL(card.scryfall_uri)
.setColor(0x2B253A)
.setThumbnail(card.card_faces ? card.card_faces[0].image_uris.art_crop : card.image_uris.art_crop)
.setDescription(`${manaCost} ${card.type_line}\n\n${oracleText}`)
.setAuthor('Scryfall', logos.scryfall, 'https://scryfall.com/')
.setTitle(card.name)
.addField(' Price', stripIndents`
**Non-Foil:** [${card.prices.usd ? `$${card.prices.usd}` : '???'}](${card.purchase_uris.tcgplayer})
**Foil:** [${card.prices.usd_foil ? `$${card.prices.usd_foil}` : '???'}](${card.purchase_uris.tcgplayer})
`);
return msg.embed(embed);
}
async search(query) {
try {
const isFunny = funny.includes(query);
const { body } = await request
.get('https://api.scryfall.com/cards/search')
.query({ q: `${query}${isFunny ? ' is:funny' : ''}` });
return body.data[0];
} catch (err) {
if (err.status === 404) return null;
throw err;
}
}
async random() {
const { body } = await request
.get('https://api.scryfall.com/cards/random')
.query({ q: 'is:spell game:paper' });
return body;
}
};