const { Setting } = require('../../../../interfaces/'); const CONSTANTS = { INFRACTIONS: ['NOTE', 'WARN', 'MUTE', 'UNMUTE', 'LOCKDOWN', 'UNLOCKDOWN', 'KICK', 'SOFTBAN', 'BAN', 'UNBAN', 'VCMUTE', 'VCUNMUTE', 'VCKICK', 'VCBAN', 'VCUNBAN', 'PRUNE', 'SLOWMODE', 'DEHOIST', 'ADDROLE', 'REMOVEROLE', 'NICKNAME'] } class ModerationLogsSetting extends Setting { constructor(client) { super(client, { name: 'moderationLog', module: 'moderation', aliases: [ 'moderationLogs', 'modLog', 'modLogs' ], usage: ' [value..]', resolve: 'GUILD', examples: [ 'modlog ', 'modlog #moderation-log', 'modlog reset', 'modlog off' ], default: { moderationLog: { channel: null, infractions: ['WARN','MUTE','UNMUTE','LOCKDOWN','UNLOCKDOWN','KICK','SOFTBAN','BAN','UNBAN','VCMUTE','VCUNMUTE','VCKICK','VCBAN','VCUNBAN'] } } }); } async handle(message, params) { const setting = message.guild._settings.moderationLog; const response = await this.resolveMethod(params.map((p) => p.toUpperCase()), CONSTANTS.INFRACTIONS, setting.infractions); if (response) { console.log(response); if (params.length < 2 && response.method !== 'list') return { msg: message.format('MISSING_ARGS'), error: true } let index; if (response.method === 'add') { setting.infractions = response.result; index = 'S_MODERATIONLOG_ADD'; } else if (response.method === 'remove') { setting.infractions = response.result; index = 'S_MODERATIONLOG_REMOVE'; } else if (response.method === 'list') { return { msg: message.format('S_MODERATIONLOG_LIST', { list: setting.infractions.join('`, `') }) } } else if (response.method === 'off') { setting.channel = null; index = 'S_MODERATIONLOG_OFF' } else { return { msg: message.format('ERR_INVALID_METHOD', { method: response.method }), error: true } } if(response.changed.length) await message.guild._updateSettings({ [this.index]: setting }); return { msg: message.format(index, { list: response.changed.length ? response.changed.join('`, `') : 'N/A' }) }; } else { let [channel] = params; channel = await message.guild.resolveChannel(channel); if (!channel) return { msg: message.format('S_MODERATIONLOG_CHANNEL404', { val: params[0] }), error: true }; if(channel.type !== 'text') return { error: true, msg: message.format('ERR_CHANNEL_TYPE', { type: channel.type }) }; const perms = channel.permissionsFor(message.guild.me); const missingPerms = []; if(!perms.has('SEND_MESSAGES')) missingPerms.push('SEND_MESSAGES'); if(!perms.has('VIEW_CHANNEL')) missingPerms.push('VIEW_CHANNEL'); if(missingPerms.length) return { error: true, msg: message.format('ERR_CHANNEL_PERMS', { channel: channel.name, perms: missingPerms.join(', ') }) }; await message.guild._updateSettings({ [this.index]: { ...setting, channel: channel.id, }}); return { msg: message.format('S_MODERATIONLOG_CHANNEL_SUCCESS', { channel: channel.name }), error: false }; } } async fields(guild) { const setting = guild._settings[this.index]; return [ { name: '》Channel', value: await guild.resolveChannel(setting?.channel) || '`N/A`', inline: true }, { name: '》Logged Infractions', value: setting?.infractions.map(i=>`\`${i}\``).join(', ') || '`N/A`', inline: true } ]; } } module.exports = ModerationLogsSetting;