diff --git a/index.js b/index.js index 435b056..9a6c8a3 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,7 @@ -const { Client, GatewayIntentBits, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); -const fs = require('fs'); +const { Client, GatewayIntentBits, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, REST, Routes, SlashCommandBuilder } = require('discord.js'); const axios = require('axios'); require('dotenv').config(); -// Add this at the top of your file console.log('Starting bot...'); const client = new Client({ @@ -14,7 +12,6 @@ const client = new Client({ ] }); -// Add this just before the login call console.log('Attempting to log in...'); client.once('ready', () => { @@ -27,16 +24,41 @@ client.login(process.env.BOT_TOKEN).then(() => { console.error('Login failed:', error); }); -// Read the users.json file -const rawData = fs.readFileSync('users.json'); -const rawUsers = JSON.parse(rawData); +// Remove the second login call +// client.login(process.env.BOT_TOKEN); -// Remove user_id and player_id from each user object -const users = rawUsers.map(({ user_id, player_id, ...rest }) => rest); +// Register Slash Commands +const commands = [ + new SlashCommandBuilder() + .setName('ping') + .setDescription('Replies with Pong!'), + new SlashCommandBuilder() + .setName('finduser') + .setDescription('Find a user by username') + .addStringOption(option => + option.setName('username') + .setDescription('The username to search for') + .setRequired(true)) +]; -// Now you can use the users array in your bot logic -console.log(`Loaded ${users.length} users`); +const rest = new REST({ version: '10' }).setToken(process.env.BOT_TOKEN); +(async () => { + try { + console.log('Started refreshing application (/) commands.'); + + await rest.put( + Routes.applicationCommands(client.user.id), + { body: commands }, + ); + + console.log('Successfully reloaded application (/) commands.'); + } catch (error) { + console.error(error); + } +})(); + +// Function to fetch user data async function findUserByUsername(username) { try { const response = await axios.get(`https://www.vrbattles.gg/api/get_player_data_by_username/${username}`); @@ -46,25 +68,32 @@ async function findUserByUsername(username) { return null; } } + +// Function to get badge image URL function getBadgeImageUrl(badgeName) { + if (!badgeName) { + return 'https://www.vrbattles.gg/assets/images/badges/xp_badges/A/BADGE_A1_72p.png'; + } + badgeName = badgeName.toUpperCase().replace(/ /g, '_'); let badgeUrl = 'https://www.vrbattles.gg/assets/images/badges/xp_badges/'; - if (badgeName.startsWith('BADGE_A')) { + if (badgeName.startsWith('A')) { badgeUrl += 'A/'; - } else if (badgeName.startsWith('BADGE_B')) { + } else if (badgeName.startsWith('B')) { badgeUrl += 'B/'; - } else if (badgeName.startsWith('BADGE_C')) { + } else if (badgeName.startsWith('C')) { badgeUrl += 'C/'; } else { - // Default to 'A' if badge name doesn't match the expected format badgeUrl += 'A/'; } badgeUrl += `BADGE_${badgeName}_72p.png`; - console.log(badgeUrl); + console.log('Badge URL:', badgeUrl); return badgeUrl; } + +// Interaction handler client.on('interactionCreate', async interaction => { if (!interaction.isCommand()) return; @@ -80,11 +109,15 @@ client.on('interactionCreate', async interaction => { const userData = await findUserByUsername(username); if (userData && userData.success) { let playerData; - try { - playerData = JSON.parse(userData.player_data); - } catch (error) { - await interaction.editReply('Error parsing player data.'); - return; + if (typeof userData.player_data === 'string') { + try { + playerData = JSON.parse(userData.player_data); + } catch (error) { + await interaction.editReply('Error parsing player data.'); + return; + } + } else { + playerData = userData.player_data; } if (!playerData || !playerData.profile) { @@ -92,25 +125,21 @@ client.on('interactionCreate', async interaction => { return; } - const user = playerData.profile; + const user = playerData.profile || {}; const badgeImageUrl = getBadgeImageUrl(user.current_level_badge); const embed = new EmbedBuilder() - .setTitle(`User: ${playerData.username}`) + .setTitle(`User: ${playerData.username || 'Unknown'}`) .setDescription(`Bio: ${user.bio || 'No bio available'}`) .addFields( { name: 'Country', value: user.country || 'Unknown', inline: true }, { name: 'Rank', value: user.rank || 'Unranked', inline: true }, - { name: 'Level', value: user.level.toString(), inline: true }, + { name: 'Level', value: user.level?.toString() || 'N/A', inline: true }, { name: 'Prestige', value: user.prestige?.toString() || '0', inline: true }, - - { name: 'Total XP', value: user.xp.toString(), inline: true } + { name: 'Total XP', value: user.xp?.toString() || '0', inline: true } ) - .setImage(badgeImageUrl) - .addFields( - { name: 'XP Badge', value: ' ' } - ) + .addFields({ name: 'XP Badge', value: ' ' }) .setColor('#0099ff'); if (user.avatar) { @@ -131,10 +160,7 @@ client.on('interactionCreate', async interaction => { await interaction.editReply({ embeds: [embed], components: [row] }); } else { - await interaction.editReply('User not found or error occurred while fetching data.'); + await interaction.editReply('User not found or an error occurred while fetching data.'); } } -}); - -// Use the bot token here -client.login(process.env.BOT_TOKEN); \ No newline at end of file +}); \ No newline at end of file