Introduces a new interactive help command with button navigation, adds a detailed DEPLOYMENT.md guide, and improves server setup validation and error handling. Updates command registration to include all 9 games, adds version reporting, enhances Docker deployment with a multi-platform script, and removes local .env files from the repo. Also refactors bot startup for better diagnostics and graceful shutdown.
182 lines
6.5 KiB
JavaScript
182 lines
6.5 KiB
JavaScript
const { REST, Routes, SlashCommandBuilder, PermissionFlagsBits } = require("discord.js");
|
|
require("dotenv").config();
|
|
|
|
const commands = [
|
|
new SlashCommandBuilder()
|
|
.setName("help")
|
|
.setDescription("Get help with BattleBot commands and features")
|
|
.addStringOption((option) =>
|
|
option
|
|
.setName("category")
|
|
.setDescription("Select a help category")
|
|
.setRequired(false)
|
|
.addChoices(
|
|
{ name: "Big Ballers VR", value: "Big Ballers VR" },
|
|
{ name: "Blacktop Hoops", value: "Blacktop Hoops" },
|
|
{ name: "Breachers", value: "Breachers" },
|
|
{ name: "Echo Arena", value: "Echo Arena" },
|
|
{ name: "Echo Combat", value: "Echo Combat" },
|
|
{ name: "Gun Raiders", value: "Gun Raiders" },
|
|
{ name: "Nock", value: "Nock" },
|
|
{ name: "Orion Drift", value: "Orion Drift" },
|
|
{ name: "VAIL", value: "VAIL" }
|
|
)
|
|
),
|
|
new SlashCommandBuilder()
|
|
.setName("version")
|
|
.setDescription("Show bot version and system information"),
|
|
new SlashCommandBuilder()
|
|
.setName("finduser")
|
|
.setDescription("Find a user by username")
|
|
.addStringOption((option) =>
|
|
option
|
|
.setName("game")
|
|
.setDescription("Select the game")
|
|
.setRequired(true)
|
|
.addChoices(
|
|
{ name: "Big Ballers VR", value: "Big Ballers VR" },
|
|
{ name: "Blacktop Hoops", value: "Blacktop Hoops" },
|
|
{ name: "Breachers", value: "Breachers" },
|
|
{ name: "Echo Arena", value: "Echo Arena" },
|
|
{ name: "Echo Combat", value: "Echo Combat" },
|
|
{ name: "Gun Raiders", value: "Gun Raiders" },
|
|
{ name: "Nock", value: "Nock" },
|
|
{ name: "Orion Drift", value: "Orion Drift" },
|
|
{ name: "VAIL", value: "VAIL" }
|
|
)
|
|
)
|
|
.addStringOption((option) =>
|
|
option
|
|
.setName("username")
|
|
.setDescription("The username to search for")
|
|
.setRequired(true)
|
|
),
|
|
new SlashCommandBuilder()
|
|
.setName("matchhistory")
|
|
.setDescription("View match history")
|
|
.addStringOption((option) =>
|
|
option
|
|
.setName("username")
|
|
.setDescription("The username to search for")
|
|
.setRequired(true)
|
|
)
|
|
.addStringOption((option) =>
|
|
option
|
|
.setName("game")
|
|
.setDescription("Filter by game (optional)")
|
|
.setRequired(false)
|
|
.addChoices(
|
|
{ name: "Big Ballers VR", value: "Big Ballers VR" },
|
|
{ name: "Blacktop Hoops", value: "Blacktop Hoops" },
|
|
{ name: "Breachers", value: "Breachers" },
|
|
{ name: "Echo Arena", value: "Echo Arena" },
|
|
{ name: "Echo Combat", value: "Echo Combat" },
|
|
{ name: "Gun Raiders", value: "Gun Raiders" },
|
|
{ name: "Nock", value: "Nock" },
|
|
{ name: "Orion Drift", value: "Orion Drift" },
|
|
{ name: "VAIL", value: "VAIL" }
|
|
)
|
|
),
|
|
new SlashCommandBuilder()
|
|
.setName("subscribe")
|
|
.setDescription("Subscribe to game notifications")
|
|
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator)
|
|
.addStringOption((option) =>
|
|
option
|
|
.setName("game")
|
|
.setDescription("Game to subscribe to")
|
|
.setRequired(true)
|
|
.addChoices(
|
|
{ name: "Big Ballers VR", value: "Big Ballers VR" },
|
|
{ name: "Blacktop Hoops", value: "Blacktop Hoops" },
|
|
{ name: "Breachers", value: "Breachers" },
|
|
{ name: "Echo Arena", value: "Echo Arena" },
|
|
{ name: "Echo Combat", value: "Echo Combat" },
|
|
{ name: "Gun Raiders", value: "Gun Raiders" },
|
|
{ name: "Nock", value: "Nock" },
|
|
{ name: "Orion Drift", value: "Orion Drift" },
|
|
{ name: "VAIL", value: "VAIL" }
|
|
)
|
|
)
|
|
.addChannelOption((option) =>
|
|
option
|
|
.setName("channel")
|
|
.setDescription("Channel for notifications")
|
|
.setRequired(true)
|
|
),
|
|
new SlashCommandBuilder()
|
|
.setName("unsubscribe")
|
|
.setDescription("Unsubscribe from game notifications")
|
|
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator)
|
|
.addStringOption((option) =>
|
|
option
|
|
.setName("game")
|
|
.setDescription("Game to unsubscribe from")
|
|
.setRequired(true)
|
|
.addChoices(
|
|
{ name: "Big Ballers VR", value: "Big Ballers VR" },
|
|
{ name: "Blacktop Hoops", value: "Blacktop Hoops" },
|
|
{ name: "Breachers", value: "Breachers" },
|
|
{ name: "Echo Arena", value: "Echo Arena" },
|
|
{ name: "Echo Combat", value: "Echo Combat" },
|
|
{ name: "Gun Raiders", value: "Gun Raiders" },
|
|
{ name: "Nock", value: "Nock" },
|
|
{ name: "Orion Drift", value: "Orion Drift" },
|
|
{ name: "VAIL", value: "VAIL" }
|
|
)
|
|
),
|
|
new SlashCommandBuilder()
|
|
.setName("register_server")
|
|
.setDescription("Register this Discord server with BattleBot")
|
|
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator),
|
|
new SlashCommandBuilder()
|
|
.setName("list_subscriptions")
|
|
.setDescription("List all game subscriptions for this server")
|
|
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator),
|
|
new SlashCommandBuilder()
|
|
.setName("findteam")
|
|
.setDescription("Find a team by name")
|
|
.addStringOption((option) =>
|
|
option
|
|
.setName("game")
|
|
.setDescription("Select the game")
|
|
.setRequired(true)
|
|
.addChoices(
|
|
{ name: "Big Ballers VR", value: "Big Ballers VR" },
|
|
{ name: "Blacktop Hoops", value: "Blacktop Hoops" },
|
|
{ name: "Breachers", value: "Breachers" },
|
|
{ name: "Echo Arena", value: "Echo Arena" },
|
|
{ name: "Echo Combat", value: "Echo Combat" },
|
|
{ name: "Gun Raiders", value: "Gun Raiders" },
|
|
{ name: "Nock", value: "Nock" },
|
|
{ name: "Orion Drift", value: "Orion Drift" },
|
|
{ name: "VAIL", value: "VAIL" }
|
|
)
|
|
)
|
|
.addStringOption((option) =>
|
|
option
|
|
.setName("teamname")
|
|
.setDescription("The team name to search for")
|
|
.setRequired(true)
|
|
),
|
|
];
|
|
|
|
const rest = new REST({ version: "10" }).setToken(process.env.DISCORD_TOKEN);
|
|
|
|
(async () => {
|
|
try {
|
|
console.log("Started refreshing application (/) commands.");
|
|
console.log(
|
|
"Commands to be deployed:",
|
|
commands.map((cmd) => cmd.name)
|
|
);
|
|
|
|
await rest.put(Routes.applicationCommands(process.env.CLIENT_ID), {
|
|
body: commands.map((command) => command.toJSON()),
|
|
});
|
|
|
|
console.log("Successfully reloaded application (/) commands.");
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
})(); |