Zonies-Bot/events/messageCreate.js
2025-05-12 17:45:02 -05:00

147 lines
7.4 KiB
JavaScript

const path = require("path");
const Embed = require(path.join(__dirname, "../functions/embed"));
const Collector = require(path.join(__dirname, "../functions/messageCollector"));
const EditCollector = require(path.join(__dirname, "../functions/messageEdit"));
const CommandDB = require(path.join(__dirname, "../models/commands"));
const { isJson } = require(path.join(__dirname, "../functions/randomStr"));
const botConfig = require(path.join(__dirname, "../botconfig.json"));
module.exports = async (client, message) => {
// Early return checks
if (!message || !message.content || message.author.bot) return;
const isDM = message.channel.type === "DirectMessage";
// Get guild settings (if not DM)
const db = isDM ? { prefix: client.botConfig.prefix, language: 'en' } : await client.database.getGuild(message.server.id, true);
// Check if message starts with prefix
if (!message.content.startsWith(db.prefix)) {
// Handle bot mention
if (message.content && (new RegExp(`^(<@!?${client.user.id}>)`)).test(message.content)) {
const mention = new Embed()
.setColor("#A52F05")
.setTitle(client.user.username)
.setDescription(`${client.translate.get(db.language, "Events.messageCreate.prefix")} \`${db.prefix}\`\n${client.translate.get(db.language, "Events.messageCreate.prefix2")} \`${db.prefix}help\``)
return message.reply({
embeds: [mention]
}, false).catch(() => { return });
}
return;
}
let args = message.content.slice(db.prefix.length).trim().split(/ +/g);
let cmd = args.shift().toLowerCase();
// Handle collectors
if (client.messageCollector.has(message.authorId) && client.messageCollector.get(message.authorId).channelId === message.channelId && !client.messageCollector.get(message.authorId).messageId) return await Collector(client, message, db);
if (client.messageEdit.has(message.authorId) && client.messageEdit.get(message.authorId).channelId === message.channelId && !client.messageEdit.get(message.authorId).messageId) return await EditCollector(client, message, db);
// Handle custom commands
let check = await CommandDB.findOne({ name: cmd }).select("name").lean();
if (check) {
CommandDB.findOne({ name: cmd }).then((data) => {
if (isJson(data.content)) {
let items = JSON.parse(data.content);
let item = items[Math.floor(Math.random() * items.length)];
return message.reply(item);
}
return message.reply(data.content);
});
}
// Command handling
let commandfile = client.commands.get(cmd) || client.commands.get(client.aliases.get(cmd));
if (commandfile) {
// DM Check - if command doesn't allow DMs and we're in a DM, return
if (isDM && !commandfile.config.dm) {
return message.reply({
embeds: [new Embed()
.setColor("#FF0000")
.setDescription(client.translate.get(db.language, "Events.messageCreate.noDM"))]
}, false).catch(() => { return });
}
// Permission checks for non-DM messages
if (!isDM) {
// Check bot permissions first
const canSendMessage = message.channel.havePermission("SendMessage");
const canReact = message.channel.havePermission("React");
if (!canSendMessage) {
return message.member.user.openDM().then((dm) => {
dm.sendMessage(`${client.translate.get(db.language, "Events.messageCreate.unable")} <#${message.channelId}>. ${client.translate.get(db.language, "Events.messageCreate.contact")}.`)
}).catch(() => { return });
}
if (!canReact) {
return message.reply(`${client.translate.get(db.language, "Events.messageCreate.noPerms")}. ${client.translate.get(db.language, "Events.messageCreate.contact")}.`, false).catch(() => { return });
}
// Check if user has required roles
const hasRequiredRole = commandfile.config.roles && message.member.roles && botConfig.roles && botConfig.roles.length > 0 ?
message.member.roles.some(role => {
const roleMappings = botConfig.roles[0];
return Object.values(roleMappings).includes(role);
}) : false;
// Command availability check (skip for DMs)
if (!commandfile.config.available && !hasRequiredRole && !client.botConfig.owners.includes(message.authorId)) {
return message.reply({
embeds: [new Embed()
.setColor("#FF0000")
.setDescription(client.translate.get(db.language, "Events.messageCreate.unavail"))]
}, false).catch(() => { return });
}
// Permission and role checks (skip for DMs)
const needsPermissionCheck = commandfile.config.permissions && commandfile.config.permissions.length > 0;
const needsRoleCheck = commandfile.config.roles && commandfile.config.roles.length > 0;
if (needsPermissionCheck || needsRoleCheck) {
let hasPermission = true;
if (needsPermissionCheck) {
try {
hasPermission = message.member.hasPermission(commandfile.config.permissions[0]);
} catch (err) {
hasPermission = false;
}
}
if (!hasPermission && !hasRequiredRole && !client.botConfig.owners.includes(message.authorId)) {
return message.reply({
embeds: [new Embed()
.setColor("#FF0000")
.setDescription(`${client.translate.get(db.language, "Events.messageCreate.perms")}.\n${needsPermissionCheck ? `${client.translate.get(db.language, "Events.messageCreate.perms2")}: [${commandfile.config.permissions[0]}]` : ''}`)]
}, false).catch(() => { return });
}
}
}
// Cooldown handling
const used = client.used.get(`${message.authorId}-${cmd.toLowerCase()}`);
if (used) {
if (client.timeout.get(`${message.authorId}-${cmd.toLowerCase()}`)) return;
client.timeout.set(`${message.authorId}-${cmd.toLowerCase()}`, used);
setTimeout(() => client.timeout.delete(`${message.authorId}-${cmd.toLowerCase()}`), used);
const uremaining = client.functions.get("fetchTime")(used, client, db.language)
const embed = new Embed()
.setColor("#A52F05")
.setDescription(`<@${message.authorId}>, ${client.translate.get(db.language, "Events.messageCreate.wait")} \`${uremaining}\` ${client.translate.get(db.language, "Events.messageCreate.wait2")} \`${cmd.toLowerCase()}\` ${client.translate.get(db.language, "Events.messageCreate.wait3")}.`)
return message.reply({ embeds: [embed] }, false).catch(() => { return })
} else {
let cooldown = commandfile.config.cooldown;
client.used.set(`${message.authorId}-${cmd.toLowerCase()}`, cooldown);
setTimeout(() => client.used.delete(`${message.authorId}-${cmd.toLowerCase()}`), cooldown);
return commandfile.run(client, message, args, db);
}
}
}