discord.js

const discord = require("discord.js");
const DiscordEvents = require("./discord-events.json");
const EngineScript = require("./enginescript");
const toolbox = require("tinytoolbox")

const manifest = {
	version: '0.2',
	name: 'org.js.diddle.engine.discord'
}


/**
 * @class DiscordWrapper
 * @property {module:discord.js/Client} client <a href="https://discord.js.org/#/docs/main/stable/class/Client">Discord.JS Client</a>
 * @param {DiddleEngine} diddle 
 * @extends {EngineScript}
 */
class DiscordWrapper extends EngineScript{
	/**
	 * @memberof DiscordWrapper
	 * @description Gets called when DiscordWrapper needs to be ready for other scripts to use.
	 */
	async _ready() {
		this.cmd_prefix = this.diddle.pacman.get("org.js.diddle.engine.config").get().discord.prefix;
		for ( let i = 0; i < DiscordEvents.length; i++ ) {
			switch(DiscordEvents[i]) {
				case "message":
					this.client.on(DiscordEvents[i],async (d) => {
						var msg = this.msg(d);
						try {
							await this.event.call(`discord-${DiscordEvents[i]}`,msg);
						} catch(e) {
							let ErrorID = toolbox.stringGen(4,6) + "-" + toolbox.stringGen(12,3) + "-" + toolbox.stringGen(7,3);
							let Timestamp = Date.now();
							var response = new discord.MessageEmbed()
								.setTitle("Error with Processing Message")
								.setDescription("```"+e.stack+"```\nErrorID: \`"+ErrorID+"\`")
								.setTimestamp()
								.setFooter(`Event: ${DiscordEvents[i]}`);
							d.channel.send({embed: response});
							this.event.call(`discord-errorhandle`,{
								id: ErrorID,
								error: e,
								timestamp: Timestamp,
								message: d
							});
						}
					});
					break;
				default:
					this.client.on(DiscordEvents[i],d => this.event.call(`discord-${DiscordEvents[i]}`,d));
					break;
			}
		}
		this.log.info("connecting to discord");
		var token = this.diddle.pacman.get("org.js.diddle.engine.token").get("discord");
		try {
			await this.client.login(token);
		} catch(e) {
			this.log.error("failed to connect to discord;\n",e);
			return;
		}
		this.log.info("connected to discord as "+this.client.user.tag);
	}
	
	/** @function
	 * @name msg
	 * @arg {module:discordjs.GuildMessage} _message Discord Message to Inject the Command, Prefix, and Arguments into.
	 * @private
	 */
	msg(_message) {
		_message.prefix = this.diddle.pacman.get("org.js.diddle.engine.config").get().discord.prefix;
		_message.command = _message.content.replace(_message.prefix,"").split(' ')[0];
		_message.args = _message.content.split(_message.prefix+_message.command).join('').split(' ');
		_message.command = _message.command.toLowerCase().trim();
		return _message;
	}

	constructor(diddle) {
		super(diddle,manifest);
		this.client = new discord.Client();
		this.log.info(`Running ${this.manifest.name}@${this.manifest.version}`);
	}
	
}
module.exports = DiscordWrapper;