Team Search Improvements: Added required game selection before team name input Added VR Battles image as the main embed image Removed buttons for cleaner display Added sorting by game mode (Squads > Duo > Solo) Made team display more compact with icons and shortened stats Added SQL injection protection and input sanitization User Search Improvements: Made game selection required before username input Added VR Battles image as the main embed image Added better user status messages: played Security Enhancements: Added input validation and sanitization at multiple levels Limited input lengths to prevent buffer overflow Added proper error handling and logging Implemented safe API calls with timeouts and validation Added protection against SQL injection Code Organization: Improved error messages for better user feedback Added comprehensive logging for monitoring Made responses visible to everyone in the channel Cleaned up code structure and removed redundant parts Development Environment: Set up proper development configuration Added environment variable management Improved command deployment process
144 lines
4.9 KiB
JavaScript
144 lines
4.9 KiB
JavaScript
const { REST, Routes, SlashCommandBuilder, PermissionFlagsBits } = require("discord.js");
|
|
require("dotenv").config();
|
|
|
|
const commands = [
|
|
new SlashCommandBuilder()
|
|
.setName("ping")
|
|
.setDescription("Replies with Pong!"),
|
|
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: "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").setRequired(false)
|
|
),
|
|
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: "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: "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: "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);
|
|
}
|
|
})(); |