const cmdLib = require('../../lib/command'), fsx = require('fs-extra'), utils = require('../../lib/utils'); /** * Info commands provide information about the bot. These informations are * not process specific but access the discord _client instance of the bot. */ class InfoCommandModule extends cmdLib.CommandModule { /** * @param opts {Object} properties: * client - the instance of the discord client. * messageHandler - the instance of the Message Handler */ constructor(opts) { super(cmdLib.CommandScopes.Global); this._templateDir = __dirname; this._client = opts.client; this._messageHandler = opts.messageHandler; } _createHelpEmbed(commands, msg, prefix, embedColor = 0xfff) { let helpEmbed = new cmdLib.ExtendedRichEmbed('Commands') .setDescription('Create a sequence of commands with `;` and `&&`.') .setColor(embedColor); let categories = []; let catCommands = {}; Object.entries(commands).sort().forEach(([key, value]) => { if (!categories.includes(value.category)) { categories.push(value.category); catCommands[value.category] = `\`${prefix}${key}\` \t`; } else { catCommands[value.category] += `\`${prefix}${key}\` \t`; } }); for (let cat of categories) helpEmbed.addField(cat, catCommands[cat]); helpEmbed.setFooter(prefix + 'help [command] for more info to each command'); this._logger.silly('Created help embed'); return helpEmbed; } async _loadChangelog() { try { let changelog = (await fsx.readFile('CHANGELOG.md', {encoding: 'utf-8'})).replace(/\r\n/g, '\n'); let entries = changelog.split(/\n## /); let changes = {}; let latestVersion = null; this._logger.debug(`Found ${entries.length} changelog entries`); for (let entry of entries) { let title = ''; let version = ''; let date = ''; let titleMatch = entry.match(/^.*?\n/g); if (titleMatch && titleMatch.length > 0) title = titleMatch[0].replace(/\n/, ''); let versionMatch = title.match(/\[.*?]/); if (versionMatch && versionMatch.length > 0) version = versionMatch[0].replace(/^\[|]$/g, ''); if (!latestVersion && version && version.length > 0) latestVersion = version; let dateMatch = title.match(/\d{4}-\d{2}-\d{2}/); if (version && version.length > 0) { changes[version] = { date: date, title: title, segments: {} }; if (dateMatch && dateMatch.length > 0) date = dateMatch[0]; let segments = entry.replace(title.replace(/\n/, ''), '').split(/\n### /); for (let segment of segments) { let segmentTitle = ''; let titleMatch = segment.match(/^.*?\n/); if (titleMatch && titleMatch.length > 0) segmentTitle = titleMatch[0].replace(/\n/, ''); changes[version].segments[segmentTitle] = segment.replace(segmentTitle, ''); } } } changes.latest = changes[latestVersion]; this._changes = changes; } catch (err) { this._logger.warn(err.message); this._logger.debug(err.stack); } } async register(commandHandler) { await this._loadTemplate(); await this._loadChangelog(); let about = new cmdLib.Command( this.template.about, new cmdLib.Answer(() => { return new cmdLib.ExtendedRichEmbed('About') .setDescription(this.template.about.response.about_creator) .addField('Icon', this.template.about.response.about_icon); }) ); let ping = new cmdLib.Command( this.template.ping, new cmdLib.Answer(() => { return `Current average ping: \`${this._client.ping} ms\``; }) ); let uptime = new cmdLib.Command( this.template.uptime, new cmdLib.Answer(() => { let uptime = utils.getSplitDuration(this._client.uptime); return new cmdLib.ExtendedRichEmbed('Uptime').setDescription(` **${uptime.days}** days **${uptime.hours}** hours **${uptime.minutes}** minutes **${uptime.seconds}** seconds **${uptime.milliseconds}** milliseconds `).setTitle('Uptime'); }) ); let guilds = new cmdLib.Command( this.template.guilds, new cmdLib.Answer(() => { return `Number of guilds: \`${this._client.guilds.size}\``; }) ); let help = new cmdLib.Command( this.template.help, new cmdLib.Answer((m, k) => { let globH = this._messageHandler.globalCmdHandler; let scopeH = this._messageHandler.getScopeHandler(m); if (k.command) { k.command = k.command.replace(globH.prefix, ''); let commandInstance = globH.commands[k.command] || scopeH.commands[k.command]; return commandInstance.help.setColor(this.template.help.embed_color); } else { let commandObj = {...globH.commands, ...scopeH.commands}; return this._createHelpEmbed(commandObj, m, globH.prefix, this.template.help.embed_color); } }) ); let changes = new cmdLib.Command( this.template.changes, new cmdLib.Answer((m, k) => { try { if (!k.version) return new cmdLib.ExtendedRichEmbed(this._changes.latest.title) .addFields(this._changes.latest.segments) .setColor(this.template.changes.embed_color) .attachFile('CHANGELOG.md'); else return new cmdLib.ExtendedRichEmbed(this._changes[k.version].title) .addFields(this._changes[k.version].segments) .setColor(this.template.changes.embed_color) .attachFile('CHANGELOG.md'); } catch (err) { this._logger.verbose(err.message); this._logger.silly(err.stack); return this.template.changes.response.not_found; } }) ); let versions = new cmdLib.Command( this.template.versions, new cmdLib.Answer(() => { try { return new cmdLib.ExtendedRichEmbed('CHANGELOG.md Versions') .setDescription(Object.keys(this._changes).join('\n')) .setColor(this.template.versions.embed_color); } catch (err) { this._logger.verbose(err.message); this._logger.silly(err.stack); return this.template.versions.response.not_found; } }) ); // register commands commandHandler .registerCommand(about) .registerCommand(ping) .registerCommand(uptime) .registerCommand(guilds) .registerCommand(help) .registerCommand(changes) .registerCommand(versions); } } Object.assign(exports, { 'module': InfoCommandModule });