117 lines
3.6 KiB
JavaScript
117 lines
3.6 KiB
JavaScript
const { Structures } = require('discord.js');
|
|
|
|
const escapeRegex = require('escape-string-regexp');
|
|
const emojis = require('../../util/emojis.json');
|
|
|
|
const { Util } = require('../../util/');
|
|
|
|
const Message = Structures.extend('Message', (Message) => {
|
|
|
|
class ExtendedMessage extends Message {
|
|
|
|
constructor(...args) {
|
|
|
|
super(...args);
|
|
|
|
this.command = null; //Will set to command if the message induces a command.
|
|
this.args = null;
|
|
this.parameters = null;
|
|
|
|
this._pending = null;
|
|
|
|
}
|
|
|
|
format(index, parameters = { }, code = false) {
|
|
|
|
let language = this.author._settings.locale || 'en_us';
|
|
if(this.guild && this.guild._settings.locale) language = this.guild._settings.locale;
|
|
|
|
parameters.prefix = this.guild && this.guild._settings.prefix ? this.guild._settings.prefix : this.client._options.bot.prefix ;
|
|
let template = this.client.localeLoader.template(language, index); //.languages[language][index];
|
|
|
|
for (const [param, val] of Object.entries(parameters)) {
|
|
template = template.replace(new RegExp(`{${escapeRegex(param.toLowerCase())}}`, 'gi'), val);
|
|
}
|
|
|
|
template = template.replace(new RegExp(`\r`, 'gi'), '\n');
|
|
|
|
if(code) {
|
|
try {
|
|
template = eval(template);
|
|
} catch(error) {
|
|
this.command.client.logger.error(`Error in locale ${language}:${index} while executing code.\n${error.stack || error}`);
|
|
}
|
|
}
|
|
|
|
return template;
|
|
|
|
}
|
|
|
|
async resolve() {
|
|
|
|
if (this.command.showUsage && !this.parameters.length) {
|
|
return this._showUsage();
|
|
}
|
|
|
|
try {
|
|
const resolved = this.command.execute(this, {
|
|
params: this.parameters,
|
|
args: this.args
|
|
});
|
|
if(resolved instanceof Promise) await resolved;
|
|
return { error: false };
|
|
} catch(error) {
|
|
return { error: true, message: error.stack || error };
|
|
}
|
|
|
|
}
|
|
|
|
async embed(embed, opts = {}) {
|
|
|
|
if (!embed.color) embed.color = 619452;
|
|
let send = { content: opts.reply ? `<@${this.author.id}>` : '', embed };
|
|
this._pending = await this.channel.send(send);
|
|
return this._pending;
|
|
|
|
}
|
|
|
|
async respond(str, opts = {}) {
|
|
|
|
if(typeof str === 'string') {
|
|
if(opts.emoji) {
|
|
const emoji = emojis[opts.emoji];
|
|
if(!emoji) this.command.client.logger.warn(`Invalid emoji provided to command ${this.command.resolveable}: "${opts.emoji}".`);
|
|
str = `${emoji} ${str}`;
|
|
}
|
|
if(opts.reply) str = `<@!${this.author.id}> ${str}`;
|
|
}
|
|
|
|
this._pending = await this.channel.send(str);
|
|
return this._pending;
|
|
|
|
}
|
|
|
|
async edit(str, opts) {
|
|
if(!this.editable) return null;
|
|
if(typeof str === 'string') {
|
|
if(opts.emoji) str = `${emojis[opts.emoji]} ${str}`;
|
|
if(opts.reply) str = `<@!${this.author.id}> ${str}`;
|
|
}
|
|
return super.edit(str);
|
|
}
|
|
|
|
async _showUsage() {
|
|
//TODO: format this
|
|
return await this.embed({
|
|
title: `**${this.command.name.toUpperCase()} USAGE**`,
|
|
description: this.format(`C_${this.command.name.toUpperCase()}_USAGE`)
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
return ExtendedMessage;
|
|
|
|
});
|
|
|
|
module.exports = Message; |