Merge pull request #3 from Fragmint-git/dev

Update CommandHandler.js
This commit is contained in:
VinceC
2025-01-04 11:17:20 -06:00
committed by GitHub

View File

@@ -1,4 +1,4 @@
const { ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
const { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } = require('discord.js');
const EmbedBuilders = require('../utils/embedBuilders');
class CommandHandler {
@@ -206,8 +206,44 @@ class CommandHandler {
const teamMessage = isOnTeam ?
`\nThey are on a team for ${gameFilter} but haven't played any matches yet.` :
'';
// Create a basic embed with user info
const basicEmbed = new EmbedBuilder()
.setTitle(`User: ${playerData.username || 'Unknown'}`)
.setDescription(playerData.profile?.bio || 'No bio available')
.setColor('#0099ff')
.setImage('https://www.vrbattles.gg/assets/images/Qubi/vrwearcubesatad.png');
// Add avatar if available
if (playerData.profile?.avatar) {
basicEmbed.setThumbnail(
`https://www.vrbattles.gg/assets/uploads/profile/${playerData.profile.avatar}`
);
}
// Add basic profile fields
const profileFields = [];
const profile = playerData.profile || {};
if (profile.country) profileFields.push({ name: 'Country', value: profile.country, inline: true });
if (profile.level) profileFields.push({ name: 'Level', value: profile.level.toString(), inline: true });
if (profile.xp) profileFields.push({ name: 'Total XP', value: profile.xp.toString(), inline: true });
if (profile.prestige) profileFields.push({ name: 'Prestige', value: profile.prestige.toString(), inline: true });
if (profileFields.length > 0) {
basicEmbed.addFields(profileFields);
}
// Add message about no game stats
basicEmbed.addFields({
name: `${gameFilter} Status`,
value: `❌ No match history found for ${gameFilter}${teamMessage}`
});
const row = this.createActionRow(playerData.username);
await interaction.editReply({
content: `✅ User found, but they haven't played ${gameFilter} yet.${teamMessage}`
embeds: [basicEmbed],
components: [row]
});
return;
}
@@ -281,21 +317,22 @@ class CommandHandler {
// Input validation
if (!teamName || typeof teamName !== 'string') {
await interaction.editReply({
content: '❌ Invalid team name provided.'
content: '❌ Invalid team name provided.',
ephemeral: false
});
return;
}
// Enhanced sanitization - only allow alphanumeric characters, spaces, and specific symbols
// Limit the length to prevent buffer overflow attacks
// Enhanced sanitization
const sanitizedTeamName = teamName
.replace(/[^a-zA-Z0-9\s\-_.]/g, '') // Remove any characters that aren't alphanumeric, space, hyphen, underscore, or period
.replace(/[^a-zA-Z0-9\s\-_.]/g, '')
.trim()
.slice(0, 100); // Limit length to 100 characters
.slice(0, 100);
if (!sanitizedTeamName) {
await interaction.editReply({
content: '❌ Team name must contain valid characters (letters, numbers, spaces, hyphens, underscores, or periods).'
content: '❌ Team name must contain valid characters (letters, numbers, spaces, hyphens, underscores, or periods).',
ephemeral: false
});
return;
}
@@ -309,12 +346,12 @@ class CommandHandler {
timestamp: new Date().toISOString()
});
// Game filter is pre-validated by Discord's slash command choices
const teamData = await this.playerService.findTeamByName(sanitizedTeamName, gameFilter);
if (!teamData || !teamData.success || !teamData.teams || teamData.teams.length === 0) {
await interaction.editReply({
content: '❌ No teams found matching your search criteria.'
content: '❌ No teams found matching your search criteria.',
ephemeral: false
});
return;
}
@@ -323,7 +360,8 @@ class CommandHandler {
await interaction.editReply({
embeds: embeds,
components: []
components: [],
ephemeral: false
});
} catch (error) {
this.logger.error('Error in handleFindTeam:', {
@@ -334,7 +372,8 @@ class CommandHandler {
timestamp: new Date().toISOString()
});
await interaction.editReply({
content: '❌ An error occurred while searching for teams.'
content: '❌ An error occurred while searching for teams.',
ephemeral: false
});
}
}
@@ -344,11 +383,7 @@ class CommandHandler {
new ButtonBuilder()
.setLabel('🔵 View Profile')
.setStyle(ButtonStyle.Link)
.setURL(`https://www.vrbattles.gg/profile/${username}`),
new ButtonBuilder()
.setLabel('🟡 Join Main Discord')
.setStyle(ButtonStyle.Link)
.setURL('https://discord.gg/j3DKVATPGQ')
.setURL(`https://www.vrbattles.gg/profile/${username}`)
);
}
}