146 lines
7.4 KiB
JavaScript
146 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[0] ?
|
|
message.member.roles.some(role => {
|
|
const requiredRoleIds = commandfile.config.roles.map(roleName => botConfig.roles[0][roleName.toLowerCase()]);
|
|
return requiredRoleIds.includes(role);
|
|
}) : false;
|
|
|
|
// Command availability check (skip for DMs)
|
|
if (!commandfile.config.available && !hasRequiredRole && !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);
|
|
}
|
|
}
|
|
}
|