@zerospacegg/vynthra
Version:
Discord bot for ZeroSpace.gg data
352 lines • 15.7 kB
JavaScript
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;