const Component = require('./Component.js'); const { stripIndents } = require('common-tags'); class Command extends Component { constructor(manager, opts = {}) { if(!opts) return null; super(manager, { id: opts.name, type: 'command', disabled: opts.disabled || false, guarded: opts.guarded || false }); this.manager = manager; this.name = opts.name; this.module = opts.module; this.aliases = opts.aliases || []; this.description = `C_${opts.name.toUpperCase()}_DESCRIPTION`; this.usage = opts.usage || ''; this.examples = opts.examples || []; this.rawExamples = Boolean(opts.rawExamples); this.tags = opts.tags || []; this.restricted = Boolean(opts.restricted); this.showUsage = Boolean(opts.showUsage); this.guildOnly = Boolean(opts.guildOnly); this.archivable = opts.archivable === undefined ? true : Boolean(opts.archivable); this.arguments = opts.arguments || []; this.clientPermissions = opts.clientPermissions || []; this.memberPermissions = opts.memberPermissions || []; this.permissionRequired = opts.permissionRequired || opts.memberPermissions?.length > 0; this.throttling = opts.throttling || { usages: 5, duration: 10 }; this._throttles = new Map(); this._invokes = { success: 0, fail: 0 }; } execute() { throw new Error(`${this.resolveable} is missing an execute function.`); } async checkPermissions() { //NOTE: Todo (move from permissions inhibitor) } usageEmbed(message, verbose = false) { const { guild } = message; const type = guild._settings.permissionType; const prefix = guild?.prefix || this.client.prefix; const fields = []; if (this.examples.length) { fields.push({ name: `》 ${message.format('GENERAL_EXAMPLES')}`, value: this.examples.map((e) => this.rawExamples ? `\`${prefix}${e}\`` : `\`${prefix}${this.name} ${e}\``).join('\n') }); } if (this.aliases.length && verbose) { fields.push({ name: `》 ${message.format('GENERAL_ALIASES')}`, value: this.aliases.join(', ') }); } if (this.arguments.length && verbose) { fields.push({ name: `》 ${message.format('GENERAL_ARGUMENTS')}`, value: this.arguments.map((a) => `\`${a.types.length === 1 && a.types.includes('FLAG') ? '--' : ''}${a.name}${a.usage ? ` ${a.usage}` : ''}\`: ${message.format(`A_${a.name.toUpperCase()}_${this.name.toUpperCase()}_DESCRIPTION`)}`).join('\n') }); } if (this.permissionRequired) { let required = []; if (type === 'discord') required = this.memberPermissions; else if (type === 'grant') required = [this.resolveable]; else required = [this.resolveable, ...this.memberPermissions]; fields.push({ name: `》 ${message.format('GENERAL_PERMISSIONS')}`, value: `${message.format('GENERAL_PERMISSION_TYPE', { required: required.join('`, `') })}` }); } return { author: { name: `${this.name}${this.module ? ` (${this.module.resolveable})` : ''}` }, description: stripIndents`\`${prefix}${this.name}${this.usage ? ` ${this.usage}` : ''}\`${this.guildOnly ? ' *(guild-only)*' : ''} ${message.format(this.description)}`, fields }; } get moduleResolveable() { return `${this.module.id}:${this.id}`; } } module.exports = Command;