/* eslint-disable require-jsdoc */ /* eslint-disable max-len */ const path = require('path'); const {MessageEmbed} = require('discord.js'); function inject(bot, dcclient, config) { const loadFiles = require('../util/load_files'); const channeldc = dcclient.channels.cache.get(config.discord.servers[bot.options.host]); bot.command_handler = {}; bot.command_handler.commands = {}; bot.command_handler.reload = function() { bot.command_handler.commands = loadFiles(path.join(__dirname, config.commandsDir)); }; bot.command_handler.reload(); bot.command_handler.main = function(prefix, username, usernameraw, message, sender, channeldc, hash, ownerhash, selector) { bot.command_handler.reload(); let raw; let command; const discord = message.content ? true : false; discord ? raw = message.content.substring(prefix.length) : raw = message.substring(prefix.length); const [commandName, ...args] = raw.split(' '); command = bot.command_handler.commands.find((command) => command.name === commandName.toLowerCase()); try { const alias = bot.command_handler.commands.find((command) => command.alias.includes(commandName.toLowerCase())); if (alias) command = bot.command_handler.commands.find((command) => command.alias.includes(commandName.toLowerCase())); if (prefix === '*' && message.endsWith('*') && message !== '*') return; if (!command) throw new Error(`Unknown command: "${commandName}"`); if (command.name !== 'validate' && command.trusted === 1) { if (discord && !message.member?.roles?.cache?.some((role) => role.name === 'Trusted')) throw new Error('You\'re not in the trusted role!'); else if (!discord && args[0] !== hash) throw new Error(`Invalid hash`); } else if (command.name !== 'validate' && command.trusted === 2) { if (discord && !message.member?.roles?.cache?.some((role) => role.name === 'Trusted')) throw new Error('You\'re not in the trusted role!'); else if (!discord && args[0] !== hash) throw new Error(`Invalid OwnerHash`); } if (prefix === config.discord.prefix) { if (!command.discordExecute) throw new Error('This command is not yet supported on discord!'); command.discordExecute(bot, username, usernameraw, sender, prefix, args, channeldc, message, config); } else { command.execute(bot, username, usernameraw, sender, prefix, args, config, hash, ownerhash, selector); } } catch (e) { if (prefix === config.discord.prefix) { const Embed = new MessageEmbed() .setColor('#FF0000') .setTitle('Error') .setDescription(`\`\`\`${e}\`\`\``); channeldc.send({embeds: [Embed]}); } else { bot.tellraw(selector, {text: String(e), color: 'red'}); } } }; bot.command_handler.run = function(username, usernameraw, message, sender, channeldc, hash, ownerhash, selector = '@a') { for (const prefix of config.prefixes) { if (!message.startsWith(prefix)) continue; bot.command_handler.main(prefix, username, usernameraw, message, sender, channeldc, hash, ownerhash, selector); } }; bot.on('message', async (_username, _message, _sender) => { // try catch cuz TypeError: Cannot read properties of undefined (reading 'replace') try { const usernameraw = _username.replace(/§.?/g, ''); const sender = _sender !== '00000000-0000-0000-0000-000000000000' ? _sender : bot.playersAddedPlayers[usernameraw]; let username; if (!bot.getplayerusername[sender]) username = usernameraw; else username = bot.getplayerusername[sender]; const message = _message.replace(/* /§r/g */ /§.?/g, '')/* .replace(/§/g, '')*/; bot.command_handler.run(username, usernameraw, message, sender, channeldc, bot.hash, bot.ownerHash); } catch (e) { bot.console.error(e); } }); bot.on('cspy', async function(_username, _message) { const username = _username.replace(/§.?/g, ''); const message = _message.replace(/§.?/g, ''); const sender = bot.playersAddedPlayers[username]; bot.command_handler.run(username, username, message, sender, channeldc, bot.hash, bot.ownerHash, username); }); function handleDiscordMessages(message) { try { // ignores the message that comes from the bot itself if (message.author.id === dcclient.user.id) return; // only receive messages in SPECIFIC channel if (message.channel.id !== channeldc.id) return; if (!message.content.startsWith(config.discord.prefix)) return; bot.command_handler.main(config.discord.prefix, message.member.displayName, message.member.displayName, message, 'no sender for discord', channeldc); } catch (e) { return; }; } bot.once('end', () => { dcclient.off('messageCreate', handleDiscordMessages); }); dcclient.on('messageCreate', handleDiscordMessages); }; module.exports = {inject};