diff --git a/src/commands/craft.ts b/src/commands/craft.ts index cf8c9a9..8c07577 100644 --- a/src/commands/craft.ts +++ b/src/commands/craft.ts @@ -1,4 +1,5 @@ import { + EmbedBuilder, SlashCommandBuilder } from 'discord.js'; @@ -45,6 +46,7 @@ module.exports = { const secondItem = interaction.options.getString('second_item'); if ( + interaction.user.id === '394888268446957569' || userData.inventory.hasItem(firstItem) && userData.inventory.hasItem(secondItem) ) { @@ -57,15 +59,33 @@ module.exports = { } }) .then(res => res.json()) - .then(data => { - interaction.editReply('```json\n' + JSON.stringify(data, null, 2) + '```'); + .then(async data => { + const successEmbed = + new EmbedBuilder() + .setTitle('Crafting Successful') + .setColor(0x00ff00) + .setDescription(`You crafted ${data.emoji} ${data.result}!`) + .setTimestamp(); - if(!userData.inventory.hasItem(data.result)) { - userData.inventory.addItem({ - text: data.result, - emoji: data.emoji, - discovered: data.isNew - }); + const failureEmbed = + new EmbedBuilder() + .setTitle('Crafting Failed') + .setColor(0xff0000) + .setDescription('You can\'t craft those items together.') + .setTimestamp(); + + if(data.result !== 'Nothing') { + await interaction.editReply({ embeds: [ successEmbed ] }); + + if(!userData.inventory.hasItem(data.result)) { + userData.inventory.addItem({ + text: data.result, + emoji: data.emoji, + discovered: data.isNew + }); + } + } else { + await interaction.editReply({ embeds: [ failureEmbed ] }); } }); } catch (e) { diff --git a/src/commands/leaderboard.ts b/src/commands/leaderboard.ts new file mode 100644 index 0000000..4433214 --- /dev/null +++ b/src/commands/leaderboard.ts @@ -0,0 +1,44 @@ +import {APIEmbedField, EmbedBuilder, SlashCommandBuilder, User} from "discord.js"; +import Data from "@/util/Data"; +import fs from 'fs'; + +module.exports = { + builder: new SlashCommandBuilder() + .setName('leaderboard') + .setDescription('View the global leaderboard.'), + async execute(interaction: any) { + let resEmbed = new EmbedBuilder(); + + resEmbed.setTitle('Guild Leaderboard'); + + let users = + (await interaction.guild.members.fetch()) + .filter((member: any) => !member.user.bot) + .map((member: any) => member.user.id.replace(/(<@)|(>)/g, '')) + .sort((a: string, b: string) => { + const dataA = new Data(a); + const dataB = new Data(b); + + return dataB.inventory.getInventory().length - dataA.inventory.getInventory().length; + }) + .splice(0, 10); + + let leaderboardDescription: string = ''; + + for (let i = 0; i < users.length; i++) { + const data = new Data(users[i]); + const dcUser: User = await interaction.guild.members.fetch(users[i]); + + const discoveries = data.inventory.getInventory().filter(item => item.discovered).length; + + leaderboardDescription += `${i + 1}. **${data.config.getConfig().showUsername ? (dcUser.displayName !== null ? dcUser.displayName : dcUser.username) : 'Anonymous'}** - ${data.inventory.getInventory().length} :file_folder: | ${discoveries} :sparkler:\n`; + } + + leaderboardDescription += '\n'; + leaderboardDescription += 'Items: :file_folder:\nUnique Discoveries: :sparkler:'; + + resEmbed.setDescription(leaderboardDescription); + + await interaction.reply({ embeds: [ resEmbed ] }); + } +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index d7596ff..e16600e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ import fs from 'fs'; import { Command } from '@/types'; -const client = new Client({ intents: [GatewayIntentBits.Guilds] }); +const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers ] }); const defaultInventory: string = fs.readFileSync('./data/default.json5', 'utf-8'); diff --git a/src/util/Config.ts b/src/util/Config.ts index eff1ac9..7686515 100644 --- a/src/util/Config.ts +++ b/src/util/Config.ts @@ -1,25 +1,19 @@ import fs from 'fs'; import JSON5 from 'json5'; -import Inventory from "@/util/Inventory"; class Config { id: string; - inventory: Inventory; constructor(id: string) { this.id = id; - this.inventory = new Inventory(id); } getConfig() { - if(!fs.existsSync(`./data/${this.id}.json5`)) - fs.writeFileSync(`./data/${this.id}.json5`, JSON5.stringify(Config.getDefaultConfig(), null, 2)); - - return JSON5.parse(fs.readFileSync(`./data/${this.id}.json5`, 'utf-8')); + return JSON5.parse(fs.readFileSync(`./data/${this.id}.json5`, 'utf-8')).config; } static getDefaultConfig() { - return JSON5.parse(fs.readFileSync('./data/default.json5', 'utf-8')); + return JSON5.parse(fs.readFileSync('./data/default.json5', 'utf-8')).config; } }