Zonies-Bot/commands/register.js
2025-05-12 17:45:02 -05:00

172 lines
7.2 KiB
JavaScript

const axios = require(`axios`);
const path = require('path');
const botConfig = require(path.join(__dirname, '../botconfig.json'));
const { generateUniqueId } = require(path.join(__dirname, '../functions/randomStr'));
const https = require('https');
const Invites = require(path.join(__dirname, '../models/registerInvite'));
const Embed = require(path.join(__dirname, '../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(botConfig.roles[0].staff)) staffRoles.is_staff = 1;
if (memberRoles.includes(botConfig.roles[0].mod)) staffRoles.is_mod = 1;
if (memberRoles.includes(botConfig.roles[0].jrmod)) staffRoles.is_jrmod = 1;
if (memberRoles.includes(botConfig.roles[0].uploader)) staffRoles.is_uploader = 1;
if (memberRoles.includes(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} <username> <email> <f95zone profile url>\`\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 <invite> <username> <email> <f95zone profile url>\``
});
}
// 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}\``
});
}
},
};