UNPKG

@zerospacegg/vynthra

Version:
352 lines 15.7 kB
const { generateAllRandomMatches } = require("@zerospacegg/iolin/api/all-random"); /** * I'Olin's All-Random MatchMaker Discord Commands! 🌟⚡ * Portal hop through the cosmos and generate epic random matches! */ // Solo randomizer command const randomizerSoloSubcommand = { name: "randomizer-solo", description: "Generate random loadout for solo practice vs AI", builder: (subcommand) => subcommand .setName("randomizer-solo") .setDescription("Generate random loadout for solo practice vs AI") // Player name .addStringOption((option) => option .setName("player") .setDescription("Your player name") .setRequired(false)) // Number of games (optional, defaults to 3) .addIntegerOption((option) => option .setName("games") .setDescription("Number of games (Best of N)") .setRequired(false) .addChoices({ name: "Single Game", value: 1 }, { name: "Best of 3", value: 3 }, { name: "Best of 5", value: 5 }, { name: "Best of 7", value: 7 }, { name: "Best of 9", value: 9 })) // Seed for reproducible results (optional) .addIntegerOption((option) => option .setName("seed") .setDescription("Random seed for reproducible results (optional)") .setRequired(false)) // Public visibility option .addBooleanOption((option) => option .setName("public") .setDescription("Show results to everyone (default: private)") .setRequired(false)), async execute(interaction) { const player = interaction.options.getString("player") ?? "Solo Player"; const gameCount = interaction.options.getInteger("games") ?? 3; const seed = interaction.options.getInteger("seed") ?? undefined; const isPublic = interaction.options.getBoolean("public") ?? false; await interaction.deferReply({ ephemeral: !isPublic }); try { const startTime = Date.now(); const result = await generateAllRandomMatches("solo", gameCount, [player], seed); const endTime = Date.now(); const response = formatMatchResponse(result, endTime - startTime); await interaction.editReply({ content: response }); } catch (error) { console.error("Randomizer solo generation failed:", error); await interaction.editReply({ content: "❌ Failed to generate random solo loadout. Please try again!" }); } }, }; // 1v1 randomizer command const randomizer1v1Subcommand = { name: "randomizer-1v1", description: "Generate random loadouts for 1v1 match", builder: (subcommand) => subcommand .setName("randomizer-1v1") .setDescription("Generate random loadouts for 1v1 match") // Player names .addStringOption((option) => option .setName("player1") .setDescription("Player 1 name") .setRequired(false)) .addStringOption((option) => option .setName("player2") .setDescription("Player 2 name") .setRequired(false)) // Number of games (optional, defaults to 3) .addIntegerOption((option) => option .setName("games") .setDescription("Number of games (Best of N)") .setRequired(false) .addChoices({ name: "Single Game", value: 1 }, { name: "Best of 3", value: 3 }, { name: "Best of 5", value: 5 }, { name: "Best of 7", value: 7 }, { name: "Best of 9", value: 9 })) // Seed for reproducible results (optional) .addIntegerOption((option) => option .setName("seed") .setDescription("Random seed for reproducible results (optional)") .setRequired(false)) // Public visibility option .addBooleanOption((option) => option .setName("public") .setDescription("Show results to everyone (default: private)") .setRequired(false)), async execute(interaction) { const player1 = interaction.options.getString("player1") ?? "Player 1"; const player2 = interaction.options.getString("player2") ?? "Player 2"; const gameCount = interaction.options.getInteger("games") ?? 3; const seed = interaction.options.getInteger("seed") ?? undefined; const isPublic = interaction.options.getBoolean("public") ?? false; await interaction.deferReply({ ephemeral: !isPublic }); try { const startTime = Date.now(); const result = await generateAllRandomMatches("1v1", gameCount, [player1, player2], seed); const endTime = Date.now(); const response = formatMatchResponse(result, endTime - startTime); await interaction.editReply({ content: response }); } catch (error) { console.error("Randomizer 1v1 generation failed:", error); await interaction.editReply({ content: "❌ Failed to generate random 1v1 match. Please try again!" }); } }, }; // 2v2 randomizer command const randomizer2v2Subcommand = { name: "randomizer-2v2", description: "Generate random loadouts for 2v2 team match", builder: (subcommand) => subcommand .setName("randomizer-2v2") .setDescription("Generate random loadouts for 2v2 team match") // Team 1 players .addStringOption((option) => option .setName("team1-player1") .setDescription("Team 1 Player 1 name") .setRequired(false)) .addStringOption((option) => option .setName("team1-player2") .setDescription("Team 1 Player 2 name") .setRequired(false)) // Team 2 players .addStringOption((option) => option .setName("team2-player1") .setDescription("Team 2 Player 1 name") .setRequired(false)) .addStringOption((option) => option .setName("team2-player2") .setDescription("Team 2 Player 2 name") .setRequired(false)) // Number of games (optional, defaults to 3) .addIntegerOption((option) => option .setName("games") .setDescription("Number of games (Best of N)") .setRequired(false) .addChoices({ name: "Single Game", value: 1 }, { name: "Best of 3", value: 3 }, { name: "Best of 5", value: 5 }, { name: "Best of 7", value: 7 }, { name: "Best of 9", value: 9 })) // Seed for reproducible results (optional) .addIntegerOption((option) => option .setName("seed") .setDescription("Random seed for reproducible results (optional)") .setRequired(false)) // Public visibility option .addBooleanOption((option) => option .setName("public") .setDescription("Show results to everyone (default: private)") .setRequired(false)), async execute(interaction) { const t1p1 = interaction.options.getString("team1-player1") ?? "Team 1 Player 1"; const t1p2 = interaction.options.getString("team1-player2") ?? "Team 1 Player 2"; const t2p1 = interaction.options.getString("team2-player1") ?? "Team 2 Player 1"; const t2p2 = interaction.options.getString("team2-player2") ?? "Team 2 Player 2"; const gameCount = interaction.options.getInteger("games") ?? 3; const seed = interaction.options.getInteger("seed") ?? undefined; const isPublic = interaction.options.getBoolean("public") ?? false; await interaction.deferReply({ ephemeral: !isPublic }); try { const startTime = Date.now(); const result = await generateAllRandomMatches("2v2", gameCount, [t1p1, t1p2, t2p1, t2p2], seed); const endTime = Date.now(); const response = formatMatchResponse(result, endTime - startTime); await interaction.editReply({ content: response }); } catch (error) { console.error("Randomizer 2v2 generation failed:", error); await interaction.editReply({ content: "❌ Failed to generate random 2v2 match. Please try again!" }); } }, }; // FFA randomizer command const randomizerFfaSubcommand = { name: "randomizer-ffa", description: "Generate random loadouts for FFA (free for all) match", builder: (subcommand) => subcommand .setName("randomizer-ffa") .setDescription("Generate random loadouts for FFA (free for all) match") // FFA players .addStringOption((option) => option .setName("player1") .setDescription("Player 1 name") .setRequired(false)) .addStringOption((option) => option .setName("player2") .setDescription("Player 2 name") .setRequired(false)) .addStringOption((option) => option .setName("player3") .setDescription("Player 3 name") .setRequired(false)) .addStringOption((option) => option .setName("player4") .setDescription("Player 4 name") .setRequired(false)) // Number of games (optional, defaults to 3) .addIntegerOption((option) => option .setName("games") .setDescription("Number of games (Best of N)") .setRequired(false) .addChoices({ name: "Single Game", value: 1 }, { name: "Best of 3", value: 3 }, { name: "Best of 5", value: 5 }, { name: "Best of 7", value: 7 }, { name: "Best of 9", value: 9 })) // Seed for reproducible results (optional) .addIntegerOption((option) => option .setName("seed") .setDescription("Random seed for reproducible results (optional)") .setRequired(false)) // Public visibility option .addBooleanOption((option) => option .setName("public") .setDescription("Show results to everyone (default: private)") .setRequired(false)), async execute(interaction) { const player1 = interaction.options.getString("player1") ?? "Player 1"; const player2 = interaction.options.getString("player2") ?? "Player 2"; const player3 = interaction.options.getString("player3") ?? "Player 3"; const player4 = interaction.options.getString("player4") ?? "Player 4"; const gameCount = interaction.options.getInteger("games") ?? 3; const seed = interaction.options.getInteger("seed") ?? undefined; const isPublic = interaction.options.getBoolean("public") ?? false; await interaction.deferReply({ ephemeral: !isPublic }); try { const startTime = Date.now(); const result = await generateAllRandomMatches("ffa", gameCount, [player1, player2, player3, player4], seed); const endTime = Date.now(); const response = formatMatchResponse(result, endTime - startTime); await interaction.editReply({ content: response }); } catch (error) { console.error("Randomizer FFA generation failed:", error); await interaction.editReply({ content: "❌ Failed to generate random FFA match. Please try again!" }); } }, }; /** * Format the match generation result for Discord display */ function formatMatchResponse(result, generationTime) { const { gameSet, metadata } = result; const { gameType, gamesCount, games, players, seed } = gameSet; let response = `🌟⚡ **I'Olin's All-Random MatchMaker Results!** 🎮✨\n\n`; // Match info response += `📊 **Match Info:**\n`; response += `🎯 Type: **${gameType.toUpperCase()}** (${getGameTypeDescription(gameType)})\n`; response += `🎮 Games: **Best of ${gamesCount}**\n`; response += `👥 Players: ${players.join(", ")}\n`; if (seed) response += `🎲 Seed: \`${seed}\`\n`; response += `⏱️ Generated in: ${generationTime}ms\n\n`; // Games breakdown response += `🎮 **Game Breakdown:**\n`; for (let i = 0; i < games.length; i++) { const game = games[i]; response += `\n**Game ${i + 1}** (Host: ${game.host}):\n`; if (gameType === "2v2") { // Special formatting for 2v2 teams for (let teamIdx = 0; teamIdx < 2; teamIdx++) { const teamName = teamIdx === 0 ? "Team 1" : "Team 2"; response += ` **${teamName}:**\n`; for (let playerIdx = 0; playerIdx < 2; playerIdx++) { const gamePlayerIdx = teamIdx * 2 + playerIdx; const player = game.players[gamePlayerIdx]; const playerName = players[gamePlayerIdx]; // Get entity names const factionName = getFactionEmoji(player.faction) + " " + getEntityName(player.faction); const mercName = getMercEmoji(player.merc) + " " + getEntityName(player.merc); const heroName = "⭐ " + getEntityName(player.hero); response += ` **${playerName}:** ${factionName} + ${mercName}${heroName}\n`; } } } else { // Standard formatting for other game types for (let j = 0; j < game.players.length; j++) { const player = game.players[j]; const playerName = players[j]; // Get entity names const factionName = getFactionEmoji(player.faction) + " " + getEntityName(player.faction); const mercName = getMercEmoji(player.merc) + " " + getEntityName(player.merc); const heroName = "⭐ " + getEntityName(player.hero); response += ` **${playerName}:** ${factionName} + ${mercName}${heroName}\n`; } } // Map info response += ` 🗺️ **Map:** ${getEntityName(game.map)}\n`; } response += `\n*Portal hop complete! Ready for cosmic domination!* 🌟⚡`; // Discord has a 2000 character limit, truncate if needed if (response.length > 2000) { response = response.substring(0, 1950) + "...\n*Response truncated*"; } return response; } /** * Get game type description */ function getGameTypeDescription(gameType) { switch (gameType) { case "solo": return "Practice vs AI"; case "1v1": return "Two players"; case "2v2": return "Four players, teams"; case "ffa": return "Four players, free for all"; default: return gameType; } } /** * Get entity display name from ID */ function getEntityName(entityId) { const parts = entityId.split("/"); const name = parts[parts.length - 1]; return name .split("-") .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(" "); } /** * Get faction emoji */ function getFactionEmoji(factionId) { if (factionId.includes("grell")) return "🧬"; if (factionId.includes("protectorate")) return "🎖️"; if (factionId.includes("legion")) return "🔥"; return "⚔️"; } /** * Get mercenary emoji */ function getMercEmoji(mercId) { if (mercId.includes("arandi")) return "🌟"; if (mercId.includes("valkaru")) return "🔨"; if (mercId.includes("marran")) return "🎯"; if (mercId.includes("chakru")) return "🦀"; if (mercId.includes("dread")) return "💀"; return "🤝"; } //# sourceMappingURL=randomizer.js.map exports.randomizerSoloSubcommand = randomizerSoloSubcommand; exports.randomizer1v1Subcommand = randomizer1v1Subcommand; exports.randomizer2v2Subcommand = randomizer2v2Subcommand; exports.randomizerFfaSubcommand = randomizerFfaSubcommand;