import { SlashCommandBuilder, EmbedBuilder, MessageFlags } from "discord.js" import type { ChatInputCommandInteraction, MessageReaction, User } from "discord.js" import { search, repo, torrent, download, magnet } from "@/utils/crack" import type { CrackGame } from "@/types" import { t } from "@/utils/i18n" export const data = new SlashCommandBuilder() .setName("crack") .setDescription("Download a crack from online-fix.me") .setDescriptionLocalizations({ fr: "Télécharge un crack sur online-fix.me" }) .addStringOption(option => option .setName("game") .setDescription("What game do you want to download?") .setNameLocalizations({ fr: "jeu" }) .setDescriptionLocalizations({ fr: "Quel jeu tu veux télécharger ?" }) .setRequired(true) ) export async function execute(interaction: ChatInputCommandInteraction) { await interaction.deferReply() const query = interaction.options.getString("game", true) let games = await search(query) if (!Array.isArray(games)) return interaction.followUp({ content: t(interaction.locale, "salonpostam.crack.no_games_found", { query }), flags: MessageFlags.Ephemeral }) let game = {} as CrackGame if (games.length > 1) { games = games.slice(0, 9) let list = "" for (let i = 0; i < games.length; i++) list += `\n${i + 1}. ${games[i].name} (${games[i].link})` const message = await interaction.followUp({ content: t(interaction.locale, "salonpostam.crack.multiple_games_found", { query, list }) }) const emojis = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣"] for (let i = 0; i < games.length; i++) await message.react(emojis[i]) // Wait for a reaction to be added by the interaction author. const filter = (reaction: MessageReaction, user: User) => { if (reaction.emoji.name) return (emojis.includes(reaction.emoji.name) && user.id === interaction.user.id) return false } await message.awaitReactions({ filter, max: 1, time: 5000, errors: ["time"] }).then(collected => { console.log(collected) const reaction = collected.first() const index = emojis.indexOf(reaction?.emoji.name ?? "") if (!games) return game = games[index] }) .catch(() => { return interaction.followUp({ content: t(interaction.locale, "salonpostam.crack.selection_timeout"), flags: MessageFlags.Ephemeral }) }) } else game = games[0] const url = await repo(game) if (!url) return const file = await torrent(url) if (!file) return const filePath = await download(url, file) if (!filePath) return const link = magnet(filePath) const embed = new EmbedBuilder() .setColor("#ffc370") .setTitle(game.name) .setURL(game.link) .setDescription(t(interaction.locale, "salonpostam.crack.game_found", { query, link: `https://angels-dev.fr/magnet/${link}` })) await interaction.followUp({ embeds: [embed], files: [filePath] }) }