const Command = require("../../base/Command.js"), Discord = require("discord.js"), ms = require("ms"); class Mute extends Command { constructor (client) { super(client, { name: "mute", dirname: __dirname, enabled: true, guildOnly: true, aliases: [], memberPermissions: [ "MANAGE_MESSAGES" ], botPermissions: [ "SEND_MESSAGES", "EMBED_LINKS", "MANAGE_CHANNELS" ], nsfw: false, ownerOnly: false, cooldown: 3000 }); } async run (message, args, data) { const member = await this.client.resolveMember(args[0], message.guild); if(!member){ return message.error("moderation/mute:MISSING_MEMBER"); } if(member.id === message.author.id){ return message.error("moderation/ban:YOURSELF"); } const memberPosition = member.roles.highest.position; const moderationPosition = message.member.roles.highest.position; if(message.member.ownerID !== message.author.id && !(moderationPosition > memberPosition)){ return message.error("moderation/ban:SUPERIOR"); } const memberData = await this.client.findOrCreateMember({ id: member.id, guildID: message.guild.id }); const time = args[1]; if(!time || isNaN(ms(time))){ return message.error("misc:INVALID_TIME"); } let reason = args.slice(2).join(" "); if(!reason){ reason = message.translate("misc:NO_REASON_PROVIDED"); } message.guild.channels.cache.forEach((channel) => { channel.updateOverwrite(member.id, { SEND_MESSAGES: false, ADD_REACTIONS: false, CONNECT: false }).catch(() => {}); }); member.send(message.translate("moderation/mute:MUTED_DM", { username: member.user.username, server: message.guild.name, moderator: message.author.tag, time, reason })); message.success("moderation/mute:MUTED", { username: member.user.tag, server: message.guild.name, moderator: message.author.tag, time, reason }); data.guild.casesCount++; const caseInfo = { channel: message.channel.id, moderator: message.author.id, date: Date.now(), type: "mute", case: data.guild.casesCount, reason, time }; memberData.mute.muted = true; memberData.mute.endDate = Date.now()+ms(time); memberData.mute.case = data.guild.casesCount; memberData.sanctions.push(caseInfo); memberData.markModified("sanctions"); memberData.markModified("mute"); await memberData.save(); await data.guild.save(); this.client.databaseCache.mutedUsers.set(`${member.id}${message.guild.id}`, memberData); if(data.guild.plugins.modlogs){ const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); if(!channel) return; const embed = new Discord.MessageEmbed() .setAuthor(message.translate("moderation/mute:CASE", { count: data.guild.casesCount })) .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true) .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true) .addField(message.translate("common:REASON"), reason, true) .addField(message.translate("common:DURATION"), time, true) .addField(message.translate("common:EXPIRY"), message.printDate(new Date(Date.now()+ms(time))), true) .setColor("#f44271"); channel.send(embed); } } } module.exports = Mute;