// index.js const { Client, GatewayIntentBits, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, } = require('discord.js'); const axios = require('axios'); require('dotenv').config(); console.log('Starting bot...'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, ], }); console.log('Attempting to log in...'); client.once('ready', () => { console.log(`Logged in as ${client.user.tag}!`); }); client.login(process.env.BOT_TOKEN).then(() => { console.log('Login successful'); }).catch((error) => { console.error('Login failed:', error); }); // Handle client errors client.on('error', (error) => { console.error('The client encountered an error:', error); }); // Function to fetch user data from the API async function findUserByUsername(username) { try { const response = await axios.get( `https://www.vrbattles.gg/api/get_player_data_by_username/${encodeURIComponent( username )}` ); return response.data; } catch (error) { console.error('Error fetching user data:', error); 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('A')) { badgeUrl += 'A/'; } else if (badgeName.startsWith('B')) { badgeUrl += 'B/'; } else if (badgeName.startsWith('C')) { badgeUrl += 'C/'; } else { badgeUrl += 'A/'; } badgeUrl += `BADGE_${badgeName}_72p.png`; return badgeUrl; } // Interaction handler client.on('interactionCreate', async (interaction) => { if (!interaction.isCommand()) return; try { console.log(`Interaction received: ${interaction.id} by ${interaction.user.tag}`); const { commandName } = interaction; if (commandName === 'ping') { await interaction.reply('Pong!'); } else if (commandName === 'finduser') { await interaction.deferReply(); // Defer immediately const username = interaction.options.getString('username'); const gameFilter = interaction.options.getString('game'); // Fetch data from the API using the provided username const userData = await findUserByUsername(username); if (!userData) { await interaction.editReply('An error occurred while fetching data.'); return; } let playerData; try { if (typeof userData.player_data === 'string') { playerData = JSON.parse(userData.player_data); } else { playerData = userData.player_data; } } catch (parseError) { console.error('Error parsing player data:', parseError); await interaction.editReply('Error parsing player data.'); return; } if (!playerData || !playerData.profile) { await interaction.editReply( 'User found but profile data is unavailable. They may need to log in to VRBattles to update their profile.' ); return; } const user = playerData.profile || {}; const badgeImageUrl = getBadgeImageUrl(user.current_level_badge); // Declare 'embed' at the appropriate scope let embed; // Create the embed builder embed = new EmbedBuilder() .setTitle(`User: ${playerData.username || 'Unknown'}`) .setDescription(`Bio: ${user.bio || 'No bio available'}`) .setColor('#0099ff'); // Rest of your code... // Add action buttons const row = new ActionRowBuilder().addComponents( new ButtonBuilder() .setLabel('🔵 View Profile') .setStyle(ButtonStyle.Link) .setURL(`https://www.vrbattles.gg/profile/${playerData.username}`), new ButtonBuilder() .setLabel('🟡 Join Discord') .setStyle(ButtonStyle.Link) .setURL('https://discord.gg/j3DKVATPGQ') // Replace with your Discord invite URL ); // Ensure 'embed' is defined before using it if (embed) { await interaction.editReply({ embeds: [embed], components: [row] }); } else { await interaction.editReply('No data available to display.'); } } } catch (error) { console.error('Error handling interaction:', error); try { if (interaction.deferred || interaction.replied) { await interaction.followUp({ content: 'An error occurred while processing your request.', ephemeral: true }); } else { await interaction.reply({ content: 'An error occurred while processing your request.', ephemeral: true }); } } catch (replyError) { console.error('Error sending error message:', replyError); } } });