mirror of
https://github.com/arthur-pbty/xiao.git
synced 2026-06-03 23:36:43 +02:00
88 lines
2.7 KiB
JavaScript
88 lines
2.7 KiB
JavaScript
const Command = require('../../framework/Command');
|
||
const request = require('node-superfetch');
|
||
const { EmbedBuilder } = require('discord.js');
|
||
const logos = require('../../assets/json/logos');
|
||
|
||
module.exports = class LorcanaCommand extends Command {
|
||
constructor(client) {
|
||
super(client, {
|
||
name: 'lorcana',
|
||
aliases: ['lorcana-card'],
|
||
group: 'search',
|
||
description: 'Responds with info on a Lorcana card.',
|
||
credit: [
|
||
{
|
||
name: 'Ravensburger',
|
||
url: 'https://www.disneylorcana.com/en-US',
|
||
reason: 'Original Game'
|
||
},
|
||
{
|
||
name: 'Lorcana API',
|
||
url: 'https://lorcana-api.com/Home.html',
|
||
reason: 'API'
|
||
}
|
||
],
|
||
args: [
|
||
{
|
||
key: 'query',
|
||
type: 'string',
|
||
max: 500
|
||
}
|
||
]
|
||
});
|
||
|
||
this.cache = null;
|
||
}
|
||
|
||
async run(msg, { query }) {
|
||
const card = await this.search(query);
|
||
if (!card) return msg.say('Could not find any results.');
|
||
const oracleText = card.Body_Text ? card.Body_Text.replace(/{i}/g, 'Ink') : `_${card.Flavor_Text}_`;
|
||
const classifications = card.Classifications ? `- ${card.Classifications}` : '';
|
||
const embed = new EmbedBuilder()
|
||
.setURL(card.Image)
|
||
.setColor(0xD3B078)
|
||
.setThumbnail(card.Image)
|
||
.setDescription(`{${card.Cost}} ${card.Type}${classifications}\n\n${oracleText}`)
|
||
.setAuthor({ name: 'Lorcana', iconURL: logos.lorcana, url: 'https://www.disneylorcana.com/en-US' })
|
||
.setTitle(card.Name)
|
||
.setFooter({ text: `${card.Set_Name} - ${card.Card_Num}` })
|
||
.addField('❯ Color', card.Color, true)
|
||
.addField('❯ Inkable?', card.Inkable ? 'Yes' : 'No', true)
|
||
.addBlankField(true);
|
||
if (card.Type === 'Character') {
|
||
embed.addField('❯ Strength', card.Strength.toString(), true);
|
||
embed.addField('❯ Willpower', card.Willpower.toString(), true);
|
||
embed.addField('❯ Lore', card.Lore ? card.Lore.toString() : '0', true);
|
||
}
|
||
if (card.Type === 'Location') {
|
||
embed.addField('❯ Willpower', card.Willpower.toString(), true);
|
||
embed.addField('❯ Move Cost', card.Move_Cost.toString(), true);
|
||
embed.addField('❯ Lore', card.Lore ? card.Lore.toString() : '0', true);
|
||
}
|
||
return msg.embed(embed);
|
||
}
|
||
|
||
async search(query) {
|
||
if (!this.cache) await this.fetchCards();
|
||
const q = query.replace(/( -)|,/g, '');
|
||
const exactResults = this.cache.filter(card => {
|
||
const slug = card.Name.toLowerCase().replace(/( -)|,/g, '');
|
||
return slug === q;
|
||
});
|
||
if (exactResults.length) return exactResults[0];
|
||
const results = this.cache.filter(card => {
|
||
const slug = card.Name.toLowerCase().replace(/( -)|,/g, '');
|
||
return slug.includes(q.toLowerCase());
|
||
});
|
||
if (!results.length) return null;
|
||
return results[0];
|
||
}
|
||
|
||
async fetchCards() {
|
||
const { body } = await request.get('https://api.lorcana-api.com/cards/all');
|
||
this.cache = body;
|
||
return this.cache;
|
||
}
|
||
};
|