import { EmbedBuilder, SlashCommandBuilder } from "discord.js"; import { Spiget } from "spiget"; const spiget = new Spiget("Viper-Network"); export default { name: "search", description: "Durchsucht die Spiget-API nach einer Ressource und gibt die Top-Ergebnisse zurück", aliases: [], guild: ["all"], nsfw: false, user_permissions: [], bot_permissions: [], args_required: 1, args_usage: `[ressourcenname] Beispiel: vn!search Vault\nTipp: -n [anzahl] für Suchmenge (Standard: 100), -r für Sortierung nach Bewertung\nBeispiel: vn!search a -n 5000 -r`, cooldown: 3, data: new SlashCommandBuilder() .setName("search") .setDescription("Sucht nach einem Plugin auf SpigotMC") .addStringOption((opt) => opt.setName("name").setDescription("Name des Plugins").setRequired(true) ) .addIntegerOption((opt) => opt.setName("anzahl").setDescription("Suchmenge (Standard: 100)").setRequired(false) ) .addStringOption((opt) => opt .setName("sortierung") .setDescription("Sortierung der Ergebnisse") .setRequired(false) .addChoices( { name: "Downloads", value: "downloads" }, { name: "Bewertung", value: "rating" } ) ), async execute(client, ctx, args) { let search, size, sortBy; if (ctx.isSlash) { search = ctx.interaction.options.getString("name"); size = ctx.interaction.options.getInteger("anzahl") ?? 100; sortBy = ctx.interaction.options.getString("sortierung") ?? "downloads"; } else { size = 100; sortBy = "downloads"; // Parse -n flag const nIdx = args.indexOf("-n"); if (nIdx !== -1 && args[nIdx + 1]) { const parsed = parseInt(args[nIdx + 1], 10); if (!isNaN(parsed) && parsed > 0) size = parsed; args.splice(nIdx, 2); } // Parse -r flag (sort by rating) const rIdx = args.indexOf("-r"); if (rIdx !== -1) { sortBy = "rating"; args.splice(rIdx, 1); } if (args.length === 0) { return ctx.reply("Bitte gib einen Suchbegriff an!"); } search = args.join(" "); } const apiURL = `https://api.spiget.org/v2/search/resources/${encodeURIComponent(search)}?size=${size}`; let results; try { const res = await fetch(apiURL); if (!res.ok) throw new Error(`HTTP ${res.status}`); results = await res.json(); } catch (e) { client.logger.error(e); return ctx.reply("Die Spiget-API konnte nicht erreicht werden. Bitte versuche es später erneut."); } if (!Array.isArray(results) || results.length === 0) { return ctx.reply(`Keine Ergebnisse für \`${search}\` gefunden.`); } // Sort by downloads or rating const topResults = results .sort((a, b) => { if (sortBy === "rating") { const ratingA = a.rating?.average ?? 0; const ratingB = b.rating?.average ?? 0; return ratingB - ratingA; } return b.downloads - a.downloads; }) .slice(0, 5); const list = topResults .map(({ id, name, downloads, rating }) => { const stars = rating?.average ? `⭐ ${rating.average.toFixed(1)}` : "⭐ k.A."; return `**${name}**\n⬇️ *${downloads.toLocaleString("de-DE")}* ${stars} 🆔 ${id}`; }) .join("\n\n"); const sortLabel = sortBy === "rating" ? "Bewertung" : "Downloads"; const resultEmbed = new EmbedBuilder() .setColor(ctx.guild.members.me.displayHexColor) .setTitle(`:mag: Top-Ergebnisse für '${search}'`) .setDescription(`${list}\n\n⬇️ = Downloads ⭐ = Bewertung 🆔 = Plugin-ID`) .setFooter({ text: `Sortiert nach: ${sortLabel} | ${client.config.prefix}plugin [id] für mehr Details`, }); return ctx.reply({ embeds: [resultEmbed] }); }, };