const Commando = require('discord.js-commando') const Discord = require('discord.js') const muteSchema = require('@schemas/mute-schema') const reasons = { SPAMMING: 0.5, ADVERTISING: 0.5, TOXICITY: 2, NSFW: 5, } module.exports = class MuteCommand extends Commando.Command { constructor(client) { super(client, { name: 'mute', group: 'moderation', memberName: 'mute', description: 'Mutes a specified user', userPermissions: [ 'ADMINISTRATOR', 'MANAGE_GUILD', ], argsType: 'multiple', }) } async run(message, args) { const { guild, author: staff } = message if (args.length !== 2) { const wrongSyntaxMute = new Discord.MessageEmbed() .setTitle('ERROR: Incorret syntax') .setDescription(`Correct syntax: ${guild.commandPrefix}mute `) .setColor('#ff0000') message.channel.send(wrongSyntaxMute) return } const target = message.mentions.users.first() if (!target) { const noPingMuteEmbed = new Discord.MessageEmbed() .setTitle('ERROR: Invalid target') .setDescription('No valid user provided') .setColor('#ff0000') message.channel.send(noPingMuteEmbed) return } const reason = args[1].toUpperCase() if (!reasons[reason]) { let validReasons = '' for (const key in reasons) { validReasons += `${key},\n ` } validReasons = validReasons.substr(0, validReasons.length - 3) const noReasonEmbed = new Discord.MessageEmbed() .setTitle('ERROR: Invalid Reason') .setDescription(`Unknown reason, please use one of the following:\n\n${validReasons}`) message.channel.send(noReasonEmbed) return } const previousMutes = await muteSchema.find({ userId: target.id, }) const currentlyMuted = previousMutes.filter((mute) => { return mute.current === true }) if (currentlyMuted.length) { const alreadyMutedEmbed = new Discord.MessageEmbed() .setTitle('ERROR: Cannot mute user') .setDescription('The specified user is already muted') .setColor('#ffa500') message.channel.send(alreadyMutedEmbed) return } let duration = reasons[reason] * (previousMutes.length + 1) const expires = new Date() expires.setHours(expires.getHours() + duration) const mutedRole = guild.roles.cache.find((role) => { return role.name === 'Muted' }) if (!mutedRole) { const noRoleEmbed = new Discord.MessageEmbed() .setTitle('ERROR: Invalid role') .setDescription('Please create a role named **Muted** for the bot to mute users.') .setColor('#ff0000') message.channel.send(noRoleEmbed) return } const targetMember = (await guild.members.fetch()).get(target.id) targetMember.roles.add(mutedRole) await new muteSchema({ userId: target.id, guildId: guild.id, reason, staffId: staff.id, staffTag: staff.tag, expires, current: true, }).save() const replyMuteSuccessEmbed = new Discord.MessageEmbed() .setTitle('SUCCESS') .setDescription(`<@${message.author.id}> has muted <@${target.id}> for "${reason}".\n They will be unmuted in ${duration} hours.`) .setColor('#1be730') message.channel.send(replyMuteSuccessEmbed) } }