const axios = require(`axios`); const botConfig = require('../botconfig.json'); const { generateUniqueId } = require('../functions/randomStr'); const https = require('https'); const Invites = require('../models/registerInvite'); const Embed = require('../functions/embed'); // Create axios instance outside of module.exports const makeRequest = axios.create({ baseURL: `https://rule7.zonies.xyz/api/v1`, headers: { "Authorization": `Bearer ${botConfig.rule7.apiKey}` }, httpsAgent: new https.Agent({ rejectUnauthorized: false }) }); module.exports = { config: { name: `register`, usage: true, cooldown: 10000, available: true, permissions: [''], roles: ['staff', 'uploader', 'jrmod', 'mod'], aliases: ["reg"], dm: true }, run: async (client, message, args, db) => { try { // If not in DM, check for permissions and roles if (message.channel.type !== 'DirectMessage') { // Check if user has any of the required roles const hasRequiredRole = message.member.roles.some(role => module.exports.config.roles.includes(role.toLowerCase()) ); if (!hasRequiredRole && !client.config.owners.includes(message.authorId)) { return message.reply({ embeds: [ new Embed() .setColor("#FF0000") .setDescription(`You don't have the required roles to use this command.`) ] }); } } // Check if the command is used in a DM if (message.channel.type !== 'DirectMessage') { const inviteCode = generateUniqueId(); const staffRoles = { is_staff: 0, is_mod: 0, is_jrmod: 0, is_uploader: 0, is_jruploader: 0 } let memberRoles = message.member.roles; // Set staff role values based on member's roles if (memberRoles.includes(client.botConfig.roles[0].staff)) staffRoles.is_staff = 1; if (memberRoles.includes(client.botConfig.roles[0].mod)) staffRoles.is_mod = 1; if (memberRoles.includes(client.botConfig.roles[0].jrmod)) staffRoles.is_jrmod = 1; if (memberRoles.includes(client.botConfig.roles[0].uploader)) staffRoles.is_uploader = 1; if (memberRoles.includes(client.botConfig.roles[0].jruploader)) staffRoles.is_jruploader = 1; const registerInvite = new Invites({ userId: message.author.id, invite: inviteCode, staffRoles, createdAt: Date.now() }); await registerInvite.save(); return message.reply({ content: `Run this command in a DM to the bot and use this invite code: \`${inviteCode}\`\n **Usage:** \`!register ${inviteCode} \`\n **Note: This invite code will expire in 10 minutes.**` }); } const [invite, username, email, profileUrl] = args; if (!invite || !username || !email || !profileUrl) { return message.reply({ content: `[REG3] Please provide a invite code, username, email, and f95zone profile url. \n\n**Usage:** \`${client.prefix}register \`` }); } // DM flow - Use client.database instead of direct model const registerInvite = await Invites.findOne({ invite: invite }); if (!registerInvite) { return message.reply({ content: `[REG1] You don't have an invite code. Please run the command outside of DMs.` }); } if (registerInvite.createdAt + 10 * 60 * 1000 < Date.now()) { await registerInvite.deleteOne({ invite: invite }); return message.reply({ content: `[REG2] Your invite code has expired. Please run the command outside of DMs.` }); } if (invite !== registerInvite.invite) { return message.reply({ content: `[REG4] Invalid invite code. Please run the command outside of DMs.` }); } let f95zoneId = profileUrl.split('/')[4]; f95zoneId = f95zoneId.split('.')[1]; try { const { data } = await makeRequest.post(`/bot/register`, { username, email, f95_id: f95zoneId, is_staff: registerInvite.staffRoles.is_staff, is_mod: registerInvite.staffRoles.is_mod, is_jrmod: registerInvite.staffRoles.is_jrmod, is_uploader: registerInvite.staffRoles.is_uploader, is_jruploader: registerInvite.staffRoles.is_jruploader }); if (data.status === 'success') { await registerInvite.deleteOne({ invite: invite }); return message.reply({ content: `[REG5] You have been registered. Please check your email for verification.` }); } else if (data.status === 'invalid_email') { return message.reply({ content: `[REG5.1] An error occurred during registration. ${data.msg}` }); } else if (data.status === 'username_exists') { return message.reply({ content: `[REG5.2] An error occurred during registration. ${data.msg}` }); } else if (data.status === 'invalid_f95_id') { return message.reply({ content: `[REG5.3] An error occurred during registration. ${data.msg}` }); } else if (data.status === 'email_exists') { return message.reply({ content: `[REG5.4] An error occurred during registration. ${data.msg}` }); } else if (data.status === 'error') { return message.reply({ content: `[REG5.5] An error occurred during registration. ${data.msg}` }); } } catch (apiError) { return message.reply({ content: `[REG6] An error occurred during registration. Please try again later.\n\`${apiError}\`` }); } } catch (error) { console.error('Registration Error:', error); return message.reply({ content: `[REG7] An unexpected error occurred. Please try again later.\n\`${error}\`` }); } }, };