From 8413628745de4afc517958c521817ea4167bef62 Mon Sep 17 00:00:00 2001 From: Antonio Date: Sat, 16 Nov 2024 16:54:34 +0100 Subject: [PATCH] Updates --- Aghanim.js.html | 65 +- Category.html | 4 +- Category.js.html | 54 +- Client.html | 2322 ++++++++++++++++--- Client.js.html | 2341 +++++++++++++------- Command.html | 175 +- Command.js.html | 405 ++-- Component.html | 4 +- Component.js.html | 36 +- Logger.js.html | 16 +- fonts/OpenSans-Semibold-webfont.eot | Bin 20028 -> 0 bytes fonts/OpenSans-Semibold-webfont.svg | 1830 --------------- fonts/OpenSans-Semibold-webfont.ttf | Bin 39476 -> 0 bytes fonts/OpenSans-Semibold-webfont.woff | Bin 22908 -> 0 bytes fonts/OpenSans-SemiboldItalic-webfont.eot | Bin 20962 -> 0 bytes fonts/OpenSans-SemiboldItalic-webfont.svg | 1830 --------------- fonts/OpenSans-SemiboldItalic-webfont.ttf | Bin 40252 -> 0 bytes fonts/OpenSans-SemiboldItalic-webfont.woff | Bin 23764 -> 0 bytes global.html | 20 +- icons/home.svg | 4 - icons/search.svg | 4 - index.html | 127 +- module-aghanim.html | 116 +- scripts/pagelocation.js | 89 - styles/collapse.css | 27 - tutorial-1getting-started.html | 80 +- tutorial-2create-bot.html | 27 +- tutorial-3command-command.html | 132 ++ tutorial-3command-interaction.html | 122 + tutorial-3command.html | 93 +- tutorial-4components.html | 97 +- tutorial-5categories.html | 12 +- tutorial-6command-requirements.html | 98 +- 33 files changed, 4646 insertions(+), 5484 deletions(-) delete mode 100644 fonts/OpenSans-Semibold-webfont.eot delete mode 100644 fonts/OpenSans-Semibold-webfont.svg delete mode 100644 fonts/OpenSans-Semibold-webfont.ttf delete mode 100644 fonts/OpenSans-Semibold-webfont.woff delete mode 100644 fonts/OpenSans-SemiboldItalic-webfont.eot delete mode 100644 fonts/OpenSans-SemiboldItalic-webfont.svg delete mode 100644 fonts/OpenSans-SemiboldItalic-webfont.ttf delete mode 100644 fonts/OpenSans-SemiboldItalic-webfont.woff delete mode 100644 icons/home.svg delete mode 100644 icons/search.svg delete mode 100644 scripts/pagelocation.js delete mode 100644 styles/collapse.css create mode 100644 tutorial-3command-command.html create mode 100644 tutorial-3command-interaction.html diff --git a/Aghanim.js.html b/Aghanim.js.html index 9f4bd73..180de6b 100644 --- a/Aghanim.js.html +++ b/Aghanim.js.html @@ -26,36 +26,37 @@

Source: Aghanim.js

-
const Eris = require('eris') /* eslint import/no-cycle : "off" */
-const Client = require('./Client');
-const Command = require('./Command');
-const Category = require('./Category');
-const Component = require('./Component');
-const Logger = require('./Logger')
-const CommandRequirementsCreators = require('./requirements')
-
-/**
- * Aghanim module to create a Command Client for {@link https://abal.moe/Eris/docs/getting-started Eris} using nodejs!
- * @module aghanim
- * @returns {Client} Command client class
- */
-
-module.exports = Client;
-/** @prop {Client} Client - Command client class*/
-module.exports.Client = Client;
-/** @prop {Command} Command - Command class*/
-module.exports.Command = Command;
-/** @prop {Category} Category - Category class*/
-module.exports.Category = Category;
-/** @prop {Component} Component - Component class*/
-module.exports.Component = Component;
-/** @prop {Eris} Component - See {@link https://abal.moe/Eris/docs/getting-started Eris} */
-module.exports.Eris = Eris;
-/** @prop {Logger} Component See {@link https://github.com/Geo1088/another-logger another-logger} */
-module.exports.Logger = Logger;
-/** @prop {CommandRequirementsCreators} CommandRequirementsCreators See {@link https://desvelao.github.com/aghanim/CommandRequirements CommandRequirements} */
-module.exports.CommandRequirementsCreators = CommandRequirementsCreators;
-
+            
const Eris = require('eris'); /* eslint import/no-cycle : "off" */
+const Client = require('./Client');
+const Command = require('./Command');
+const Category = require('./Category');
+const Component = require('./Component');
+const Logger = require('./Logger');
+const CommandRequirementsCreators = require('./requirements');
+
+/**
+ * Aghanim module to create a Command Client for {@link https://abal.moe/Eris/docs/getting-started Eris} using NodeJS!
+ * @module aghanim
+ * @returns {Client} Command client class
+ */
+
+module.exports = Client;
+/** @prop {Client} Client - Command client class*/
+module.exports.Client = Client;
+/** @prop {Command} Command - Command class*/
+module.exports.Command = Command;
+/** @prop {Category} Category - Category class*/
+module.exports.Category = Category;
+/** @prop {Component} Component - Component class*/
+module.exports.Component = Component;
+/** @prop {Eris} Component - See {@link https://abal.moe/Eris/docs/getting-started Eris} */
+module.exports.Eris = Eris;
+/** @prop {Logger} Component See {@link https://github.com/Geo1088/another-logger another-logger} */
+module.exports.Logger = Logger;
+/** @prop {CommandRequirementsCreators} CommandRequirementsCreators See {@link https://desvelao.github.com/aghanim/CommandRequirements CommandRequirements} */
+module.exports.CommandRequirementsCreators = CommandRequirementsCreators;
+/** @prop {constants} constants Constants */
+module.exports.constants = require('./constants');
 
@@ -66,13 +67,13 @@

Source: Aghanim.js


diff --git a/Category.html b/Category.html index c5197ad..84ec8dd 100644 --- a/Category.html +++ b/Category.html @@ -367,13 +367,13 @@
Properties

diff --git a/Category.js.html b/Category.js.html index 08cd21f..26133b7 100644 --- a/Category.js.html +++ b/Category.js.html @@ -26,29 +26,33 @@

Source: Category.js

-
/** Class representing a category of commands. */
-class Category {
-	/**
-   * Create a category.
-   * @param {string} name - The name of category.
-   * @param {string} [help = `Help for ${this.name} category`]  - Help description
-   * @param {object} options - Help description
-   * @param {object} [options.hide = false] - Hide when use default help command
-   */
-	constructor(name, help, options = {}) {
-		if (!name) { throw new Error('Name is required') }
-		this.name = name
-		this.help = help || `Help for ${this.name} category`
-		this.hide = options.hide || false
-		for (const opt in options) { /* eslint no-restricted-syntax : "off" */
-			if (!this.hasOwnProperty(opt)) { /* eslint no-prototype-builtins : "off" */
-				this[opt] = options[opt]
-			}
-		}
-	}
-}
-
-module.exports = Category
+            
/** Class representing a category of commands. */
+class Category {
+  /**
+   * Create a category.
+   * @param {string} name - The name of category.
+   * @param {string} [help = `Help for ${this.name} category`]  - Help description
+   * @param {object} options - Help description
+   * @param {object} [options.hide = false] - Hide when use default help command
+   */
+  constructor(name, help, options = {}) {
+    if (!name) {
+      throw new Error('Name is required');
+    }
+    this.name = name;
+    this.help = help || `Help for ${this.name} category`;
+    this.hide = options.hide || false;
+    for (const opt in options) {
+      /* eslint no-restricted-syntax : "off" */
+      if (!this.hasOwnProperty(opt)) {
+        /* eslint no-prototype-builtins : "off" */
+        this[opt] = options[opt];
+      }
+    }
+  }
+}
+
+module.exports = Category;
 
@@ -59,13 +63,13 @@

Source: Category.js


diff --git a/Client.html b/Client.html index 9d0c944..4f5733c 100644 --- a/Client.html +++ b/Client.html @@ -128,7 +128,9 @@
Parameters:
- Options to start the client with. This object is also passed to Eris. If there are a aghanim.config.js/json in project root, that will be loaded instead object passed to constructor. See Eris Client constructor options https://abal.moe/Eris/docs/Client + Options to start the client with. This object is also passed to Eris. + If there are a aghanim.config.js/json in project root, that will be loaded instead object passed to constructor. + See Eris Client constructor options https://abal.moe/Eris/docs/Client
Properties
@@ -190,7 +192,8 @@
Properties
- The prefix the bot will respond to in guilds for which there is no other confguration. (Currently everywhere) + The prefix the bot will respond to in + guilds for which there is no other confguration. (Currently everywhere) @@ -229,7 +232,8 @@
Properties
- Whether or not the bot can respond to messages starting with a mention of the bot. + Whether or not the bot can respond + to messages starting with a mention of the bot. @@ -467,45 +471,6 @@
Properties
- - - - devLogs - - - - - -boolean - - - - - - - - - <optional>
- - - - - - - - - - - - false - - - - - Enable/disable aghanim dev logs - - - @@ -550,7 +515,7 @@
Properties
Source:
@@ -664,7 +629,8 @@
Properties:
- The OAuth application information returned by Discord. Present some time after the ready event. + The OAuth application information returned by + Discord. Present some time after the ready event. @@ -981,7 +947,7 @@
Properties
Source:
@@ -1087,7 +1053,7 @@
Properties:
Source:
@@ -1193,7 +1159,7 @@
Properties:
Source:
@@ -1299,7 +1265,7 @@
Properties:
Source:
@@ -1366,7 +1332,7 @@
Properties:
- Whether or not the bot ignores messages + Whether or not the bot ignores messages sent from bot accounts. Defaults to true. @@ -1411,7 +1377,7 @@
Properties:
Source:
@@ -1522,7 +1488,219 @@
Properties:
Source:
+ + + + + + + + + + + + + + + + +

interactionCommandCategories

+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDescription
+ + +Array.<Category> + + + + Categories for commands.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + +

interactionCommands

+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDescription
+ + +Array.<Command> + + + + An array of commands the bot will respond to.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
@@ -1589,7 +1767,8 @@
Properties:
- The RegExp used to tell whether or not a message starts with a mention of the bot. Only present after the 'ready' event. + The RegExp used to tell whether or not a message starts + with a mention of the bot. Only present after the 'ready' event. @@ -1628,7 +1807,7 @@
Properties:
Source:
@@ -1834,7 +2013,7 @@
Properties:
Source:
@@ -1901,7 +2080,8 @@
Properties:
- The prefix the bot will respond to in guilds for which there is no other confguration. + The prefix the bot will respond to in guilds +for which there is no other confguration. @@ -1940,7 +2120,7 @@
Properties:
Source:
@@ -2046,7 +2226,7 @@
Properties:
Source:
@@ -2293,7 +2473,7 @@
Properties
Source:
@@ -2433,7 +2613,7 @@
Parameters:
Source:
@@ -2592,7 +2772,7 @@
Parameters:
Source:
@@ -2729,7 +2909,7 @@
Parameters:
Source:
@@ -2891,7 +3071,7 @@
Parameters:
Source:
@@ -3028,7 +3208,7 @@
Parameters:
Source:
@@ -3165,7 +3345,7 @@
Parameters:
Source:
@@ -3327,7 +3507,7 @@
Parameters:
Source:
@@ -3486,7 +3666,7 @@
Parameters:
Source:
@@ -3623,7 +3803,7 @@
Parameters:
Source:
@@ -3681,7 +3861,7 @@
Returns:
-

createCommandArgs(msg) → {parseCommand}

+

addInteractionCommandDir(dirname)

@@ -3689,7 +3869,7 @@

crea
- Create args object and find command. Returns both. + Load all the JS files in a directory and attempt to load them each as commands.
@@ -3725,13 +3905,13 @@

Parameters:
- msg + dirname -Eris.message +string @@ -3741,7 +3921,7 @@
Parameters:
- Eris Message object + The location of the directory. @@ -3782,7 +3962,7 @@
Parameters:
Source:
@@ -3807,28 +3987,6 @@
Parameters:
-
Returns:
- - -
- - -
- - - -
-
- Type -
-
- -parseCommand - - -
-
- - @@ -3840,7 +3998,7 @@
Returns:
-

extendCommandArgs(args, msg, client)

+

addInteractionCommandFile(filename) → {Command}

@@ -3848,7 +4006,7 @@

exte
- Extend default args object. + Load a command exported from a file.
@@ -3884,59 +4042,13 @@

Parameters:
- args - - - - - -args - - - - - - - - - - Args object. - - - - - - - msg - - - - - -msg - - - - - - - - - - Eris Message. - - - - - - - client + filename -Client +string @@ -3946,7 +4058,7 @@
Parameters:
- Client instance. + The location of the file. @@ -3987,7 +4099,7 @@
Parameters:
Source:
@@ -4012,6 +4124,28 @@
Parameters:
+
Returns:
+ + +
+ - Command added. +
+ + + +
+
+ Type +
+
+ +Command + + +
+
+ + @@ -4023,7 +4157,7 @@
Parameters:
-

getCommandByName(command, subcommand) → {Command|undefined}

+

createCommandArgs(msg) → {parseCommand}

@@ -4031,7 +4165,7 @@

getCo
- Checks the list of registered commands and returns one whch is known by a given name, either as the command's name or an alias of the command. + Create args object and find command. Returns both.
@@ -4067,36 +4201,13 @@

Parameters:
- command - - - - - -string - - - - - - - - - - The name of the command to look for. - - - - - - - subcommand + msg -string +Eris.message @@ -4106,7 +4217,7 @@
Parameters:
- The name of the subcommand to look for. + Eris Message object @@ -4147,7 +4258,7 @@
Parameters:
Source:
@@ -4175,6 +4286,10 @@
Parameters:
Returns:
+
+ - +
+
@@ -4183,10 +4298,7 @@
Returns:
-Command -| - -undefined +parseCommand
@@ -4204,7 +4316,7 @@
Returns:
-

getCommandsOfCategories(categories) → {Array.<Command>|undefined}

+

extendCommandArgs(args, msg, client)

@@ -4212,7 +4324,7 @@

- Get Commands from a Category + Extend default args object. @@ -4248,16 +4360,36 @@
Parameters:
- categories + args -string -| +args -Array.<string> + + + + + + + + + Args object. + + + + + + + msg + + + + + +msg @@ -4267,7 +4399,30 @@
Parameters:
- Category or list of these to search commands + Eris Message. + + + + + + + client + + + + + +Client + + + + + + + + + + Client instance. @@ -4308,7 +4463,7 @@
Parameters:
Source:
@@ -4333,31 +4488,6 @@
Parameters:
-
Returns:
- - -
- - Array of Command (include childs commands aka subcommands) -
- - - -
-
- Type -
-
- -Array.<Command> -| - -undefined - - -
-
- - @@ -4369,7 +4499,7 @@
Returns:
-

(async) handleMessage(msg) → {*}

+

getCommandByName(command, subcommand) → {Command|undefined}

@@ -4377,7 +4507,8 @@

(async)
- Given a message, see if there is a command and process it if so. + Checks the list of registered commands and returns one whch is known by a +given name, either as the command's name or an alias of the command.
@@ -4413,13 +4544,13 @@

Parameters:
- msg + command -Object +string @@ -4429,7 +4560,30 @@
Parameters:
- The message object recieved from Eris. + The name of the command to look for. + + + + + + + subcommand + + + + + +string + + + + + + + + + + The name of the subcommand to look for. @@ -4470,7 +4624,7 @@
Parameters:
Source:
@@ -4498,10 +4652,6 @@
Parameters:
Returns:
-
- - Returns -
-
@@ -4510,7 +4660,10 @@
Returns:
-* +Command +| + +undefined
@@ -4528,7 +4681,7 @@
Returns:
-

reloadCommands()

+

getCommandsOfCategories(categories) → {Array.<Command>|undefined}

@@ -4536,7 +4689,7 @@

reloadC
- Reloads all commands that were loaded via `addCommandFile` and `addCommandDir`. Useful for development to hot-reload commands as you work on them. + Get Commands from a Category
@@ -4547,6 +4700,58 @@

reloadC +

Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
categories + + +string +| + +Array.<string> + + + + Category or list of these to search commands
+ + @@ -4580,7 +4785,7 @@

reloadC
Source:
@@ -4605,6 +4810,31 @@

reloadC +

Returns:
+ + +
+ - Array of Command (include childs commands aka subcommands) +
+ + + +
+
+ Type +
+
+ +Array.<Command> +| + +undefined + + +
+
+ + @@ -4616,7 +4846,7 @@

reloadC -

reloadComponents()

+

(async) handleInteractionCreate(interaction) → {*}

@@ -4624,7 +4854,7 @@

reloa
- Reloads all components that were loaded via `addComponentFile` and `addCommponentDir`. Useful for development to hot-reload commands as you work on them. + Given a message, see if there is a command and process it if so.
@@ -4635,6 +4865,55 @@

reloa +

Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
interaction + + +Object + + + + The interaction object recieved from Eris.
+ + @@ -4668,7 +4947,7 @@

reloa
Source:
@@ -4693,6 +4972,28 @@

reloa +

Returns:
+ + +
+ - Returns +
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + @@ -4704,7 +5005,7 @@

reloa -

triggerMessageCreate(msg, client) → {boolean}

+

(async) handleMessage(msg) → {*}

@@ -4712,7 +5013,7 @@

t
- If returns true, allow default commands management and messageCreate Components functions. + Given a message, see if there is a command and process it if so.
@@ -4754,30 +5055,7 @@

Parameters:
-Eris.message - - - - - - - - - - Eris Message object - - - - - - - client - - - - - -Client +Object @@ -4787,7 +5065,7 @@
Parameters:
- Client instance + The message object recieved from Eris. @@ -4828,7 +5106,7 @@
Parameters:
Source:
@@ -4857,7 +5135,7 @@
Returns:
- - true = allow, false = omit + - Returns
@@ -4868,7 +5146,7 @@
Returns:
-boolean +*
@@ -4881,12 +5159,1518 @@
Returns:
+ + +

reloadCommands()

+ -

Events

+ + + +
+ Reloads all commands that were loaded via `addCommandFile` and +`addCommandDir`. Useful for development to hot-reload commands as you work +on them. +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

reloadComponents()

+ + + + + + +
+ Reloads all components that were loaded via `addComponentFile` and +`addCommponentDir`. Useful for development to hot-reload commands as you work +on them. +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

triggerMessageCreate(msg, client) → {boolean}

+ + + + + + +
+ If returns true, allow default commands management and messageCreate Components functions. +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
msg + + +Eris.message + + + + Eris Message object
client + + +Client + + + + Client instance
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ - true = allow, false = omit +
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + + + + + + + + + + +

Events

+ + + + + + + +

aghanim:command-interaction:error

+ + + + + + +
+ Fired when an interaction command had an error +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
interaction + + +object + + + + Error
client + + +Client + + + + Client instance
interactionCommand + + +Command + + + + Interaction command
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

aghanim:command-interaction:executed

+ + + + + + +
+ Fired when an interaction command runner was executed +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
interaction + + +object + + + + Error
client + + +Client + + + + Client instance
interactionCommand + + +Command + + + + Interaction command
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

aghanim:command-interaction:executing

+ + + + + + +
+ Fired when an interaction command runner go to be executed +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
interaction + + +object + + + + Error
client + + +Client + + + + Client instance
interactionCommand + + +Command + + + + Interaction command
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

aghanim:command-interaction:triggered

+ + + + + + +
+ Fired when an interaction command is triggered +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
interaction + + +object + + + + Error
client + + +Client + + + + Client instance
interactionCommand + + +Command + + + + Interaction command
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

aghanim:command-interaction:triggered-not-found

+ + + + + + +
+ Fired when an interaction command is triggered but the runner was not found +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
interaction + + +object + + + + Error
client + + +Client + + + + Client instance
interactionCommand + + +Command + + + + Interaction command
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

aghanim:command:error

+ + + + + + +
+ Fired when a command got an error executing the run function +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
err + + +object + + + + Error
msg + + +object + + + + Eris Message object
args + + +args + + + + Args object
client + + +Client + + + + Client instance
command + + +Command + + + + Command
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + @@ -5087,7 +6871,7 @@
Parameters:
Source:
@@ -5293,7 +7077,7 @@
Parameters:
Source:
@@ -5499,7 +7283,7 @@
Parameters:
Source:
@@ -5705,7 +7489,7 @@
Parameters:
Source:
@@ -5911,7 +7695,7 @@
Parameters:
Source:
@@ -6071,7 +7855,7 @@
Parameters:
Source:
@@ -6113,13 +7897,13 @@
Parameters:

diff --git a/Client.js.html b/Client.js.html index 1fe27e5..0e5211c 100644 --- a/Client.js.html +++ b/Client.js.html @@ -26,834 +26,1515 @@

Source: Client.js

-
const Eris = require('eris')
-const glob = require('glob')
-const path = require('path')
-const Logger = require('another-logger')
-const reload = require('require-reload')(require)
-const Command = require('./Command')
-const Category = require('./Category')
-const Component = require('./Component')
-const builtinCommandRequirements = require('./requirements')
-
-const DEFAULT_CATEGORY = 'Default'
-
-// Logger
-const logger = new Logger({
-	label: 'Aghanim',
-	timestamps: true,
-	levels: {
-		dev: { style: 'magenta' },
-		commandrunerror: { text: 'command:run:error', style: 'red' },
-		componentrunerror: { text: 'component:run:error', style: 'red' },
-		commandadderror: { text: 'command:add:error', style: 'red' },
-		componentadderror: { text: 'component:add:error', style: 'red' },
-		categoryadderror: { text: 'category:run:error', style: 'red' },
-	},
-	// ignoredLevels: [this.devLogs ? '' : 'dev']
-})
-/**
- * Aghanim Client extends from Eris.Client
- * @extends Eris.Client
- */
-class Client extends Eris.Client {
-	/**
-	* Create a client instance.
-	* @class
-	* @param {string} token - The token used to log into the bot.
-	* @param {Object} options - Options to start the client with. This object is also passed to Eris.
-	*     If there are a aghanim.config.js/json in project root, that will be loaded instead object passed to constructor.
-	*     See Eris Client constructor options https://abal.moe/Eris/docs/Client
-	* @param {string} [options.prefix = ''] - The prefix the bot will respond to in
-	*     guilds for which there is no other confguration. (Currently everywhere)
-	* @param {boolean} [options.allowMention = false] - Whether or not the bot can respond
-	*     to messages starting with a mention of the bot.
-	* @param {boolean} [options.ignoreBots = true] - Whether or not the bot ignoresBots. Default: true
-	* @param {boolean} [options.ignoreSelf = true] - Whether or not the bot ignores self. Default: true
-	* @param {string} [options.helpMessage = '**Help**'] - Title for default command help Message
-	* @param {string} [options.helpMessageAfterCategories = '**Note**: Use \`${options.prefix}help <category>\` to see the commands']
-	* Message after categories in default command help message are shown
-	* @param {boolean} [options.helpDM = true] - Active direct message to default command help
-	* @param {boolean} [options.helpEnable = true] - Enable/disable default command help
-	* @param {boolean} [options.devLogs = false] - Enable/disable aghanim dev logs
-	*/
-	constructor(token, options = {}) {
-		// Attempt to load options from aghanim.config.js(on) file
-		try {
-			options = require(`${process.cwd()}/aghanim.config`) /* eslint import/no-dynamic-require: "off", global-require : "off", no-param-reassign : "off" */
-			logger.info('Loaded: aghanim.config.js(on)')
-		} catch (err) { } /* eslint no-empty: "off" */
-
-		super(token, options)
-		options.devLogs = options.devLogs || false
-		logger._config.ignoredLevels = [options.devLogs ? '' : 'dev'] /* eslint no-underscore-dangle: "off" */
-
-		/** @prop {string} - The prefix the bot will respond to in guilds
-		 * for which there is no other confguration. */
-		this.prefix = options.prefix || ''
-		/** @prop {Command[]} - An array of commands the bot will respond to. */
-		this.commands = []
-		/** @prop {Category[]} - Categories for commands. */
-		this.categories = []
-		/** @prop {Object<Component>} - Components. */
-		this.components = {}
-		/** @prop {Object} - Setup */
-		this.setup = {}
-		// /** @prop {Object} - Context Extension */
-		// this.contextExtension = {}
-
-		this._ready = false
-		this._commandsRequirements = {}
-
-		// /** @prop {boolean} - Whether or not the bot can respond to messages
-		//  * starting with a mention of the bot. Defaults to true. */
-		// this.allowMention = options.allowMention === null ? false : options.allowMention
-		/** @prop {boolean} - Whether or not the bot ignores messages
-		 sent from bot accounts. Defaults to true.
-		 * @default true */
-		this.ignoreBots = options.ignoreBots !== undefined ? options.ignoreBots : true
-		/** @prop {boolean} - Ignore self
-		* @default true */
-		this.ignoreSelf = options.ignoreSelf !== undefined ? options.ignoreSelf : true
-
-		this.once('ready', () => {
-			if (this._ready) { return }
-			this._ready = true
-			/**
-			 * @prop {RegExp} - The RegExp used to tell whether or not a message starts
-			 *     with a mention of the bot. Only present after the 'ready' event.
-			 */
-			this.mentionPrefixRegExp = new RegExp(`^<@!?${this.user.id}>\\s?`)
-
-			this.getOAuthApplication().then((app) => {
-				/**
-				 * @prop {object} - The OAuth application information returned by
-				 *     Discord. Present some time after the ready event.
-				 * @prop {string} description - Discord App description
-				 * @prop {string} name - Discord App name
-				 * @prop {string} owner - Discord App owner
-				 * @prop {string} owner.id - Owner ID
-				 * @prop {string} owner.username - Owner username
-				 * @prop {string} owner.discriminator - Owner discriminator
-				 * @prop {string} owner.avatar - Owner avatar
-				 * @prop {boolean} bot_public - If app is public
-				 * @prop {boolean} bot_require_code_grant -
-				 * @prop {string} id - Discord App id
-				 * @prop {string} icon - Discord App icon
-				 */
-				this.app = app
-				/**
-				 * Owner description
-				 * @prop {string} id - Owner ID
-				 * @prop {string} username - Owner username
-				 * @prop {string} discriminator - Owner discriminator
-				 * @prop {string} avatar - Owner avatar
-				 * @prop {Ownersend} send - Send a message to Owner
-				 */
-				this.owner = Object.assign({}, this.app.owner)
-				this.getDMChannel(this.owner.id).then((channel) => {
-					/**
-					 * Function to send messages to owner
-					 * @callback Ownersend
-					 * @param  {string|EmbedMessageObject} content - Message content to send
-					 * @param  {object} file - File to send
-					 */
-					this.owner.send = function sendOwner(content, file) {
-						channel.createMessage(content, file)
-					}
-				})
-
-				this.handleEvent('ready')()
-			})
-		}).on('error', (err) => {
-			logger.error(err)
-			/**
-			 * Fired when there are an error
-			 * @event Client#aghanim:error
-			 * @param {object} err - Error
-			 * @param {Client} client - Client instance
-			 */
-			this.emit('aghanim:error', err, this)
-		}).on('messageCreate', this.handleMessage)
-			.on('messageReactionAdd', this.handleEvent('messageReactionAdd'))
-			.on('messageReactionRemove', this.handleEvent('messageReactionRemove'))
-			.on('guildCreate', this.handleEvent('guildCreate'))
-			.on('guildDelete', this.handleEvent('guildDelete'))
-			.on('guildMemberAdd', this.handleEvent('guildMemberAdd'))
-			.on('guildMemberRemove', this.handleEvent('guildMemberRemove'))
-
-		this.setup.helpMessage = `${options.helpMessage || '**Help**'}\n\n`
-		this.setup.helpMessageAfterCategories = `${options.helpMessageAfterCategories || `**Note**: Use \`${this.prefix}help <category>\` to see those commands`}\n\n`
-		this.setup.helpDM = options.helpDM || false
-		if (!options.disableHelp) {
-			// Add default help command to bot
-			this.addCommand(new Command('help', {}, async (msg, args, client, command) => { /* eslint no-unused-vars: "off" */
-				const categories = client.categories.map(c => c.name.toLowerCase())
-				const query = args.from(1).toLowerCase()
-				let { helpMessage } = client.setup
-				if (categories.includes(query)) {
-					const cmds = client.getCommandsOfCategories(query)
-					if (!cmds) {
-						helpMessage += client.categories.filter(c => !c.hide) /* eslint prefer-template: "off", max-len: "off" */
-							.map(c => `**${c.name}** \`${client.prefix}help ${c.name.toLowerCase()}\` - ${c.help}`)
-							.join('\n') + '\n\n' + client.setup.helpMessageAfterCategories
-					} else {
-						helpMessage += cmds.filter(c => !c.hide).map(c => `\`${client.prefix}${c.name}${c.args ? ' ' + c.args : ''}\` - ${c.help}${c.childs.length ? '\n' + c.childs.filter(s => !s.hide).map(s => `  · \`${s.name}${s.args ? ' ' + s.args : ''}\` - ${s.help}`).join('\n') : ''}`)
-							.join('\n')
-					}
-				} else if (categories.length) {
-					helpMessage += client.categories.filter(c => !c.hide).map(c => `**${c.name}** \`${client.prefix}help ${c.name.toLowerCase()}\` - ${c.help}`).join('\n') + '\n\n' + client.setup.helpMessageAfterCategories
-				} else {
-					const cmds = client.getCommandsOfCategories('Default')
-					if (!cmds) {
-						helpMessage += 'No commands'
-					} else {
-						helpMessage += cmds.filter(c => !c.hide).map(c => `\`${client.prefix}${c.name}${c.args ? ' ' + c.args : ''}\` - ${c.help}${c.childs.length ? '\n' + c.childs.filter(s => !s.hide).map(s => `  · \`${s.name}${s.args ? ' ' + s.args : ''}\` - ${s.help}`).join('\n') : ''}`)
-							.join('\n')
-					}
-				}
-				if (!client.setup.helpDM) {
-					return msg.channel.createMessage(helpMessage)
-				}
-				return msg.author.getDMChannel().then(channel => channel.createMessage(helpMessage))
-			}))
-		}
-	}
-
-	/**
-	 * Given a message, see if there is a command and process it if so.
-	 * @param {Object} msg - The message object recieved from Eris.
-	 * @return {*} - Returns
-	 */
-	async handleMessage(msg) {
-		if (!this._ready) return
-		if (!this.triggerMessageCreate(msg, this)) { return }
-		this.handleEvent('messageCreate')(msg)
-
-		if (this.ignoreBots && msg.author.bot) return
-		if (this.ignoreSelf && msg.author.id === this.user.id) return
-
-		const args = this.createCommandArgs(msg)
-		if (!args) { return }
-		const command = this.getCommandByName(args[0], args[1])
-		if (!command) { return }
-		// const context = Object.assign({
-		// 	command,
-		// 	client: this
-		// }, this.contextExtension)
-		try {
-			/**
-			 * Fired before a command is executed. Can't stop command of running
-			 * @event Client#aghanim:command:prereq
-			 * @param {object} msg - Eris Message object
-			 * @param {args} args - Args object
-			 * @param {Client} client - Client instance
-			 * @param {Command} command - Command
-			 */
-			this.emit('aghanim:command:prereq', msg, args, this, command)
-			await command.runHook('prereq', msg, args, this, command)
-			const notpass = !(await this.checkRequirements(msg, args, this, command))
-			if (notpass) return
-			/**
-			 * Fired before a command is executed. Can't stop command of running
-			 * @event Client#aghanim:command:prerun
-			 * @param {object} msg - Eris Message object
-			 * @param {args} args - Args object
-			 * @param {Client} client - Client instance
-			 * @param {Command} command - Command
-			 */
-			this.emit('aghanim:command:prerun', msg, args, this, command)
-			await command.runHook('prerun', msg, args, this, command)
-			if (command.response) {
-				switch (typeof command.response) {
-				case 'string': {
-					await msg.channel.createMessage(command.response)
-					break
-				}
-				case 'function': {
-					const response = command.response(msg, args, this, command)
-					await msg.channel.createMessage(response)
-					break
-				}
-				case 'object': {
-					await msg.channel.createMessage(command.response)
-					break
-				}
-				default: {}
-				}
-			} else if (command.responseDM) {
-				switch (typeof command.responseDM) {
-				case 'string': {
-					await msg.channel.createMessage(command.responseDM)
-					break
-				}
-				case 'function': {
-					const responseDM = command.responseDM(msg, args, this, command)
-					await msg.channel.createMessage(responseDM)
-					break
-				}
-				case 'object': {
-					await msg.channel.createMessage(command.responseDM)
-					break
-				}
-				default: {}
-				}
-			} else {
-				await command.run(msg, args, this, command)
-			}
-			/**
-			 * Fired after a command is executed. Don't cant stop command of running
-			 * @event Client#aghanim:command:executed
-			 * @param {object} msg - Eris Message object
-			 * @param {args} args - Args object
-			 * @param {Client} client - Client instance
-			 * @param {Command} command - Command
-			 */
-			this.emit('aghanim:command:executed', msg, args, this, command)
-			await command.runHook('executed', msg, args, this, command)
-		} catch (err) {
-			/**
-			 * Fired when a command got an error executing the run function
-			 * @event Client#aghanim:command:error
-			 * @param {object} err - Error
-			 * @param {object} msg - Eris Message object
-			 * @param {args} args - Args object
-			 * @param {Client} client - Client instance
-			 * @param {Command} command - Command
-			 */
-			logger.commandrunerror(`${command.name} - ${err} - ${err.stack}`)
-			this.emit('aghanim:command:error', err, msg, args, this, command)
-			try {
-				await command.runHook('error', msg, args, this, command, err)
-			} catch (errhook) {
-				logger.commandrunerror(`${command.name} - ${errhook} - ${errhook.stack}`)
-				this.emit('aghanim:command:error', errhook, msg, args, this, command)
-			}
-		}
-	}
-
-	handleEvent(eventname) {
-		return (...args) => {
-			Object.keys(this.components)
-				.map(componentName => this.components[componentName])
-				.filter(component => component[eventname] && component.enable)
-				.forEach(async (component) => {
-					try {
-						await component[eventname](...args, this)
-					} catch (err) {
-						logger.componentrunerror(`${component.constructor.name} (${eventname}) - ${err}`)
-						/**
-						 * Fired when a component get an error to be executed
-						 * @event Client#aghanim:component:error
-						 * @param {object} err - Error
-						 * @param {string} eventname - Name of Eris event
-						 * @param {Client} client - Client instance
-						 * @param {Component} component - Component
-						 */
-						this.emit('aghanim:component:error', err, eventname, this, component)
-					}
-				})
-		}
-	}
-
-	/**
-	 * Extend default args object.
-	 * @param {args} args - Args object.
-	 * @param {msg} msg - Eris Message.
-	 * @param {Client} client - Client instance.
-	 */
-	extendCommandArgs(args, msg, client) { } /* eslint class-methods-use-this: "off" */
-
-	_addFromDirectory(dirname, func) {
-		if (!dirname.endsWith('/')) dirname += '/'
-		const pattern = `${dirname}*.js`
-		const filenames = glob.sync(pattern)
-		filenames.forEach(filename => func(filename))
-	}
-
-	/**
-	 * Register a command to the client.
-	 * @param {Command | object} command - The command to add to the bot.
-	 * @returns {Command} - Command added
-	 */
-	addCommand(command) { /* eslint consistent-return:"off" */
-		if (!(command instanceof Command) && typeof command === 'object') { // allow command as object and create it
-			command = new Command(command)
-		}
-		if (!(command instanceof Command)) throw new TypeError('Not a command') // throw error if not a Command instance or class extending of command
-		if (!this.categories.find(c => c.name === command.category)) { // Check category exists or assing default category
-			command.category = DEFAULT_CATEGORY
-			logger.warn(`Category not found for ${command.name}. Established as ${DEFAULT_CATEGORY}`)
-		}
-		command.client = this // inject client on command
-		const { requirements } = command
-		command.requirements = [] // reset command.requirements
-		mapCommandRequirement(this, command, requirements) /* eslint no-use-before-define: "off" */
-
-		// Check if command exists already and throw error or add to client
-		if (!command.childOf) {
-			const commandExists = this.commands.find(c => c.names.some(cname => [command.name, ...command.aliases].includes(cname)))
-			if (commandExists) {
-				logger.commandadderror(`Command exists: ${command.name}`)
-			} else {
-				this.commands.push(command)
-				logger.dev(`Command added: ${command.name}`)
-				return command
-			}
-		} else { // Find parent command and add to client
-			const parent = this.commands.find(c => c.names.includes(command.childOf))
-			if (!parent) {
-				throw new Error(`Parent command ${command.childOf} not found for ${command.name}`)
-			} else {
-				if (command.category !== parent.category) { // Set category as parent category if is different
-					command.category = parent.category
-					logger.warn(`${command.category} not same upcomand! Established as ${parent.category}`)
-				}
-				command.parent = parent
-				parent.childs.push(command)
-				logger.dev(`Subcommand added: ${command.name} from ${parent.name}`)
-				return command
-			}
-		}
-	}
-
-	/**
-	 * Load all the JS files in a directory and attempt to load them each as commands.
-	 * @param {string} dirname - The location of the directory.
-	 */
-	addCommandDir(dirname) {
-		this._addFromDirectory(dirname, filename => this.addCommandFile(filename))
-	}
-
-	/**
-	 * Load a command exported from a file.
-	 * @param {string} filename - The location of the file.
-	 * @returns {Command} - Command added.
-	 */
-	addCommandFile(filename) {
-		try {
-			const commandLoaded = reload(filename)
-			const command = this.addCommand(commandLoaded)
-			if (command) {
-				command.filename = filename
-			}
-			return command
-		} catch (err) {
-			logger.commandadderror(`${err.stack} on ${filename}`)
-		}
-	}
-
-	/**
-	 * Add a Command {@link Category}
-	 * @param {string} name - Name for Category
-	 * @param {string} help - Help Message
-	 * @param {object} options - Options
-	 * @param {object} options.hide - Options
-	 * @param {object} options.restrict - Options
-	 */
-	addCategory(name, help, options) {
-		const category = new Category(name, help, options)
-		if (this.categories.find(c => c.name === category.name)) {
-			logger.categoryadderror(`${category.name} exists`)
-		} else {
-			this.categories.push(category);
-			logger.dev(`Category added: ${category.name}`)
-		}
-	}
-
-	/**
-	 * Add a Component
-	 * @param {Component | object} component - Component {@link Component}
-	 * @returns {Component} - Component added
-	 */
-	addComponent(component, options) {
-		if (!(component instanceof Component) && typeof component === 'object') { // allow load components as object
-			const componentObject = component
-			if (!componentObject.name) throw new TypeError(`Component as object require an name => ${JSON.stringify(componentObject)}`)
-			component = class extends Component {
-				constructor(client, options) {
-					super(client, options)
-					if (typeof componentObject.constructor === 'function'){
-						componentObject.constructor(client, options)
-					}
-				}
-			}
-			Object.defineProperty(component, 'name', { value: componentObject.name })
-			Object.keys(componentObject).filter(key => key !== 'name').forEach(key => component.prototype[key] = componentObject[key])
-		}
-		if (!(component.prototype instanceof Component)) throw new TypeError(`Not a Component => ${component}`)
-		if (this.components[component.name]) { throw new Error(`Component exists => ${component.name}`) }
-		try {
-			const instanceComponent = new component(this, options) /* eslint new-cap: "off" */
-			if (instanceComponent.enable) {
-				instanceComponent.name = component.name
-				this.components[component.name] = instanceComponent
-				logger.dev(`Component Added: ${component.name}`)
-				return this.components[component.name]
-			} else {
-				logger.warn(`Component Disabled: ${component.name}`)
-			}
-		} catch (err) {
-			logger.componentadderror(`${component.name} - ${err}`)
-		}
-	}
-
-	/**
-	 * Add component from file
-	 * @param {string} filename Path to file
-	 * @returns {Component} Component added
-	 */
-	addComponentFile(filename) {
-		try {
-			const componentClass = reload(filename)
-			const component = this.addComponent(componentClass)
-			if (component) {
-				component.filename = filename
-			}
-			return component
-		} catch (err) {
-			logger.componentadderror(`${err} on ${filename}`)
-		}
-	}
-
-	/**
-	 * Add components from a directory
-	 * @param {string} dirname Path to load components
-	 */
-	addComponentDir(dirname) {
-		this._addFromDirectory(dirname, filename => this.addComponentFile(filename))
-	}
-
-	/**
-	 * Define a requirement that can be added by commands
-	 * @param  {(CommandRequirementObject|CommandRequirementFunction)} requirement - Requirement to define
-	 */
-	addCommandRequirement(requirement) {
-		if (typeof requirement === 'object' && requirement.type) {
-			this._commandsRequirements[requirement.type] = requirement
-			return requirement
-		} else if (typeof requirement === 'function') {
-			this._commandsRequirements[requirement.name] = requirement
-			return requirement
-		} else {
-			logger.error('Error adding command requirement')
-		}
-	}
-
-	/**
-	 * Add command requirement from file
-	 * @param {string} filename Path to file
-	 * @returns {CommandRequirement} CommandRequirement added
-	 */
-	addCommandRequirementFile(filename) {
-		try {
-			const requirementLoaded = reload(filename)
-			if (typeof requirementLoaded === 'function') Object.defineProperty(requirementLoaded, 'name', { value: path.basename(filename, '.js') })
-			const requirement = this.addCommandRequirement(requirementLoaded)
-			if (requirement) {
-				requirement.filename = filename
-			}
-			return requirement
-		} catch (err) {
-			logger.commandadderror(`${err} on ${filename}`)
-		}
-	}
-
-	/**
-	 * Add command requirements from a directory
-	 * @param {string} dirname Path to load command requirements
-	 */
-	addCommandRequirementDir(dirname) {
-		this._addFromDirectory(dirname, filename => this.addCommandRequirementFile(filename))
-	}
-
-	/**
-	 * Reloads all commands that were loaded via `addCommandFile` and
-	 * `addCommandDir`. Useful for development to hot-reload commands as you work
-	 * on them.
-	 */
-	reloadCommands() { 
-		logger.dev('Reloading commands...')
-		const commands = this.commands.reduce((filenames, command) => {
-			filenames.push(command.filename ? command.filename : command)
-			if (command.childs.length > 0) {
-				command.childs.forEach((subcommand) => {
-					filenames.push(subcommand.filename ? subcommand.filename : subcommand)
-				})
-			}
-			return filenames
-		}, [])
-		this.commands = []
-		commands.forEach(command => typeof command === 'string' ? this.addCommandFile(command) : this.addCommand(command)) /* eslint no-confusing-arrow: 'off' */
-	}
-
-	/**
-	 * Reloads all components that were loaded via `addComponentFile` and
-	 * `addCommponentDir`. Useful for development to hot-reload commands as you work
-	 * on them.
-	 */
-	reloadComponents() { 
-		logger.dev('Reloading components...')
-		const components = Object.keys(this.components).map(key => this.components[key]).reduce((filenames, component) => {
-			if (component.filename) {
-				filenames.push([component.filename, component.name || component.constructor.name])
-			}
-			return filenames
-		}, [])
-
-		components.forEach(([filename, name]) => {
-			delete this.components[name]
-			this.addComponentFile(filename)
-		})
-		this.handleEvent('ready')()
-	}
-
-	reloadCommandRequirements() {
-		logger.dev('Reloading command requirements...')
-		const filenamesRequirement = Object.keys(this._commandsRequirements).map(key => this._commandsRequirements[key]).reduce((filenames, requirement) => {
-			if (requirement.filename) {
-				filenames.push(requirement.filename)
-			}
-			return filenames
-		}, [])
-		// this._commandsRequirements = {}
-		filenamesRequirement.forEach(filename => this.addCommandRequirementFile(filename))
-	}
-
-	/**
-	 * Checks the list of registered commands and returns one whch is known by a
-	 * given name, either as the command's name or an alias of the command.
-	 * @param {string} command - The name of the command to look for.
-	 * @param {string} subcommand - The name of the subcommand to look for.
-	 * @return {Command|undefined}
-	 */
-	getCommandByName(command, subcommand) {
-		const cmd = this.commands.find(c => c.names.includes(command))
-		if (!cmd) return
-		if (subcommand) {
-			const scmd = cmd.childs.find(c => c.names.includes(subcommand))
-			return scmd || cmd
-		}
-		return cmd
-	}
-
-	/***
-	 * Returns the appropriate prefix string to use for commands based on a
-	 * certain message.
-	 * @param {Object} msg - The message to check the prefix of.
-	 * @return {string}
-	 */
-	getPrefixForMessage(msg) {
-		return this.prefix
-	}
-
-	/***
-	 * Takes a message, gets the prefix based on the config of any guild it was
-	 * sent in, and returns the message's content without the prefix if the
-	 * prefix matches, and `null` if it doesn't.
-	 * @param {Object} msg - The message to process
-	 * @return {Array<String|null>}
-	 **/
-	splitPrefixFromContent(msg) {
-		// Traditional prefix handling - if there is no prefix, skip this rule
-		const prefix = this.getPrefixForMessage(msg) // TODO: guild config
-		if (prefix !== undefined && msg.content.startsWith(prefix)) {
-			return { prefix, content: msg.content.substr(prefix.length) }
-		}
-		// Allow mentions to be used as prefixes according to config
-		const match = msg.content.match(this.mentionPrefixRegExp)
-		if (this.allowMention && match) { // TODO: guild config
-			return { prefix: match[0], content: msg.content.substr(match[0].length) }
-		}
-		// we got nothing
-		return { prefix: undefined, content: msg.content }
-	}
-
-	/**
-	 * Get Commands from a Category
-	 * @param  {(string|string[])} categories - Category or list of these to search commands
-	 * @return {Command[]|undefined} - Array of {@link Command} (include childs commands aka subcommands)
-	 */
-	getCommandsOfCategories(categories) {
-		if (!Array.isArray(categories)) {
-			categories = [categories]
-		}
-		categories = categories.map(c => c.toLowerCase())
-		const cmds = this.commands.filter(c => categories.includes(c.category.toLowerCase()))
-		return cmds.length > 0 ? cmds : undefined
-	}
-
-	/**
-	 * If returns true, allow default commands management and messageCreate Components functions.
-	 * @param  {Eris.message} msg - Eris Message object
-	 * @param  {Client} client - Client instance
-	 * @return {boolean} - true = allow, false = omit
-	 */
-	triggerMessageCreate(msg, client) {
-		return true
-	}
-
-	/**
-	 * @typedef EmbedMessageObject
-	 * @see {@link https://abal.moe/Eris/docs/TextChannel#function-createMessage EmbedMessageObject}
-	 */
-
-	/**
-	 * Creators for Command Requirements
-	 * @typedef {function} CommandRequirementsCreators
-	 * @param {object} config - Object with requirement config
-	 * @see {@link https://desvelao.github.io/aghanim/tutorial-6command-requirements.html Command Requirements Creators} config - Object with requirement config
-	 * @returns {CommandRequirementObject}
-	 */
-
-	/**
-	 * Create args object and find command. Returns both.
-	 * @typedef parseCommand
-	 * @prop  {args} args - args object
-	 * @prop  {Command|undefined} command - command
-	 */
-
-	/**
-	 * Create args object and find command. Returns both.
-	 * @param  {Eris.message} msg - Eris Message object
-	 * @returns {parseCommand} - 
-	 */
-	createCommandArgs(msg) {
-		const { prefix, content } = this.splitPrefixFromContent(msg)
-		if (typeof prefix !== 'string' || typeof content !== 'string') return
-
-		const args = content.split(' ').map(word => word.trim())
-
-		/**
-		 * Message is spit for spaces (' ')
-		 * @typedef args
-		 * @prop {string} prefix - Message prefix
-		 * @prop {string} content - Message content
-		 * @prop {function} from - Splice message content from argument number to end message. fn(arg:number)
-		 * @prop {function} until - Splice message content from begin until argument number. fn(arg:number)
-		 * @prop {function} after - Same content. fn()
-		 * @prop {Client} client - Client instance
-		 * @prop {string} command - Command name
-		 * @prop {(string|undefined)} subcommand - Subcommand name if exists
-		 * @prop {array} - Each word form message is in a slot
-		 */
-		args.prefix = prefix
-		args.content = content
-		args.from = arg => args.slice(arg).join(' ')
-		args.until = arg => args.prefix + args.slice(0, arg).join(' ')
-		args.after = args.from(1)
-		args.client = this
-		args.command = args[0]
-		args.subcommand = args[1]
-		this.extendCommandArgs(args, msg, this)
-		return args
-	}
-
-	async checkRequirements(msg, args, client, command) {
-		if (!command.enable) { return false }
-		return command.requirements.reduce(async (result, requirement) => {
-			if (!(await result)) { return Promise.resolve(false) }
-			if (typeof requirement === 'object') {
-				const pass = await requirement.validate(msg, args, client, command, requirement)
-				if (pass === null) { // ignore response/responseDM/run methods
-					return Promise.resolve(false)
-				} else if (!pass) { // false/undefined do response/responseDM/run methods
-					if (["string", "object"].includes(typeof(requirement.response))) {
-						await msg.channel.createMessage(requirement.response) // Response to message
-					} else if (typeof requirement.response === "function") {
-						const res = await requirement.response(msg, args, client, command, requirement) 
-						await msg.channel.createMessage(res) // Response to message
-					} else if (["string", "object"].includes(typeof(requirement.responseDM))) {
-						await msg.author.getDMChannel().then(channel => channel.createMessage(requirement.responseDM)) // Response with a dm
-					} else if (typeof requirement.responseDM === "function") {
-						const res = await requirement.responseDM(msg, args, client, command, requirement) 
-						await msg.author.getDMChannel().then(channel => channel.createMessage(res)) // Response with a dm
-					} else if (typeof requirement.run === "function") {
-						await requirement.run(msg, args, client, command, requirement) // Custom
-					}
-					return Promise.resolve(false)
-				}
-			}
-			return Promise.resolve(true) // result
-		}, Promise.resolve(true))
-	}
-	// /**
-	//  * Creates a message. If the specified message content is longer than 2000
-	//  * characters, splits the message intelligently into chunks until each chunk
-	//  * is less than 2000 characters, then sends each chunk as its own message.
-	//  * Embeds and files are sent with the last message and are otherwise
-	//  * unaffected.
-	//  * @param content
-	//  * @param
-	//  * @TODO everything
-	//  */
-	// _createMessageChunked (channelId, content, file, maxLength = 2000) {
-	//   let embed
-	//   if (typeof content === 'object') {
-	//     embed = content.embed
-	//     content = content.content
-	//   } else {
-	//     embed = null
-	//   }
-	//   let self = this
-	//   ;(function sendChunk (left) {
-	//     console.log(left.length)
-	//     if (left.length < maxLength) return self.createMessage(channelId, {content, embed}, file)
-	//     let newlineIndex = left.substr(0, maxLength).lastIndexOf('\n')
-	//     if (newlineIndex < 1) newlineIndex = maxLength - 1
-	//     console.log(newlineIndex)
-	//     left = left.split('')
-	//     const chunk = left.splice(0, newlineIndex)
-	//     if (!left.length) {
-	//       // Interesting, the message was exactly good. We'll put the embed and stuff in now.
-	//       return self.createMessage(channelId, {content: chunk, embed: embed}, file)
-	//     }
-	//     sendChunk(left.join(''), maxLength)
-	//   }(content))
-	// }
-}
-
-
-function getCommandRequirement(client, command, req) {
-	if (typeof req === 'string') {
-		if (builtinCommandRequirements[req]) {
-			const requirement = builtinCommandRequirements[req]({command, client})
-			requirement.type = req
-			return requirement
-		} else if (client._commandsRequirements[req]) {
-			if (typeof client._commandsRequirements[req] === "object") {
-				return client._commandsRequirements[req]
-			}else if(typeof client._commandsRequirements[req]  === "function"){
-				return client._commandsRequirements[req]({ command, client })
-			}
-		} else {
-			throw new Error(`String command requirement not found: ${req}`)
-		}
-	} else if (typeof req === 'object') {
-		if (builtinCommandRequirements[req.type]) {
-			const requirement = builtinCommandRequirements[req.type]({ ...req, command, client })
-			requirement.type = req.type
-			return requirement
-		} else {
-			return req
-		}
-	} else {
-		throw new TypeError(`Requirement: ${req} on ${command.name}`)
-	}
-}
-
-function mapCommandRequirement(client, command, reqs){
-	reqs.forEach(req => {
-		const requirement = getCommandRequirement(client, command, req)
-		if(Array.isArray(requirement)){
-			mapCommandRequirement(client, command, requirement)
-		}else{
-			command.addRequirement(requirement)
-		}
-	})
-}
-
-module.exports = Client
+            
const Eris = require('eris');
+const glob = require('glob');
+const path = require('path');
+const Logger = require('another-logger');
+const reload = require('require-reload')(require);
+const Command = require('./Command');
+const Category = require('./Category');
+const Component = require('./Component');
+const constants = require('./constants');
+const builtinCommandRequirements = require('./requirements');
+
+const DEFAULT_CATEGORY = 'Default';
+
+/**
+ * Aghanim Client extends from Eris.Client
+ * @extends Eris.Client
+ */
+class Client extends Eris.Client {
+  /**
+   * Create a client instance.
+   * @class
+   * @param {string} token - The token used to log into the bot.
+   * @param {Object} options - Options to start the client with. This object is also passed to Eris.
+   *     If there are a aghanim.config.js/json in project root, that will be loaded instead object passed to constructor.
+   *     See Eris Client constructor options https://abal.moe/Eris/docs/Client
+   * @param {string} [options.prefix = ''] - The prefix the bot will respond to in
+   *     guilds for which there is no other confguration. (Currently everywhere)
+   * @param {boolean} [options.allowMention = false] - Whether or not the bot can respond
+   *     to messages starting with a mention of the bot.
+   * @param {boolean} [options.ignoreBots = true] - Whether or not the bot ignoresBots. Default: true
+   * @param {boolean} [options.ignoreSelf = true] - Whether or not the bot ignores self. Default: true
+   * @param {string} [options.helpMessage = '**Help**'] - Title for default command help Message
+   * @param {string} [options.helpMessageAfterCategories = '**Note**: Use \`${options.prefix}help <category>\` to see the commands']
+   * Message after categories in default command help message are shown
+   * @param {boolean} [options.helpDM = true] - Active direct message to default command help
+   * @param {boolean} [options.helpEnable = true] - Enable/disable default command help
+   */
+  constructor(token, options = {}) {
+    // Attempt to load options from aghanim.config.js(on) file
+    let configurationFileFound = false;
+
+    if (process.env.AGHANIM_CONFIG_FILE) {
+      try {
+        const configFile = process.env.AGHANIM_CONFIG_FILE;
+        options = require(configFile); /* eslint import/no-dynamic-require: "off", global-require : "off", no-param-reassign : "off" */
+        configurationFileFound = configFile;
+      } catch (err) {
+        console.warn({ err });
+      }
+    } else {
+      try {
+        const configFile = `${process.cwd()}/aghanim.config`;
+        options = require(configFile); /* eslint import/no-dynamic-require: "off", global-require : "off", no-param-reassign : "off" */
+        configurationFileFound = configFile;
+      } catch (err) {
+        console.warn({ err });
+      } /* eslint no-empty: "off" */
+    }
+
+    super(token, options);
+    // Logger
+    this._logger = new Logger({
+      label: 'Aghanim',
+      timestamps: true,
+      ...(options.logger || {})
+    });
+
+    if (configurationFileFound) {
+      this._logger.info(
+        `Loaded: aghanim.config.js(on) from ${configurationFileFound}`
+      );
+    }
+
+    /** @prop {string} - The prefix the bot will respond to in guilds
+     * for which there is no other confguration. */
+    this.prefix = options.prefix || '';
+    /** @prop {Command[]} - An array of commands the bot will respond to. */
+    this.commands = [];
+    /** @prop {Category[]} - Categories for commands. */
+    this.categories = [];
+    /** @prop {Command[]} - An array of commands the bot will respond to. */
+    this.interactionCommands = [];
+    /** @prop {Category[]} - Categories for commands. */
+    this.interactionCommandCategories = [];
+    /** @prop {Object<Component>} - Components. */
+    this.components = {};
+    /** @prop {Object} - Setup */
+    this.setup = {};
+    // /** @prop {Object} - Context Extension */
+    // this.contextExtension = {}
+
+    this._ready = false;
+    this._commandsRequirements = {};
+
+    // /** @prop {boolean} - Whether or not the bot can respond to messages
+    //  * starting with a mention of the bot. Defaults to true. */
+    // this.allowMention = options.allowMention === null ? false : options.allowMention
+    /** @prop {boolean} - Whether or not the bot ignores messages
+		 sent from bot accounts. Defaults to true.
+		 * @default true */
+    this.ignoreBots =
+      options.ignoreBots !== undefined ? options.ignoreBots : true;
+    /** @prop {boolean} - Ignore self
+     * @default true */
+    this.ignoreSelf =
+      options.ignoreSelf !== undefined ? options.ignoreSelf : true;
+
+    this.once('ready', () => {
+      if (this._ready) {
+        return;
+      }
+      this._ready = true;
+      /**
+       * @prop {RegExp} - The RegExp used to tell whether or not a message starts
+       *     with a mention of the bot. Only present after the 'ready' event.
+       */
+      this.mentionPrefixRegExp = new RegExp(`^<@!?${this.user.id}>\\s?`);
+
+      this.getOAuthApplication().then((app) => {
+        /**
+         * @prop {object} - The OAuth application information returned by
+         *     Discord. Present some time after the ready event.
+         * @prop {string} description - Discord App description
+         * @prop {string} name - Discord App name
+         * @prop {string} owner - Discord App owner
+         * @prop {string} owner.id - Owner ID
+         * @prop {string} owner.username - Owner username
+         * @prop {string} owner.discriminator - Owner discriminator
+         * @prop {string} owner.avatar - Owner avatar
+         * @prop {boolean} bot_public - If app is public
+         * @prop {boolean} bot_require_code_grant -
+         * @prop {string} id - Discord App id
+         * @prop {string} icon - Discord App icon
+         */
+        this.app = app;
+        /**
+         * Owner description
+         * @prop {string} id - Owner ID
+         * @prop {string} username - Owner username
+         * @prop {string} discriminator - Owner discriminator
+         * @prop {string} avatar - Owner avatar
+         * @prop {Ownersend} send - Send a message to Owner
+         */
+        this.owner = Object.assign({}, this.app.owner);
+        this.getDMChannel(this.owner.id).then((channel) => {
+          /**
+           * Function to send messages to owner
+           * @callback Ownersend
+           * @param  {string|EmbedMessageObject} content - Message content to send
+           * @param  {object} file - File to send
+           */
+          this.owner.send = function sendOwner(content, file) {
+            channel.createMessage(content, file);
+          };
+        });
+
+        this.handleEvent('ready')();
+        this.registerInteractionCommands();
+      });
+    })
+      .on('error', (err) => {
+        this._logger.error(err);
+        /**
+         * Fired when there are an error
+         * @event Client#aghanim:error
+         * @param {object} err - Error
+         * @param {Client} client - Client instance
+         */
+        this.emit('aghanim:error', err, this);
+      })
+      .on('messageCreate', this.handleMessage)
+      .on('messageReactionAdd', this.handleEvent('messageReactionAdd'))
+      .on('messageReactionRemove', this.handleEvent('messageReactionRemove'))
+      .on('guildCreate', this.handleEvent('guildCreate'))
+      .on('guildDelete', this.handleEvent('guildDelete'))
+      .on('guildMemberAdd', this.handleEvent('guildMemberAdd'))
+      .on('guildMemberRemove', this.handleEvent('guildMemberRemove'))
+      .on('interactionCreate', this.handleInteractionCreate);
+
+    this.setup.helpMessage = `${options.helpMessage || '**Help**'}\n\n`;
+    this.setup.helpMessageAfterCategories = `${
+      options.helpMessageAfterCategories ||
+      `**Note**: Use \`${this.prefix}help <category>\` to see those commands`
+    }\n\n`;
+    this.setup.helpDM = options.helpDM || false;
+    if (!options.disableHelp) {
+      // Add default help command to bot
+      this.addCommand(
+        new Command('help', {}, async (msg, args, client, command) => {
+          /* eslint no-unused-vars: "off" */
+          const categories = client.categories.map((c) => c.name.toLowerCase());
+          const query = args.from(1).toLowerCase();
+          let { helpMessage } = client.setup;
+          if (categories.includes(query)) {
+            const cmds = client.getCommandsOfCategories(query);
+            if (!cmds) {
+              helpMessage +=
+                client.categories
+                  .filter(
+                    (c) => !c.hide
+                  ) /* eslint prefer-template: "off", max-len: "off" */
+                  .map(
+                    (c) =>
+                      `**${c.name}** \`${
+                        client.prefix
+                      }help ${c.name.toLowerCase()}\` - ${c.help}`
+                  )
+                  .join('\n') +
+                '\n\n' +
+                client.setup.helpMessageAfterCategories;
+            } else {
+              helpMessage += cmds
+                .filter((c) => !c.hide)
+                .map(
+                  (c) =>
+                    `\`${client.prefix}${c.name}${
+                      c.args ? ' ' + c.args : ''
+                    }\` - ${c.help}${
+                      c.childs.length
+                        ? '\n' +
+                          c.childs
+                            .filter((s) => !s.hide)
+                            .map(
+                              (s) =>
+                                `  · \`${s.name}${
+                                  s.args ? ' ' + s.args : ''
+                                }\` - ${s.help}`
+                            )
+                            .join('\n')
+                        : ''
+                    }`
+                )
+                .join('\n');
+            }
+          } else if (categories.length) {
+            helpMessage +=
+              client.categories
+                .filter((c) => !c.hide)
+                .map(
+                  (c) =>
+                    `**${c.name}** \`${
+                      client.prefix
+                    }help ${c.name.toLowerCase()}\` - ${c.help}`
+                )
+                .join('\n') +
+              '\n\n' +
+              client.setup.helpMessageAfterCategories;
+          } else {
+            const cmds = client.getCommandsOfCategories('Default');
+            if (!cmds) {
+              helpMessage += 'No commands';
+            } else {
+              helpMessage += cmds
+                .filter((c) => !c.hide)
+                .map(
+                  (c) =>
+                    `\`${client.prefix}${c.name}${
+                      c.args ? ' ' + c.args : ''
+                    }\` - ${c.help}${
+                      c.childs.length
+                        ? '\n' +
+                          c.childs
+                            .filter((s) => !s.hide)
+                            .map(
+                              (s) =>
+                                `  · \`${s.name}${
+                                  s.args ? ' ' + s.args : ''
+                                }\` - ${s.help}`
+                            )
+                            .join('\n')
+                        : ''
+                    }`
+                )
+                .join('\n');
+            }
+          }
+          if (!client.setup.helpDM) {
+            return msg.channel.createMessage(helpMessage);
+          }
+          return msg.author
+            .getDMChannel()
+            .then((channel) => channel.createMessage(helpMessage));
+        })
+      );
+    }
+  }
+
+  async registerInteractionCommands() {
+    const interactionCommandScopeGlobal = this.interactionCommands.filter(
+      (interactionCommand) =>
+        !interactionCommand.scope ||
+        (interactionCommand.scope &&
+          interactionCommand.scope.type ===
+            constants.interactionCommandScope.global)
+    );
+    const interactionCommandScopeGuilds = this.interactionCommands.filter(
+      (interactionCommand) =>
+        interactionCommand.scope &&
+        interactionCommand.scope.type ===
+          constants.interactionCommandScope.guild
+    );
+
+    if (interactionCommandScopeGlobal.length) {
+      try {
+        // TODO: register, edit and delete global commands
+        this._logger.debug(
+          `Command interaction scope global: ${interactionCommandScopeGlobal
+            .map(({ name }) => name)
+            .join(', ')}`
+        );
+        const globalCommands = await this.getCommands();
+        for (const interactionCommand of interactionCommandScopeGlobal) {
+          const { name, description, type, options, customOptions } =
+            interactionCommand;
+          /* Global command to create */
+          if (
+            globalCommands.every((command) => command.name !== interaction.name)
+          ) {
+            this.createCommand({ name, description, type, options }).then(
+              () => {
+                this._logger.info(
+                  `Command interaction scope global created: ${name}`
+                );
+              }
+            );
+            /* Global command to edit */
+          } else if (customOptions && customOptions['dev.forceUpdate']) {
+            const command = globalCommands.find(
+              (command) => command.name === interaction.name
+            );
+            this.editCommand(command.id, {
+              name,
+              description,
+              type,
+              options
+            }).then(() => {
+              this._logger.info(
+                `Command interaction scope global edited: ${name}`
+              );
+            });
+            /* Global command to ignore the editing */
+          } else {
+            this._logger.debug(
+              `Command interaction scope global skipped to updating: ${name}. Use customOptions['dev.forceUpdate'] = true`
+            );
+          }
+        }
+
+        /* Global commands to remove */
+        const globalCommandsToRemove = globalCommands
+          // TODO: remove the commands that are disabled
+          .filter(
+            (globalCommand) =>
+              !interactionCommandScopeGlobal.some(
+                (interactionCommand) =>
+                  interactionCommand.name === globalCommand.name
+              )
+          );
+        if (globalCommandsToRemove.length) {
+          this._logger.warn(
+            `Command interaction scope global commands to remove: ${globalCommandsToRemove
+              .map(({ name }) => name)
+              .join(', ')}`
+          );
+          this._logger.debug(
+            `Command interaction scope global registered commands: ${globalCommands
+              .map(({ name }) => name)
+              .join(', ')}`
+          );
+          globalCommandsToRemove.forEach((globalCommand) => {
+            this._logger.debug(
+              `Command interaction scope global to remove ${guildCommand.name}`
+            );
+            this.deleteCommand(guildID, globalCommand.id)
+              .then(() => {
+                this._logger.info(
+                  `Command interaction scope global removed: ${guildCommand.name}`
+                );
+              })
+              .catch((error) => {
+                this._logger.error(
+                  `Command interaction scope global error removing ${guildCommand.name}: ${error}`
+                );
+              });
+          });
+        }
+      } catch (error) {}
+    }
+
+    if (interactionCommandScopeGuilds.length) {
+      const guildIDs = new Set();
+      interactionCommandScopeGuilds.forEach((interactionCommandScopeGuild) =>
+        guildIDs.add(...interactionCommandScopeGuild.scope.guildIDs)
+      );
+      [...guildIDs].forEach(async (guildID) => {
+        try {
+          const interactionCommandsGuild = interactionCommandScopeGuilds.filter(
+            (interactionCommandScopeGuild) =>
+              interactionCommandScopeGuild.scope.guildIDs.includes(guildID)
+          );
+          this._logger.debug(
+            `Command interaction scope guild ID (${guildID}): ${interactionCommandsGuild
+              .map(({ name }) => name)
+              .join(', ')}`
+          );
+
+          const guildCommands = await this.getGuildCommands(guildID);
+
+          /* Guild command defined */
+          if (interactionCommandsGuild.length) {
+            for (const interaction of interactionCommandsGuild) {
+              const { name, description, type, options, customOptions } =
+                interaction;
+              this._logger.debug(
+                `Command interaction scope guild ID (${guildID}) check registration: ${name}`
+              );
+              try {
+                /* Guild command to create */
+                if (
+                  guildCommands.every(
+                    (command) => command.name !== interaction.name
+                  )
+                ) {
+                  this._logger.debug(
+                    `Command interaction scope guild ID (${guildID}) check registration: ${name} creating`
+                  );
+                  await this.createGuildCommand(guildID, {
+                    name,
+                    description,
+                    type,
+                    options
+                  });
+                  this._logger.info(
+                    `Command interaction scope guild ID (${guildID}) created: ${name}`
+                  );
+                  /* Guild command to edit */
+                } else if (customOptions && customOptions['dev.forceUpdate']) {
+                  const command = guildCommands.find(
+                    (command) => command.name === interaction.name
+                  );
+                  this._logger.debug(
+                    `Command interaction scope guild ID (${guildID}) check registration: ${name} editing`
+                  );
+                  await this.editGuildCommand(guildID, command.id, {
+                    name,
+                    description,
+                    type,
+                    options
+                  });
+                  this._logger.info(
+                    `Command interaction scope guild ID (${guildID}) edited: ${name}`
+                  );
+                  /* Guild command to ignore the editing */
+                } else {
+                  this._logger.debug(
+                    `Command interaction scope guild ID (${guildID}) skipped to updating: ${name}. Use customOptions['dev.forceUpdate'] = true`
+                  );
+                }
+              } catch (error) {
+                this._logger.debug(
+                  `Command interaction scope guild ID (${guildID}) check registration: ${name} error: ${error.message}`
+                );
+                this.emit(
+                  'aghanim:command-interaction:error:register',
+                  interaction,
+                  this,
+                  { guildID, error }
+                );
+              }
+            }
+          }
+
+          /* Guild commands to remove */
+          const guildCommandsToRemove = guildCommands
+            // TODO: remove the commands that are disabled
+            .filter(
+              (guildCommand) =>
+                !interactionCommandsGuild.some(
+                  (interactionCommandGuild) =>
+                    interactionCommandGuild.name === guildCommand.name
+                )
+            );
+          if (guildCommandsToRemove.length) {
+            this._logger.warn(
+              `Command interaction scope guild ID (${guildID}) guild commands to remove: ${guildCommandsToRemove
+                .map(({ name }) => name)
+                .join(', ')}`
+            );
+            this._logger.debug(
+              `Command interaction scope guild ID (${guildID}) registered commands: ${guildCommands
+                .map(({ name }) => name)
+                .join(', ')}`
+            );
+            for (const guildCommand of guildCommandsToRemove) {
+              try {
+                this._logger.debug(
+                  `Command interaction scope guild ID (${guildID}) to remove ${guildCommand.name}`
+                );
+                await this.deleteGuildCommand(guildID, guildCommand.id);
+                this._logger.info(
+                  `Command interaction scope guild ID (${guildID}) removed: ${guildCommand.name}`
+                );
+              } catch (error) {
+                this._logger.error(
+                  `Command interaction scope guild ID (${guildID}) error removing ${guildCommand.name}: ${error}`
+                );
+              }
+            }
+          }
+        } catch (error) {
+          // TODO: handle the error
+        }
+      });
+    }
+  }
+
+  /**
+   * Given a message, see if there is a command and process it if so.
+   * @param {Object} msg - The message object recieved from Eris.
+   * @return {*} - Returns
+   */
+  async handleMessage(msg) {
+    if (!this._ready) return;
+    if (!this.triggerMessageCreate(msg, this)) {
+      return;
+    }
+    this.handleEvent('messageCreate')(msg);
+
+    if (this.ignoreBots && msg.author.bot) return;
+    if (this.ignoreSelf && msg.author.id === this.user.id) return;
+
+    const args = this.createCommandArgs(msg);
+    if (!args) {
+      return;
+    }
+    const command = this.getCommandByName(args[0], args[1]);
+    if (!command) {
+      return;
+    }
+    // const context = Object.assign({
+    // 	command,
+    // 	client: this
+    // }, this.contextExtension)
+    try {
+      /**
+       * Fired before a command is executed. Can't stop command of running
+       * @event Client#aghanim:command:prereq
+       * @param {object} msg - Eris Message object
+       * @param {args} args - Args object
+       * @param {Client} client - Client instance
+       * @param {Command} command - Command
+       */
+      this.emit('aghanim:command:prereq', msg, args, this, command);
+      await command.runHook('prereq', msg, args, this, command);
+      const notpass = !(await this.checkRequirements(msg, args, this, command));
+      if (notpass) return;
+      /**
+       * Fired before a command is executed. Can't stop command of running
+       * @event Client#aghanim:command:prerun
+       * @param {object} msg - Eris Message object
+       * @param {args} args - Args object
+       * @param {Client} client - Client instance
+       * @param {Command} command - Command
+       */
+      this.emit('aghanim:command:prerun', msg, args, this, command);
+      await command.runHook('prerun', msg, args, this, command);
+      if (command.response) {
+        switch (typeof command.response) {
+          case 'string': {
+            await msg.channel.createMessage(command.response);
+            break;
+          }
+          case 'function': {
+            const response = command.response(msg, args, this, command);
+            await msg.channel.createMessage(response);
+            break;
+          }
+          case 'object': {
+            await msg.channel.createMessage(command.response);
+            break;
+          }
+          default: {
+          }
+        }
+      } else if (command.responseDM) {
+        switch (typeof command.responseDM) {
+          case 'string': {
+            await msg.channel.createMessage(command.responseDM);
+            break;
+          }
+          case 'function': {
+            const responseDM = command.responseDM(msg, args, this, command);
+            await msg.channel.createMessage(responseDM);
+            break;
+          }
+          case 'object': {
+            await msg.channel.createMessage(command.responseDM);
+            break;
+          }
+          default: {
+          }
+        }
+      } else {
+        await command.run(msg, args, this, command);
+      }
+      /**
+       * Fired after a command is executed. Don't cant stop command of running
+       * @event Client#aghanim:command:executed
+       * @param {object} msg - Eris Message object
+       * @param {args} args - Args object
+       * @param {Client} client - Client instance
+       * @param {Command} command - Command
+       */
+      this.emit('aghanim:command:executed', msg, args, this, command);
+      await command.runHook('executed', msg, args, this, command);
+    } catch (err) {
+      /**
+       * Fired when a command got an error executing the run function
+       * @event Client#aghanim:command:error
+       * @param {object} err - Error
+       * @param {object} msg - Eris Message object
+       * @param {args} args - Args object
+       * @param {Client} client - Client instance
+       * @param {Command} command - Command
+       */
+      this._logger.error(`${command.name} - ${err} - ${err.stack}`);
+      this.emit('aghanim:command:error', err, msg, args, this, command);
+      try {
+        await command.runHook('error', msg, args, this, command, err);
+      } catch (errhook) {
+        this._logger.error(`${command.name} - ${errhook} - ${errhook.stack}`);
+        this.emit('aghanim:command:error', errhook, msg, args, this, command);
+      }
+    }
+  }
+
+  /**
+   * Given a message, see if there is a command and process it if so.
+   * @param {Object} interaction - The interaction object recieved from Eris.
+   * @return {*} - Returns
+   */
+  async handleInteractionCreate(interaction) {
+    if (interaction instanceof Eris.CommandInteraction) {
+      const interactionCommand = this.interactionCommands.find(
+        (interactionCommand) =>
+          interactionCommand.name === interaction.data.name
+      );
+      if (!interactionCommand) {
+        this._logger.warn(
+          `Command interaction triggered but the runner was not found: ${interaction.data.name}`
+        );
+        /**
+         * Fired when an interaction command is triggered but the runner was not found
+         * @event Client#aghanim:command-interaction:triggered-not-found
+         * @param {object} interaction - Error
+         * @param {Client} client - Client instance
+         * @param {Command} interactionCommand - Interaction command
+         */
+        this.emit(
+          'aghanim:command-interaction:triggered-not-found',
+          interaction,
+          this,
+          interactionCommand
+        );
+        return;
+      }
+      interaction.user = interaction.user || interaction.member.user;
+      this._logger.debug(
+        `Command interaction triggered: ${interactionCommand.name}`
+      );
+      /**
+       * Fired when an interaction command is triggered
+       * @event Client#aghanim:command-interaction:triggered
+       * @param {object} interaction - Error
+       * @param {Client} client - Client instance
+       * @param {Command} interactionCommand - Interaction command
+       */
+      this.emit(
+        'aghanim:command-interaction:triggered',
+        interaction,
+        this,
+        interactionCommand
+      );
+      try {
+        await interactionCommand.runHook(
+          'trigger',
+          interaction,
+          this,
+          interactionCommand
+        );
+        interactionCommand.customOptions &&
+          interactionCommand.customOptions.defer &&
+          (await interaction.defer());
+
+        if (
+          interactionCommand.requirements &&
+          interactionCommand.requirements.length
+        ) {
+          for (const requirement of interactionCommand.requirements) {
+            if (
+              !(await requirement.validate(
+                interaction,
+                this,
+                interactionCommand,
+                requirement
+              ))
+            ) {
+              if (requirement.response) {
+                switch (typeof requirement.response) {
+                  case 'string': {
+                    return await interaction.createMessage(
+                      requirement.response
+                    );
+                    break;
+                  }
+                  case 'object': {
+                    return await interaction.createMessage(
+                      requirement.response
+                    );
+                    break;
+                  }
+                  case 'function': {
+                    const interactionResponse = await requirement.response(
+                      interaction,
+                      this,
+                      interactionCommand,
+                      requirement
+                    );
+                    return (
+                      interactionResponse &&
+                      (await interaction.createMessage(interactionResponse))
+                    );
+                    break;
+                  }
+                  default:
+                    break;
+                }
+              } /*else if(requirement.run){
+								switch (typeof requirement.response) {
+									case 'string':{
+										return interaction.response
+										break;
+									}
+									case 'function':{
+										return interaction.response(interaction, this, interactionCommand, requirement)
+										break;
+									}
+									default:
+										return interaction.run(interaction, this, interactionCommand, requirement)
+										break;
+								}
+							}*/
+            }
+          }
+        }
+        this._logger.debug(
+          `Command interaction executing: ${interactionCommand.name}`
+        );
+        /**
+         * Fired when an interaction command runner go to be executed
+         * @event Client#aghanim:command-interaction:executing
+         * @param {object} interaction - Error
+         * @param {Client} client - Client instance
+         * @param {Command} interactionCommand - Interaction command
+         */
+        this.emit(
+          'aghanim:command-interaction:executing',
+          interaction,
+          this,
+          interactionCommand
+        );
+        await interactionCommand.run(interaction, this, interactionCommand);
+        this._logger.info(
+          `Command interaction executed: ${interactionCommand.name}`
+        );
+        /**
+         * Fired when an interaction command runner was executed
+         * @event Client#aghanim:command-interaction:executed
+         * @param {object} interaction - Error
+         * @param {Client} client - Client instance
+         * @param {Command} interactionCommand - Interaction command
+         */
+        this.emit(
+          'aghanim:command-interaction:executed',
+          interaction,
+          this,
+          interactionCommand
+        );
+        this._logger.debug(
+          `Command interaction running hook: execute: ${interactionCommand.name}`
+        );
+        await interactionCommand.runHook(
+          'execute',
+          interaction,
+          this,
+          interactionCommand
+        );
+        this._logger.debug(
+          `Command interaction run hook: execute: ${interactionCommand.name}`
+        );
+      } catch (err) {
+        /**
+         * Fired when a command got an error executing the run function
+         * @event Client#aghanim:command:error
+         * @param {object} err - Error
+         * @param {object} msg - Eris Message object
+         * @param {args} args - Args object
+         * @param {Client} client - Client instance
+         * @param {Command} command - Command
+         */
+        this._logger.error(
+          `Command interaction error: ${interactionCommand.name} - ${err.message} - ${err.stack}`
+        );
+        /**
+         * Fired when an interaction command had an error
+         * @event Client#aghanim:command-interaction:error
+         * @param {object} interaction - Error
+         * @param {Client} client - Client instance
+         * @param {Command} interactionCommand - Interaction command
+         */
+        this.emit(
+          'aghanim:command-interaction:error',
+          err,
+          interaction,
+          this,
+          interactionCommand
+        );
+        try {
+          await interactionCommand.runHook(
+            'error',
+            interaction,
+            this,
+            interactionCommand,
+            err
+          );
+        } catch (errhook) {
+          this._logger.error(
+            `Command interaction run hook: error: ${interactionCommand.name} - ${errhook.message} - ${errhook.stack}`
+          );
+          this.emit(
+            'aghanim:command-interaction:error',
+            errhook,
+            interaction,
+            this,
+            interactionCommand
+          );
+        }
+      }
+    }
+  }
+
+  handleEvent(eventname) {
+    return (...args) => {
+      Object.keys(this.components)
+        .map((componentName) => this.components[componentName])
+        .filter((component) => component[eventname] && component.enable)
+        .forEach(async (component) => {
+          try {
+            await component[eventname](...args, this);
+          } catch (err) {
+            this._logger.error(
+              `${component.constructor.name} (${eventname}) - ${err}`
+            );
+            /**
+             * Fired when a component get an error to be executed
+             * @event Client#aghanim:component:error
+             * @param {object} err - Error
+             * @param {string} eventname - Name of Eris event
+             * @param {Client} client - Client instance
+             * @param {Component} component - Component
+             */
+            this.emit(
+              'aghanim:component:error',
+              err,
+              eventname,
+              this,
+              component
+            );
+          }
+        });
+    };
+  }
+
+  /**
+   * Extend default args object.
+   * @param {args} args - Args object.
+   * @param {msg} msg - Eris Message.
+   * @param {Client} client - Client instance.
+   */
+  extendCommandArgs(
+    args,
+    msg,
+    client
+  ) {} /* eslint class-methods-use-this: "off" */
+
+  _addFromDirectory(dirname, func) {
+    if (!dirname.endsWith('/')) dirname += '/';
+    const pattern = `${dirname}*.js`;
+    const filenames = glob.sync(pattern);
+    filenames.forEach((filename) => func(filename));
+  }
+
+  /**
+   * Register a command to the client.
+   * @param {Command | object} command - The command to add to the bot.
+   * @returns {Command} - Command added
+   */
+  addCommand(command) {
+    /* eslint consistent-return:"off" */
+    if (!(command instanceof Command) && typeof command === 'object') {
+      // allow command as object and create it
+      command = new Command(command);
+    }
+    if (!(command instanceof Command)) throw new TypeError('Not a command'); // throw error if not a Command instance or class extending of command
+    if (!this.categories.find((c) => c.name === command.category)) {
+      // Check category exists or assing default category
+      command.category = DEFAULT_CATEGORY;
+      this._logger.warn(
+        `Category not found for ${command.name}. Established as ${DEFAULT_CATEGORY}`
+      );
+    }
+    command.client = this; // inject client on command
+    const { requirements } = command;
+    command.requirements = []; // reset command.requirements
+    mapCommandRequirement(
+      this,
+      command,
+      requirements
+    ); /* eslint no-use-before-define: "off" */
+
+    // Check if command exists already and throw error or add to client
+    if (!command.childOf) {
+      const commandExists = this.commands.find((c) =>
+        c.names.some((cname) =>
+          [command.name, ...command.aliases].includes(cname)
+        )
+      );
+      if (commandExists) {
+        this._logger.error(`Command exists: ${command.name}`);
+      } else {
+        this.commands.push(command);
+        this._logger.debug(`Command added: ${command.name}`);
+        return command;
+      }
+    } else {
+      // Find parent command and add to client
+      const parent = this.commands.find((c) =>
+        c.names.includes(command.childOf)
+      );
+      if (!parent) {
+        throw new Error(
+          `Parent command ${command.childOf} not found for ${command.name}`
+        );
+      } else {
+        if (command.category !== parent.category) {
+          // Set category as parent category if is different
+          command.category = parent.category;
+          this._logger.warn(
+            `${command.category} not same upcomand! Established as ${parent.category}`
+          );
+        }
+        command.parent = parent;
+        parent.childs.push(command);
+        this._logger.debug(
+          `Subcommand added: ${command.name} from ${parent.name}`
+        );
+        return command;
+      }
+    }
+  }
+
+  /**
+   * Load all the JS files in a directory and attempt to load them each as commands.
+   * @param {string} dirname - The location of the directory.
+   */
+  addCommandDir(dirname) {
+    this._addFromDirectory(dirname, (filename) =>
+      this.addCommandFile(filename)
+    );
+  }
+
+  /**
+   * Load a command exported from a file.
+   * @param {string} filename - The location of the file.
+   * @returns {Command} - Command added.
+   */
+  addCommandFile(filename) {
+    try {
+      const commandLoaded = reload(filename);
+      const command = this.addCommand(commandLoaded);
+      if (command) {
+        command.filename = filename;
+      }
+      return command;
+    } catch (err) {
+      this._logger.error(`${err.stack} on ${filename}`);
+    }
+  }
+
+  /**
+   * Add a Command {@link Category}
+   * @param {string} name - Name for Category
+   * @param {string} help - Help Message
+   * @param {object} options - Options
+   * @param {object} options.hide - Options
+   * @param {object} options.restrict - Options
+   */
+  addCategory(name, help, options) {
+    const category = new Category(name, help, options);
+    if (this.categories.find((c) => c.name === category.name)) {
+      this._logger.error(`${category.name} exists`);
+    } else {
+      this.categories.push(category);
+      this._logger.debug(`Category added: ${category.name}`);
+    }
+  }
+
+  /**
+   * Add a Component
+   * @param {Component | object} component - Component {@link Component}
+   * @returns {Component} - Component added
+   */
+  addComponent(component, options) {
+    if (!(component instanceof Component) && typeof component === 'object') {
+      // allow load components as object
+      const componentObject = component;
+      if (!componentObject.name)
+        throw new TypeError(
+          `Component as object require an name => ${JSON.stringify(
+            componentObject
+          )}`
+        );
+      component = class extends Component {
+        constructor(client, options) {
+          super(client, options);
+          if (typeof componentObject.constructor === 'function') {
+            componentObject.constructor(client, options);
+          }
+        }
+      };
+      Object.defineProperty(component, 'name', { value: componentObject.name });
+      Object.keys(componentObject)
+        .filter((key) => key !== 'name')
+        .forEach((key) => (component.prototype[key] = componentObject[key]));
+    }
+    if (!(component.prototype instanceof Component))
+      throw new TypeError(`Not a Component => ${component}`);
+    if (this.components[component.name]) {
+      throw new Error(`Component exists => ${component.name}`);
+    }
+    try {
+      const instanceComponent = new component(
+        this,
+        options
+      ); /* eslint new-cap: "off" */
+      if (instanceComponent.enable) {
+        instanceComponent.name = component.name;
+        this.components[component.name] = instanceComponent;
+        this._logger.debug(`Component Added: ${component.name}`);
+        return this.components[component.name];
+      } else {
+        this._logger.warn(`Component Disabled: ${component.name}`);
+      }
+    } catch (err) {
+      this._logger.error(`${component.name} - ${err}`);
+    }
+  }
+
+  /**
+   * Add component from file
+   * @param {string} filename Path to file
+   * @returns {Component} Component added
+   */
+  addComponentFile(filename) {
+    try {
+      const componentClass = reload(filename);
+      const component = this.addComponent(componentClass);
+      if (component) {
+        component.filename = filename;
+      }
+      return component;
+    } catch (err) {
+      this._logger.error(`${err} on ${filename}`);
+    }
+  }
+
+  /**
+   * Add components from a directory
+   * @param {string} dirname Path to load components
+   */
+  addComponentDir(dirname) {
+    this._addFromDirectory(dirname, (filename) =>
+      this.addComponentFile(filename)
+    );
+  }
+
+  /**
+   * Define a requirement that can be added by commands
+   * @param  {(CommandRequirementObject|CommandRequirementFunction)} requirement - Requirement to define
+   */
+  addCommandRequirement(requirement) {
+    if (typeof requirement === 'object' && requirement.type) {
+      this._commandsRequirements[requirement.type] = requirement;
+      return requirement;
+    } else if (typeof requirement === 'function') {
+      this._commandsRequirements[requirement.name] = requirement;
+      return requirement;
+    } else {
+      this._logger.error('Error adding command requirement');
+    }
+  }
+
+  /**
+   * Add command requirement from file
+   * @param {string} filename Path to file
+   * @returns {CommandRequirement} CommandRequirement added
+   */
+  addCommandRequirementFile(filename) {
+    try {
+      const requirementLoaded = reload(filename);
+      if (typeof requirementLoaded === 'function')
+        Object.defineProperty(requirementLoaded, 'name', {
+          value: path.basename(filename, '.js')
+        });
+      const requirement = this.addCommandRequirement(requirementLoaded);
+      if (requirement) {
+        requirement.filename = filename;
+      }
+      return requirement;
+    } catch (err) {
+      this._logger.error(`${err} on ${filename}`);
+    }
+  }
+
+  /**
+   * Add command requirements from a directory
+   * @param {string} dirname Path to load command requirements
+   */
+  addCommandRequirementDir(dirname) {
+    this._addFromDirectory(dirname, (filename) =>
+      this.addCommandRequirementFile(filename)
+    );
+  }
+
+  /**
+   * Reloads all commands that were loaded via `addCommandFile` and
+   * `addCommandDir`. Useful for development to hot-reload commands as you work
+   * on them.
+   */
+  reloadCommands() {
+    this._logger.debug('Reloading commands...');
+    const commands = this.commands.reduce((filenames, command) => {
+      filenames.push(command.filename ? command.filename : command);
+      if (command.childs.length > 0) {
+        command.childs.forEach((subcommand) => {
+          filenames.push(
+            subcommand.filename ? subcommand.filename : subcommand
+          );
+        });
+      }
+      return filenames;
+    }, []);
+    this.commands = [];
+    commands.forEach((command) =>
+      typeof command === 'string'
+        ? this.addCommandFile(command)
+        : this.addCommand(command)
+    ); /* eslint no-confusing-arrow: 'off' */
+  }
+
+  /**
+   * Reloads all components that were loaded via `addComponentFile` and
+   * `addCommponentDir`. Useful for development to hot-reload commands as you work
+   * on them.
+   */
+  reloadComponents() {
+    this._logger.debug('Reloading components...');
+    const components = Object.keys(this.components)
+      .map((key) => this.components[key])
+      .reduce((filenames, component) => {
+        if (component.filename) {
+          filenames.push([
+            component.filename,
+            component.name || component.constructor.name
+          ]);
+        }
+        return filenames;
+      }, []);
+
+    components.forEach(([filename, name]) => {
+      delete this.components[name];
+      this.addComponentFile(filename);
+    });
+    this.handleEvent('ready')();
+  }
+
+  addInteractionCommand(command) {
+    if (!(command instanceof Command) && typeof command === 'object') {
+      // allow command as object and create it
+      command = new Command(command);
+    }
+
+    const { requirements = [] } = command;
+    command.requirements = requirements.map((requirement) => {
+      const resolvedRequirement = getCommandRequirement(
+        this,
+        command,
+        requirement
+      );
+      return resolvedRequirement;
+    });
+    mapCommandRequirement(
+      this,
+      command,
+      requirements
+    ); /* eslint no-use-before-define: "off" */
+
+    // reqs.forEach(req => {
+    // 	const requirement = getCommandRequirement(client, command, req)
+    // 	if(Array.isArray(requirement)){
+    // 		mapCommandRequirement(client, command, requirement)
+    // 	}else{
+    // 		command.addRequirement(requirement)
+    // 	}
+    // })
+
+    this.interactionCommands.push(command);
+  }
+
+  /**
+   * Load all the JS files in a directory and attempt to load them each as commands.
+   * @param {string} dirname - The location of the directory.
+   */
+  addInteractionCommandDir(dirname) {
+    this._addFromDirectory(dirname, (filename) =>
+      this.addInteractionCommandFile(filename)
+    );
+  }
+
+  /**
+   * Load a command exported from a file.
+   * @param {string} filename - The location of the file.
+   * @returns {Command} - Command added.
+   */
+  addInteractionCommandFile(filename) {
+    try {
+      const commandLoaded = reload(filename);
+      const command = this.addInteractionCommand(commandLoaded);
+      if (command) {
+        command.filename = filename;
+      }
+      return command;
+    } catch (err) {
+      this._logger.error(`${err.stack} on ${filename}`);
+    }
+  }
+
+  reloadCommandRequirements() {
+    this._logger.debug('Reloading command requirements...');
+    const filenamesRequirement = Object.keys(this._commandsRequirements)
+      .map((key) => this._commandsRequirements[key])
+      .reduce((filenames, requirement) => {
+        if (requirement.filename) {
+          filenames.push(requirement.filename);
+        }
+        return filenames;
+      }, []);
+    // this._commandsRequirements = {}
+    filenamesRequirement.forEach((filename) =>
+      this.addCommandRequirementFile(filename)
+    );
+  }
+
+  /**
+   * Checks the list of registered commands and returns one whch is known by a
+   * given name, either as the command's name or an alias of the command.
+   * @param {string} command - The name of the command to look for.
+   * @param {string} subcommand - The name of the subcommand to look for.
+   * @return {Command|undefined}
+   */
+  getCommandByName(command, subcommand) {
+    const cmd = this.commands.find((c) => c.names.includes(command));
+    if (!cmd) return;
+    if (subcommand) {
+      const scmd = cmd.childs.find((c) => c.names.includes(subcommand));
+      return scmd || cmd;
+    }
+    return cmd;
+  }
+
+  /***
+   * Returns the appropriate prefix string to use for commands based on a
+   * certain message.
+   * @param {Object} msg - The message to check the prefix of.
+   * @return {string}
+   */
+  getPrefixForMessage(msg) {
+    return this.prefix;
+  }
+
+  /***
+   * Takes a message, gets the prefix based on the config of any guild it was
+   * sent in, and returns the message's content without the prefix if the
+   * prefix matches, and `null` if it doesn't.
+   * @param {Object} msg - The message to process
+   * @return {Array<String|null>}
+   **/
+  splitPrefixFromContent(msg) {
+    // Traditional prefix handling - if there is no prefix, skip this rule
+    const prefix = this.getPrefixForMessage(msg); // TODO: guild config
+    if (prefix !== undefined && msg.content.startsWith(prefix)) {
+      return { prefix, content: msg.content.substr(prefix.length) };
+    }
+    // Allow mentions to be used as prefixes according to config
+    const match = msg.content.match(this.mentionPrefixRegExp);
+    if (this.allowMention && match) {
+      // TODO: guild config
+      return { prefix: match[0], content: msg.content.substr(match[0].length) };
+    }
+    // we got nothing
+    return { prefix: undefined, content: msg.content };
+  }
+
+  /**
+   * Get Commands from a Category
+   * @param  {(string|string[])} categories - Category or list of these to search commands
+   * @return {Command[]|undefined} - Array of {@link Command} (include childs commands aka subcommands)
+   */
+  getCommandsOfCategories(categories) {
+    if (!Array.isArray(categories)) {
+      categories = [categories];
+    }
+    categories = categories.map((c) => c.toLowerCase());
+    const cmds = this.commands.filter((c) =>
+      categories.includes(c.category.toLowerCase())
+    );
+    return cmds.length > 0 ? cmds : undefined;
+  }
+
+  /**
+   * If returns true, allow default commands management and messageCreate Components functions.
+   * @param  {Eris.message} msg - Eris Message object
+   * @param  {Client} client - Client instance
+   * @return {boolean} - true = allow, false = omit
+   */
+  triggerMessageCreate(msg, client) {
+    return true;
+  }
+
+  /**
+   * @typedef EmbedMessageObject
+   * @see {@link https://abal.moe/Eris/docs/TextChannel#function-createMessage EmbedMessageObject}
+   */
+
+  /**
+   * Creators for Command Requirements
+   * @typedef {function} CommandRequirementsCreators
+   * @param {object} config - Object with requirement config
+   * @see {@link https://desvelao.github.io/aghanim/tutorial-6command-requirements.html Command Requirements Creators} config - Object with requirement config
+   * @returns {CommandRequirementObject}
+   */
+
+  /**
+   * Create args object and find command. Returns both.
+   * @typedef parseCommand
+   * @prop  {args} args - args object
+   * @prop  {Command|undefined} command - command
+   */
+
+  /**
+   * Create args object and find command. Returns both.
+   * @param  {Eris.message} msg - Eris Message object
+   * @returns {parseCommand} -
+   */
+  createCommandArgs(msg) {
+    const { prefix, content } = this.splitPrefixFromContent(msg);
+    if (typeof prefix !== 'string' || typeof content !== 'string') return;
+
+    const args = content.split(' ').map((word) => word.trim());
+
+    /**
+     * Message is spit for spaces (' ')
+     * @typedef args
+     * @prop {string} prefix - Message prefix
+     * @prop {string} content - Message content
+     * @prop {function} from - Splice message content from argument number to end message. fn(arg:number)
+     * @prop {function} until - Splice message content from begin until argument number. fn(arg:number)
+     * @prop {function} after - Same content. fn()
+     * @prop {Client} client - Client instance
+     * @prop {string} command - Command name
+     * @prop {(string|undefined)} subcommand - Subcommand name if exists
+     * @prop {array} - Each word form message is in a slot
+     */
+    args.prefix = prefix;
+    args.content = content;
+    args.from = (arg) => args.slice(arg).join(' ');
+    args.until = (arg) => args.prefix + args.slice(0, arg).join(' ');
+    args.after = args.from(1);
+    args.client = this;
+    args.command = args[0];
+    args.subcommand = args[1];
+    this.extendCommandArgs(args, msg, this);
+    return args;
+  }
+
+  async checkRequirements(msg, args, client, command) {
+    if (!command.enable) {
+      return false;
+    }
+    return command.requirements.reduce(async (result, requirement) => {
+      if (!(await result)) {
+        return Promise.resolve(false);
+      }
+      if (typeof requirement === 'object') {
+        const pass = await requirement.validate(
+          msg,
+          args,
+          client,
+          command,
+          requirement
+        );
+        if (pass === null) {
+          // ignore response/responseDM/run methods
+          return Promise.resolve(false);
+        } else if (!pass) {
+          // false/undefined do response/responseDM/run methods
+          if (['string', 'object'].includes(typeof requirement.response)) {
+            await this.createMessage(msg.channel.id, requirement.response); // Response to message
+          } else if (typeof requirement.response === 'function') {
+            const res = await requirement.response(
+              msg,
+              args,
+              client,
+              command,
+              requirement
+            );
+            await this.createMessage(msg.channel.id, res); // Response to message
+          } else if (
+            ['string', 'object'].includes(typeof requirement.responseDM)
+          ) {
+            await msg.author
+              .getDMChannel()
+              .then((channel) => channel.createMessage(requirement.responseDM)); // Response with a dm
+          } else if (typeof requirement.responseDM === 'function') {
+            const res = await requirement.responseDM(
+              msg,
+              args,
+              client,
+              command,
+              requirement
+            );
+            await msg.author
+              .getDMChannel()
+              .then((channel) => channel.createMessage(res)); // Response with a dm
+          } else if (typeof requirement.run === 'function') {
+            await requirement.run(msg, args, client, command, requirement); // Custom
+          }
+          return Promise.resolve(false);
+        }
+      }
+      return Promise.resolve(true); // result
+    }, Promise.resolve(true));
+  }
+}
+
+function getCommandRequirement(client, command, req) {
+  if (typeof req === 'string') {
+    if (builtinCommandRequirements[req]) {
+      const requirement = builtinCommandRequirements[req]({ command, client });
+      requirement.type = req;
+      return requirement;
+    } else if (client._commandsRequirements[req]) {
+      if (typeof client._commandsRequirements[req] === 'object') {
+        return client._commandsRequirements[req];
+      } else if (typeof client._commandsRequirements[req] === 'function') {
+        return client._commandsRequirements[req]({ command, client });
+      }
+    } else {
+      throw new Error(`String command requirement not found: ${req}`);
+    }
+  } else if (typeof req === 'object') {
+    if (builtinCommandRequirements[req.type]) {
+      const requirement = builtinCommandRequirements[req.type]({
+        ...req,
+        command,
+        client
+      });
+      requirement.type = req.type;
+      return requirement;
+    } else {
+      return req;
+    }
+  } else {
+    throw new TypeError(`Requirement: ${req} on ${command.name}`);
+  }
+}
+
+function mapCommandRequirement(client, command, reqs) {
+  reqs.forEach((req) => {
+    const requirement = getCommandRequirement(client, command, req);
+    if (Array.isArray(requirement)) {
+      mapCommandRequirement(client, command, requirement);
+    } else {
+      command.addRequirement(requirement);
+    }
+  });
+}
+
+module.exports = Client;
 
@@ -864,13 +1545,13 @@

Source: Client.js


diff --git a/Command.html b/Command.html index 8f286e2..4d25027 100644 --- a/Command.html +++ b/Command.html @@ -108,7 +108,9 @@
Parameters:
- The name of the command. If passed as an array, the first item of the array is used as the name and the rest of the items are set as aliases. + The name of the command. If passed as an + array, the first item of the array is used as the name and the rest of + the items are set as aliases. @@ -1023,7 +1025,7 @@
Properties:
Source:
@@ -1129,7 +1131,7 @@
Properties:
Source:
@@ -1238,7 +1240,7 @@
Properties:
Source:
@@ -1344,7 +1346,7 @@
Properties:
Source:
@@ -1450,7 +1452,7 @@
Properties:
Source:
@@ -1559,7 +1561,7 @@
Properties:
Source:
@@ -1665,7 +1667,7 @@
Properties:
Source:
@@ -1877,7 +1879,7 @@
Properties:
Source:
@@ -1983,7 +1985,7 @@
Properties:
Source:
@@ -2007,7 +2009,8 @@

names - All names that can be used to invoke the command - its primary name in addition to its aliases. + All names that can be used to invoke the command - its primary name in +addition to its aliases. @@ -2045,7 +2048,7 @@

namesSource:
@@ -2154,7 +2157,7 @@
Properties:
Source:
@@ -2260,7 +2263,7 @@
Properties:
Source:
@@ -2372,7 +2375,7 @@
Properties:
Source:
@@ -2484,7 +2487,7 @@
Properties:
Source:
@@ -2607,6 +2610,115 @@
Properties:
+ +

scope

+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDescription
+ + +object +| + +undefined + + + + Custom props
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + @@ -2742,7 +2854,7 @@
Parameters:
Source:
@@ -2879,7 +2991,7 @@
Parameters:
Source:
@@ -2967,7 +3079,7 @@

errorSource:
@@ -3127,7 +3239,7 @@
Parameters:
Source:
@@ -3264,7 +3376,7 @@
Parameters:
Source:
@@ -3362,7 +3474,9 @@
Parameters:
- The Eris message object that triggered the command. For more information, see the Eris documentation: https://abal.moe/Eris/docs/Message + The Eris message object that triggered the command. + For more information, see the Eris documentation: + https://abal.moe/Eris/docs/Message @@ -3385,7 +3499,10 @@
Parameters:
- An array of arguments passed to the command, obtained by removing the command name and prefix from the message, then splitting on spaces. To get the raw text that was passed to the command, use `args.join(' ')`. + An array of arguments passed to the command, + obtained by removing the command name and prefix from the message, then + splitting on spaces. To get the raw text that was passed to the + command, use `args.join(' ')`. @@ -3408,7 +3525,8 @@
Parameters:
- client instance that recieved the message triggering the command. + client instance that recieved the message triggering the + command. @@ -3431,7 +3549,8 @@
Parameters:
- The name or alias used to call the command in the message. Will be one of the values of `this.names`. + The name or alias used to call the command in + the message. Will be one of the values of `this.names`. @@ -3472,7 +3591,7 @@
Parameters:
Source:
@@ -3516,13 +3635,13 @@
Parameters:

diff --git a/Command.js.html b/Command.js.html index 73242fa..6909e59 100644 --- a/Command.js.html +++ b/Command.js.html @@ -26,197 +26,216 @@

Source: Command.js

-
const CommandRequirements = require('./requirements')
-/** Class representing a command. */
-class Command {
-	/**
-   * Create a command.
-   * @class
-   * @param {string|Array} name - The name of the command. If passed as an
-   *     array, the first item of the array is used as the name and the rest of
-   *     the items are set as aliases.
-   * @param {object} options - Options of command
-   * @param {string} [options.category='Default'] - Category from this command
-   * @param {string} [options.help=''] - Description of command
-   * @param {string} [options.args=''] - The command arguments
-   * @param {boolean} [options.hide=false] - Hide command from default help command
-   * @param {boolean} [options.enable=true] - Enable/Disable the command
-   * @param {string} [options.childOf=undefined] - Parent command name
-   * @param {Array} [options.requirements=[]] - Requirements are mapped in client.addCommand
-   * @param {object} [options.hooks = {}] - Command hooks.
-   * @param {Array<function>} [options.hooks.pre=[]] - Hook pre run command.
-   * @param {Array<function>} [options.hooks.executed=[]] - Hook after run command.
-   * @param {Array<function>} [options.hooks.error=[]] - Hook fired when there an error with execution command.
-   * @param {object} [options.custom={}] - Define custom methods or properties to copy to command.
-   * @param {Command~run} run - The function to be called when the command is executed.
-   * @param {string | function | EmbedMessageObject } response - Response to command. Ignore run function.
-   * @param {string | function | EmbedMessageObject } responseDM - DM response to command. Ignore run function.
-   */
-	constructor(name, options = {}, run) {
-		if (Array.isArray(name)) {
-			/** @prop {string} - Name of Command */
-			[this.name] = name.splice(0, 1)
-			/** @prop {string[]} - Command aliases */
-			this.aliases = name
-		} else if(typeof(name) === "string") {
-			this.name = name
-			this.aliases = []
-		} else if(typeof(name) === "object") {
-			options = name
-			if (Array.isArray(options.name)) {
-				[this.name] = options.name.splice(0, 1)
-				this.aliases = options.name
-			} else if(typeof(options.name) === "string") {
-				this.name = options.name
-				this.aliases = []
-			}
-		}
-		if (!this.name) throw new Error('Name is required')
-		/** @prop {Command~run} - Run function of command */
-		this.run = run || options.run || async function(){}
-		/** @prop {string} - Description of command */
-		this.help = options.help || ''
-		/** @prop {string | EmbedMessageObject | function } - Response of command. If it exists, ignore run function. If function (msg, args, client, commad) */
-		this.response = options.response || ''
-		/** @prop {string | EmbedMessageObject | function } - Response of command with a direct message. If it exists, ignore run function. If function (msg, args, client, commad) */
-		this.responseDM = options.responseDM || ''
-		/** @prop {Command | undefined} - Parent Command */
-		this.parent = undefined
-		/** @prop {Command[]} - Subcommands of Command. */
-		this.childs = []
-		/** @prop {array} - Command Requirements */
-		this.requirements = Array.isArray(options.requirements) ? options.requirements : [] // These requirements are mapped in client.addCommand
-		/** @prop {object} - Command Hooks */
-		this.hooks = {
-			prereq: [], // Fired before check reqiurements
-			prerun: [], // Fired before run command
-			executed: [], // Fired after command is run
-			error: [] // Fired when there is an error running pre/executed hooks and response/run methods
-		}
-		if(options.hooks && typeof(options.hooks) === 'object'){
-			Object.keys(this.hooks).forEach(key => {
-				const hook = this.hooks[key]
-				if(typeof(hook) !== 'function') throw new TypeError(`${hook} is not a function on ${this.name}`)
-				this.addHook(key, hook)
-			})
-		}
-		/** @prop {string|undefined} - Name of uppercomand */
-		this.childOf = options.childOf
-		/** @prop {string} - Command category. It should exist if not, will be 'Default' */
-		this.category = options.category || 'Default'
-		/** @prop {string} - Arguments for a command */
-		this.args = options.args || ''
-		/** @prop {boolean} - Hide to default help command */
-		this.hide = options.hide !== undefined ? options.hide : false // Hide command from help command
-		/** @prop {boolean} - Enable/Disable the command */
-		this.enable = options.enable !== undefined ? options.enable : true // Enable or disable command
-		/** @prop {Client} - Client instance */
-		this.client = undefined
-		/** @prop {object | undefined} - Custom props */
-		this.custom = undefined
-	}
-
-	/**
-    * @callback Command~run
-    * A function to be called when a command is executed. Accepts information
-    * about the message that triggered the command as arguments.
-    * @param {Eris.Message} msg - The Eris message object that triggered the command.
-    *     For more information, see the Eris documentation:
-    *     {@link https://abal.moe/Eris/docs/Message}
-    * @param {args} args - An array of arguments passed to the command,
-    *     obtained by removing the command name and prefix from the message, then
-    *     splitting on spaces. To get the raw text that was passed to the
-    *     command, use `args.join(' ')`.
-	* @param {Client} client client instance that recieved the message triggering the
-    *     command.
-    * @param {Command} command - The name or alias used to call the command in
-    *     the message. Will be one of the values of `this.names`.
-    */
-
-	/**
-	* All names that can be used to invoke the command - its primary name in
-	* addition to its aliases.
-	* @return {Array<string>}
-	*/
-	get names() {
-		return [this.name, ...this.aliases]
-	}
-
-	/** Add a requirement
-	* @param {object} requirement - Requirement to add. Inject a method to remove it.
-	*/
-	addRequirement(requirement) {
-		requirement.remove = () => this.removeRequirement(requirement)
-		this.requirements.push(requirement)
-		if(requirement.init){
-			requirement.init(this.client, this, requirement)
-		}
-	}
-
-	/** Remove a requirement
-	* @param {object} requirement - Requirement to remove.
-	*/
-	removeRequirement(requirement) {
-		this.requirements = this.requirements.filter(req => req !== requirement)
-	}
-
-	/**
-	 * Command hook
-	 * @callback CommandHook 
-	 * @param {Eris.Message} msg - Eris message 
-	 * @param {args} args - Arguments
-	 * @param {Client} client - Eris message 
-	 * @param {Command} command - Command
-	 */
-
-	/** Add a hook
-	* @param {string} hookname - Hook name.
-	* @param {CommandHook} hook - Hook to add.Inject a method to remove it.
-	*/
-	addHook(hookname, hook){
-		if(!this.hooks[hookname]){throw new Error(`Add command hook error: ${hookname} not defined on ${this.name} command`)}
-		hook.remove = () => this.removeHook(hookname, hook)
-		this.hooks[hookname].push(hook)
-	}
-
-	/** Remove a hook
-	* @param {string} hookname - Hook name.
-	* @param {CommandHook} hook - Hook to remove.
-	*/
-	removeHook(hookname, hook){
-		if(!this.hooks[hookname]){throw new Error(`Add command hook error: ${hookname} not defined on ${this.name} command`)}
-		this.hooks[hookname] = this.hooks[hookname].filter(h => h !== hook)
-	}
-
-	runHook(hookname, ...args){
-		this.hooks[hookname].forEach(hook => hook(...args))
-	}
-
-	/** Throw a command error */
-	error(message) {
-		throw new Error(message)
-	}
-}
-
-/**
- * @typedef CommandRequirementObject
- * @prop {string} type - Type requirement
- * @prop {function} condition - If returns false, do first of response/resposneDM/run
- * @prop {string|function|undefined} response - Reply with this response
- * @prop {string|function|undefined} responseDM - Reply with this response by direct message
- * @prop {function|undefined} run - Run this custom function
- * @prop {function|undefined} init - Run when requirement is added to command
- */
-
- /**
- * @callback CommandRequirementFunction
- * @param {object} config - Config requirement
- * @param {Command} config.command - Command
- * @param {Client} config.command - Client
- * @returns {CommandRequirementObject|Array<CommandRequirementObject>}
- */
-
-module.exports = Command
+            
const CommandRequirements = require('./requirements');
+/** Class representing a command. */
+class Command {
+  /**
+   * Create a command.
+   * @class
+   * @param {string|Array} name - The name of the command. If passed as an
+   *     array, the first item of the array is used as the name and the rest of
+   *     the items are set as aliases.
+   * @param {object} options - Options of command
+   * @param {string} [options.category='Default'] - Category from this command
+   * @param {string} [options.help=''] - Description of command
+   * @param {string} [options.args=''] - The command arguments
+   * @param {boolean} [options.hide=false] - Hide command from default help command
+   * @param {boolean} [options.enable=true] - Enable/Disable the command
+   * @param {string} [options.childOf=undefined] - Parent command name
+   * @param {Array} [options.requirements=[]] - Requirements are mapped in client.addCommand
+   * @param {object} [options.hooks = {}] - Command hooks.
+   * @param {Array<function>} [options.hooks.pre=[]] - Hook pre run command.
+   * @param {Array<function>} [options.hooks.executed=[]] - Hook after run command.
+   * @param {Array<function>} [options.hooks.error=[]] - Hook fired when there an error with execution command.
+   * @param {object} [options.custom={}] - Define custom methods or properties to copy to command.
+   * @param {Command~run} run - The function to be called when the command is executed.
+   * @param {string | function | EmbedMessageObject } response - Response to command. Ignore run function.
+   * @param {string | function | EmbedMessageObject } responseDM - DM response to command. Ignore run function.
+   */
+  constructor(name, options = {}, run) {
+    if (Array.isArray(name)) {
+      /** @prop {string} - Name of Command */
+      [this.name] = name.splice(0, 1);
+      /** @prop {string[]} - Command aliases */
+      this.aliases = name;
+    } else if (typeof name === 'string') {
+      this.name = name;
+      this.aliases = [];
+    } else if (typeof name === 'object') {
+      options = name;
+      if (Array.isArray(options.name)) {
+        [this.name] = options.name.splice(0, 1);
+        this.aliases = options.name;
+      } else if (typeof options.name === 'string') {
+        this.name = options.name;
+        this.aliases = [];
+      }
+    }
+    if (!this.name) throw new Error('Name is required');
+    /** @prop {Command~run} - Run function of command */
+    this.run = run || options.run || async function () {};
+    /** @prop {string} - Description of command */
+    this.help = options.help || '';
+    this.description = options.description || '';
+    this.options = options.options || undefined;
+    this.customOptions = options.customOptions || undefined;
+    /** @prop {string | EmbedMessageObject | function } - Response of command. If it exists, ignore run function. If function (msg, args, client, commad) */
+    this.response = options.response || '';
+    /** @prop {string | EmbedMessageObject | function } - Response of command with a direct message. If it exists, ignore run function. If function (msg, args, client, commad) */
+    this.responseDM = options.responseDM || '';
+    /** @prop {Command | undefined} - Parent Command */
+    this.parent = undefined;
+    /** @prop {Command[]} - Subcommands of Command. */
+    this.childs = [];
+    /** @prop {array} - Command Requirements */
+    this.requirements = Array.isArray(options.requirements)
+      ? options.requirements
+      : []; // These requirements are mapped in client.addCommand
+    /** @prop {object} - Command Hooks */
+    this.hooks = [];
+    [
+      'trigger',
+      'prereq', // Fired before check requirements
+      'prerun', // Fired before run command
+      'execute', // Fired after command is run
+      'error' // Fired when there is an error running pre/executed hooks and response/run methods
+    ].forEach((hookStep) => (this.hooks[hookStep] = []));
+    if (options.hooks && typeof options.hooks === 'object') {
+      Object.entries(options.hooks).forEach(([hookStep, hook]) => {
+        if (typeof hook !== 'function')
+          throw new TypeError(
+            `Hook ${hookStep} is not a function on ${this.name}`
+          );
+        this.addHook(hookStep, hook);
+      });
+    }
+    /** @prop {string|undefined} - Name of uppercomand */
+    this.childOf = options.childOf;
+    /** @prop {string} - Command category. It should exist if not, will be 'Default' */
+    this.category = options.category || 'Default';
+    /** @prop {string} - Arguments for a command */
+    this.args = options.args || '';
+    /** @prop {boolean} - Hide to default help command */
+    this.hide = options.hide !== undefined ? options.hide : false; // Hide command from help command
+    /** @prop {boolean} - Enable/Disable the command */
+    this.enable = options.enable !== undefined ? options.enable : true; // Enable or disable command
+    /** @prop {object | undefined} - Custom props */
+    this.scope = options.scope || { type: 'global' };
+    /** @prop {Client} - Client instance */
+    this.client = undefined;
+    /** @prop {object | undefined} - Custom props */
+    this.custom = undefined;
+  }
+
+  /**
+   * @callback Command~run
+   * A function to be called when a command is executed. Accepts information
+   * about the message that triggered the command as arguments.
+   * @param {Eris.Message} msg - The Eris message object that triggered the command.
+   *     For more information, see the Eris documentation:
+   *     {@link https://abal.moe/Eris/docs/Message}
+   * @param {args} args - An array of arguments passed to the command,
+   *     obtained by removing the command name and prefix from the message, then
+   *     splitting on spaces. To get the raw text that was passed to the
+   *     command, use `args.join(' ')`.
+   * @param {Client} client client instance that recieved the message triggering the
+   *     command.
+   * @param {Command} command - The name or alias used to call the command in
+   *     the message. Will be one of the values of `this.names`.
+   */
+
+  /**
+   * All names that can be used to invoke the command - its primary name in
+   * addition to its aliases.
+   * @return {Array<string>}
+   */
+  get names() {
+    return [this.name, ...this.aliases];
+  }
+
+  /** Add a requirement
+   * @param {object} requirement - Requirement to add. Inject a method to remove it.
+   */
+  addRequirement(requirement) {
+    requirement.remove = () => this.removeRequirement(requirement);
+    this.requirements.push(requirement);
+    if (requirement.init) {
+      requirement.init(this.client, this, requirement);
+    }
+  }
+
+  /** Remove a requirement
+   * @param {object} requirement - Requirement to remove.
+   */
+  removeRequirement(requirement) {
+    this.requirements = this.requirements.filter((req) => req !== requirement);
+  }
+
+  /**
+   * Command hook
+   * @callback CommandHook
+   * @param {Eris.Message} msg - Eris message
+   * @param {args} args - Arguments
+   * @param {Client} client - Eris message
+   * @param {Command} command - Command
+   */
+
+  /** Add a hook
+   * @param {string} hookname - Hook name.
+   * @param {CommandHook} hook - Hook to add.Inject a method to remove it.
+   */
+  addHook(hookname, hook) {
+    if (!this.hooks[hookname]) {
+      throw new Error(
+        `Add command hook error: ${hookname} not defined on ${this.name} command`
+      );
+    }
+    hook.remove = () => this.removeHook(hookname, hook);
+    this.hooks[hookname].push(hook);
+  }
+
+  /** Remove a hook
+   * @param {string} hookname - Hook name.
+   * @param {CommandHook} hook - Hook to remove.
+   */
+  removeHook(hookname, hook) {
+    if (!this.hooks[hookname]) {
+      throw new Error(
+        `Add command hook error: ${hookname} not defined on ${this.name} command`
+      );
+    }
+    this.hooks[hookname] = this.hooks[hookname].filter((h) => h !== hook);
+  }
+
+  runHook(hookname, ...args) {
+    this.hooks[hookname].forEach((hook) => hook(...args));
+  }
+
+  /** Throw a command error */
+  error(message) {
+    throw new Error(message);
+  }
+}
+
+/**
+ * @typedef CommandRequirementObject
+ * @prop {string} type - Type requirement
+ * @prop {function} condition - If returns false, do first of response/resposneDM/run
+ * @prop {string|function|undefined} response - Reply with this response
+ * @prop {string|function|undefined} responseDM - Reply with this response by direct message
+ * @prop {function|undefined} run - Run this custom function
+ * @prop {function|undefined} init - Run when requirement is added to command
+ */
+
+/**
+ * @callback CommandRequirementFunction
+ * @param {object} config - Config requirement
+ * @param {Command} config.command - Command
+ * @param {Client} config.command - Client
+ * @returns {CommandRequirementObject|Array<CommandRequirementObject>}
+ */
+
+module.exports = Command;
 
@@ -227,13 +246,13 @@

Source: Command.js


diff --git a/Component.html b/Component.html index 6b50142..40ea779 100644 --- a/Component.html +++ b/Component.html @@ -447,13 +447,13 @@
Properties:

diff --git a/Component.js.html b/Component.js.html index bbe9ed8..278f996 100644 --- a/Component.js.html +++ b/Component.js.html @@ -28,24 +28,24 @@

Source: Component.js

/** Representing a Component */
 class Component {
-	/**
-	* Extends Client
-	* @class
-	* @param {Client} client - Aghanim Client
-	* @param {object} options - Options
-	*/
-	constructor(client, options = {}) {
-		/** @prop {Client} - Client instance */
-		this.client = client
-		this.options = options
-		/** @prop {bolean} - Enable/Disable component */
-		this.enable = options.enable !== undefined ? options.enable : true
-	}
-
-	ready() { } /* eslint class-methods-use-this : "off" */
+  /**
+   * Extends Client
+   * @class
+   * @param {Client} client - Aghanim Client
+   * @param {object} options - Options
+   */
+  constructor(client, options = {}) {
+    /** @prop {Client} - Client instance */
+    this.client = client;
+    this.options = options;
+    /** @prop {bolean} - Enable/Disable component */
+    this.enable = options.enable !== undefined ? options.enable : true;
+  }
+
+  ready() {} /* eslint class-methods-use-this : "off" */
 }
 
-module.exports = Component
+module.exports = Component;
 
@@ -56,13 +56,13 @@

Source: Component.js


diff --git a/Logger.js.html b/Logger.js.html index 024a666..e5aed4b 100644 --- a/Logger.js.html +++ b/Logger.js.html @@ -26,12 +26,12 @@

Source: Logger.js

-
/** Class representing a command. */
-/** @typedef {object} Logger See {@link https://github.com/Geo1088/another-logger another-logger} */
-/** {@link https://github.com/Geo1088/another-logger another-logger} */
-const Logger = require('another-logger')
-
-module.exports = Logger
+            
/** Class representing a command. */
+/** @typedef {object} Logger See {@link https://github.com/Geo1088/another-logger another-logger} */
+/** {@link https://github.com/Geo1088/another-logger another-logger} */
+const Logger = require('another-logger');
+
+module.exports = Logger;
 
@@ -42,13 +42,13 @@

Source: Logger.js


diff --git a/fonts/OpenSans-Semibold-webfont.eot b/fonts/OpenSans-Semibold-webfont.eot deleted file mode 100644 index d8375dd0ab130207f023358d62ef6ff357108b7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20028 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 h1{iKYDIA5bqxNz - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fonts/OpenSans-Semibold-webfont.ttf b/fonts/OpenSans-Semibold-webfont.ttf deleted file mode 100644 index b3290843a7a3e621867b169c8487de9a8c7a8054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39476 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 F{{Vm_4C4R* diff --git a/fonts/OpenSans-Semibold-webfont.woff b/fonts/OpenSans-Semibold-webfont.woff deleted file mode 100644 index 28d6adee03b8d2301e06680fce413eb94887b57e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22908 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 G2><}8D24q1 diff --git a/fonts/OpenSans-SemiboldItalic-webfont.eot b/fonts/OpenSans-SemiboldItalic-webfont.eot deleted file mode 100644 index 0ab1db22e69ec331510563590527277ba5d68cc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20962 zcma%hWl$VUu;Ahji!Z*oE$$W;cXxLQ?wSO5cX!v|PH>mtL4vym_mKPE{d@Q8dTOeB z+G@Ibs-~xU_S67?YgGUM_P+rS_z$BYA;KZU!@|PD!05sP{^KdC{(%MT7=Qs#hX3UM z0|hVu@c-cRgg=A-ga0?s08{`j04spge@Yqvv;VOB|D~(|j)2bqbAU6z0bu!`2|7Ry z;PIc_;Xkg$e`^px`#&qU|Fl2kV?TmsE? z)2-|$(gXE~(%ml+=io6Tcy^AADM~B#I7H?lYIs@}6@;NQPs9^3Q_Y%NeNmrfRK8iu zoZe%~4sjD)79&kskK@hE&8xz-mpE~P*eWGT4{p1~=%*#7plTk6I2+bL2Nz1r zzzht|rw(!3wr4^9RljECGIH_5@bu2v{2ae(fkj&Oa6=4)pOBG1(TE^R7+`${o9LX; zM`#kv^b0VL z)znC5&kw-wVm!|63xp8~dmBJsiY0wvjSz#z#zIE}WckH+p35pu0*`B$q(qQV!&2v z{a#p>^q@u#ylIDaHb6B3vx~A|4KQ#bCh?F$muhJ~xjF&02b57UL7ag`I^Wp)%n}Dr zGh;QV9>8>t9jxK}a^L|nZ( zny%D3cgZa{RyY&)h(k^2`0Kjsmg~xXx{p^&siHF^Ly6)8`^ z1Ws)gci$U_@23V+$(Y|Sf+XRy0xjKE&qTKmz4T49bBdqmY%I)4rBHBCxkt7n(H!7p0r+6zClcHPk$F-Kh!V{kR852=r{;@#npWA+K~e$;BA zcbl~oSQiXOnW!lfk-?SReQj0$98HBx6~Yu^w6&9nh2URH8VSZ<)&FvCU}UUxsJy{r z*%+fhcH?rh@epCs1;PZL+J05m3iRU1k3SrFQBfl4tCD_4}+K_ zgt8bjF%+?smQoH)1uwjm-%S*UJPAISef^3`ha6LFJVR*K8D{9o#4&dr`_@j4mYAeW zTr+7(ZhjC3_rQ4@spU~)=UF9bPpUAC&%Fk$PEx3wT`zx+_IHQ?Lw~^Z771Qb6X({~-D?W)xqO=}Z3+Lc&`EY$n ziO4XU>7qqpjOHcvnpPOOe|9LE_&~GTk_eVn&O|kAv;yl&Gb3^!p$}_qC_oRt`ku)6 z0SCBsS09B?ecSj6&sz@n)a5Evg&^MeQ)q>u)C(%LQZQS}(m)O|@y3RqsLDDPrs$jv zYbx?K-Q0{I#pSq0#L3asdl@sFL)-D$S<-udasl7grrciJy3~w0Ni8aZn#%~nqc_7tAb|Wi?xN34OFBg0SJKhPF2MlS8o!6RyOph=2rd?BZ&PSt})gTec-r zKpjpzj_*3^FU#J993(q~VFwIg)4dgmfvAZX{w2c}&N2x(BR2Y~$T}*F1t{o<;o}>2 z)DB|f0Zcgz0&$evL(32a77CP6U8+EkjDHC3>j|qZHO1QeYn0_lEL;-tWc*ckTet_~ zgNQ1sxz=D539xSoLP7{JkA>cTdmJB~HIsE;j{cUTDD1G}Tbk1(aUQqTWY=I4*%D~n z!X}m@Z%O(UdZ@#McUr#^O2h&XZi$lgZ5`eZ^1jQMA>`^<(69&LbIE#zx*|64g;Q>= z4tsF?#nI&i!sP5*wVR?gVg{R_`0c%4^^^%m8jj507vYF6qfjA*GaOFn?Dn z<}_Tm!-SN%qt zumEOAa`0Y@zoJok_F9?a;pB5&`wTNrxtPPC^gG#-h#8tI99XKlz(3%AHD=4B&uvTe zdnVF=@IQ{V*)uec*m^?Frgq<_ZF#v}V&Yq8<$_TJ#9WYJECIn-H`hKS)|vB6WVmC& z%K(1aDJU#>zxG9dk7#&>f`1$#uAVa_A+xljL$Sc)SSjYaX9)E+21r_#@$!?zaWfG* zP8mp4AWS)$N7QIn9AWsmd$m{fUtv7_fC-{=kPkW$1!3TXKkNa7wqoyb_@Os zkBekxS?j?+&48i?WO0JXudI<2Z1j8xB&6Pg}7oU^vShNc9dE)9G|hb&ZdTEQux$q!v4U3DSopTP55M}? zFg6$O^%|3YBOw&4Z%6G6S}ByDfjG42C0P>TX{5G}d==gblBDVTQ6F09Fqhm+TD(USjQss_%i zZk9ehI6PXp-<47$J6^@L*3`lF(HuYAjNEI6n14Xgx+Ri zKffPE)_FU>qzC&tFUDhv*+3*({v&Raq89enoU>hk9Wn)QKg-hoZF z#N8Z6^=BZN3G-cK8iKrUD}`+1wo)k9)s7jJu0DwOl~FbhaadP#r+ ze*CP+Zyu?iXB1SnByR|70+c9?8&6GYunpVv+wlBe{IeSW`%-TBXa?U#VoIqV3IN`T zdyP_1p}0|EB=B_*rAzYPB^t)HU<@bmFI#-bUiQw;Dq}^tE0I5H|R3ZK7QWCW6l6uo_`hWD$Yi%jw4e|C7I0vC%MnQsp8K)3RPnKNy8&6 zH)l`jj-86QY!~}oJjjrWQz^MA%8FqSrASaI=#>4_W^f{oZ3m3{1;}i@C)2RQs9%gV zs3Sd6*O-?JZozu4GttOKoP;pNgC5(PKVMERZm-s~x=t)$HG^FhPe1H2S-XL%fl6pV zzKX?k7&!)mDYULZ&X!7WAUst;R|K9rkegHgBaJou2sLI;PdsY63AQr?nLZLF^vUl? zR7{Tr##xr+clO`H?tFBqSULFH3v~9R{JFU6`H)fu9z1io<}VmusbD1|nhDH9ePz)lF%~?|d{XI6$ctjV zP~nHatKCRcuAY%+)Jk1P_K;#op>m3V9`PlMPc*>`Z!i3{)6=aQo=rTAX=i$0W|8S zsxPk}-VuDD!I3l~1UPqsa#7fpIRynN5iCHzON&9nk5y4)3Znv+R8b@32eCM}JM8J% zT_!c|2JEyV^=CTe8fC$vCNu6FQLqOi0y?E(B4|uNj~^!iU{OgBLVl`2HiI=~4V|Ow zH=pAVQ?@yrA`u?zFT`iGT0-wk##eFbPG8=!GckIMZq@N?byOpgA4JkkobHe2l)RYF z=Z3aOjc0+xlK!LtJ(1z@?Q=KE?*_7juwf zEQY@!^t1|eAlzLAw7tiP)6e#!p1d^lXP-0}(->2=G6IrBq>jIuacmu5I1b8_T&#?K z!&GgsQY;TIfeuhp_tg#jt5W^busV^AXZk%ZB`>lvcAntY%b~x_foI<|!9)<4M}KdE zS{Ui`^Y|a^seS06+SLd(ls}{?rq;`?&S&w9dU9Dwd1gw{_p`lxnO!!6u++KjZ@x^q z=uv}q_fi$CnbveYxbl$zKPx*e@EI31a}%*H5H^%i1&;Vh1$Fb=8vJxL^75|pFH>py zZ$k5G2bPxPx=8`VFg@v1QlFcK^m}v-tC`R;<-!OzrA72WvH*4SH z^X&}VOGLo$O-ta~?nF^6JF`LajQjlQS2LKF>2x>$ql0TqjDJWPtS+yz&S|2By*~6U zCPX6e_lrGKzv3Bb=urfALS=WE!T#!0stf#IrhA7ZBS>(0D9!*!Qv*ZR#4L2V91W42 zglwDkQP!`ARgA`wEwE{k$c{ALv@A_Lg0$C&rN1KoWQNciLpHg zw}|hNEz(hkFD*Sys^Lcom9vDDYymLEjgsXqc!GDuV~V~>j*^4%a*Y&!*@PE4Ylth% zYYct+UR)YS*&LYjr3T?_+2Z{0A?pe?sR`+HCQ3fA|M}aFvMD@2_=Bwx|2#P%cgR0^ zS~%oojR{?N(0}Xg@lT3=q?mr(x^)Hl8a5QxUTGe}&SC{gqeH^q%!k@QT>dta)^E#i zg!>g&8DS5iO;12zBF$0w&L8T`Dp0uHMX7*vYhUPUdS621A$*-t1g0t3QHyN&174uO zX_*NH)ejKS=hc3@zUY>vl`uRPUYah66LGXrrwto~^U&q3Y>84xzYoODei*G5W5-P{ zFh|AOIuLG~TB zUETHjx5(ep)`*DB1`~y51I7KgnKt$Z*v=VPn%}4M=1S$bFOe6X$gOB2Rz}j3HNdkG z5PYPWGyS09eP{ZTNRwQ-)V0xEO09)NI8Sv1%M- zVT$qN>?9HCcyvfa0U`ofh)cYf>@cq^;)f%G&E2X^b*OmKY8^dZYy<(ikXJ< z+UEv2wAln04+7VJiUs%2L~;EqfKT_p3`ZtYwkL%_4pQ@{G&%{6fh$}MwevMZ8uJR4 zx-%GDwxviE=6ms@A0;Od2rmB!l-T3ADFv>_3DJD^0D6)(_zs@xM&-(U+vNd?v`T$2J_liVD-hS8H`H!&5UY-ws#Rsd7h35_i1Gr8Ep znhlV^IkF8U<$+6z0^BA~Sq$i~gE!@im5kIM2O~C9%s3|bL+wV*abpb79|GxEVnSFk zlyWEOz7W~ClyWYpNt;&C2PB}Eb~v#ztbm0rE$PWJcRsbGL_Apw8gv(q2UvB;Z2S-* zSv&Rkn2L`WAbBe{!sEll)?Sj_zN%Pj1fq_EU9~i31Qz=V*)D^o2l5YjJT`VFcQ}Su zPw1U7jXCw7#|oB$R9fnd_0+sAzZjYH7?3^iS6S|>SY_@MUq6aCNE!~UXibf9Y6x!5 z7v;+qF7`h;Aod|LWTQl*jo?it5_D25Ybe8aqeT1G561-<(4zD6Pp`w)-o!#lnVga>BwuA4*WdR=g6=fxm8Fqv8Y4zhWkk)Kf(Kh@<{@-lJ4K_EOrk?>Et9+f0q*sh7Cny&x+i-m}8lu&JOTW#v4B zL@l#S<5w!#3iXL*z$uHx8&U`=5A8NeKM=h|*8=t05xRHHeUJ-V=1f2@vMf~Ig&+Zi z2x**s-&tJPj01;SFw#gdvl~T%Bsh>r)s7q`y1pCp$t88hu?xK-9T-LkI=u`8j?I1a z6*5ZdS;q@05z*Y+dv+2FYpxcme3CM?9F}g9EzG(25XKEZv;MEfqTuYl3x_t(zR*pe zPYzmlrcuohXE1%2X3(xz)?g4CbQ^E%D~3Fzk+8-E|0+ zYZHGyA!P4~rNU>(^=FvZc^Auu4|5zc7SF((l(@@Hn5 zoexs0W#iA;&++1&6lsz4BK35P_$0E4&o`WNogs*SlcjdjzvW_bBr7iL1c8CDHvK^PJWHV)juxv^bpUjZ((ye}mni#oavY>P#e=Tmd2D0!(=wD)r ziX}(ji(-Ll@gkU|NVwfSs-nqSptA9YN15c8Pa;EApRBFA9tKEJd<6U>$I^c9OwnSB z)C~FzBLE>xZZ}%H`vHCc^4Iz9=*YP*sOkqo2OW#V<-%4H8*$0w4EN;xYbz&*POhl4 zVvmG|i5ugAtzX@41cokzQ|4OEBL2Hunbs!0$&i*;_2?vBSfq3 zx~6_<(G$Wegm(?`T?c`FHfhKr&M}T1v&Xl(%UZ$3#_fNG_m^uJNWTgL0Nh#fs8SIw z{8<^`>8K~j%QHi(f4Gfq`ZK}9e)N_S{VDWi`YkA6sAR62+1+o+m5SYpr}#LThhiPA zt)qo~Uv5ws5X!Hnpfxnrt1Aj{=={OFwl=O%XKJ!!+G&hCn2XT=r)TmUb?&YTIf1e( z9)AoMkB=}|Z|FU?b=@m+cw-V-#NzSb-cO=eF{wT+O?__IIQlgYI28Uz*-dxTlJ0iy&TGVJe zbH{y?SHxUXts?o=3U&QNZLV7EIx7__Gap8tDx(BbY*W5kJJ<(2XGuO&`6I>jMJ2$A z(2rqxS(u7nkp4DdwLQW*c;qSKou2dsX<=PABy!g1H%O(>HU+aVL&HoMAGq71Gkh|# z$|1izKXMXhe`)6#gCsB?mtww+&SeunokmR(hovK9-E;n-X*g^tt`MoG$qke5vZD#w zrL%42E9}gzZl>c7z%Cv;ZL_KUF-4F_W7~wdr;+41X2xuIWb~#!LO^@AzM)8@B*uN@!M}V~Jf= zCc-+FSN?wPM=r)GuCr2vuvO__ndm+ArO6pVFB$9CFscwFEOHq_Bj?Z`P6;TD*32HL(ku*grWe z$vQA^hX}%k=T5QnhmA7|2!#Ka!4d*0|K1x~j3TcK69g>tR`akAv6M49BfF@^&}X&T zhOia~pNK$+=V!ZcDFk7Ril^{w5A*EvL6^m$yQvh#=%3g@25o}qh3Se57_WqW}c zHL$dzoi!IYTlw|0?Oq~@ar2>4ZBAlVvLsy`3t~G^`H9qG4!;RG(hX_S8Pgxjp`%(? zC*{hswno{qzWn-ngInGSe+7vcuSkaa)ZxMz!X=#vbzF}0&Kll+6cX182`xbZ?w^D! z5v2r)Slm;=5fRCof1&ZvBLupC_yoCm4HD}vO`_`mMKai=bM$y#{AHj4#0fqv=SnQt z7@UWH3e66s*IrFzkZhyMnuyGVwYWse07Q~ra|O@FDVveSVk88J!$9yW)bZ4&jpShs zmmQ9V%`~A$CG)xZiY|vpZ%R6Xa7=1u-9Sc`_Ln019Y?JEN{j(3HcR%E!~ zbQslzkub_sWRN(cTeY&!qVGP(gzgSw@(g_Ucw9byK-PDQxnoPammAMBSeHGggAdE? zr~)DYye5d<@T`r+M|W~QGQ4Po9G9N`Z@w+bB z*ahiX=?MX4RE2y`XG{JZk*6#99Fs(bN5y%$0I_LqL1cum6n6JyHjyYz=S)-2T>N2s z3+^B9>S_7m_K0L`M#QYMKnBc7am^S;7?T{r+=f-wcAQ!;Nx>6pT`E;i6-i72&UWZv zIIW8UCn@3ryQ=pezwaH?<9N}WS=BcGB8h1?d(y<>onV64waJ+7$rt5P?aR~!5Rkeu ztW@v25=a!#Xtgf(Gu4qwhFsn$iPO0a-M8;~KK-3Wv>O#g8bf$%c?d+m@OsYj68y5j zw#(|YI$VPuF#ayjc%8%3mKlM^YXXlmB+NTlZuqt2GB%MF695xid(p7p1n3eCfVjAw z5Nguy3b0%PRBEFm9b;+C*_I2w@hqq9sx?w3wFQ;fCzdTI4C+mSd_8e*F0mvosMP=F zUu;vw)*IhBBLtHH<640 zPX$O(ln78`JKJbu()gkIna9mDXzs1L9FKo8o%^QOe-+o1zi}-I2fO&JJD=DQV4@`# z{}q%;(ak)oijI-2ud`*-L&VF1s=TpxnVD*>1 z$K?WZm^m7Q*M2U-dAxGxkZN%b40_YI9hJh2JLgo;bla)7#@o!Kzp+)!XC+Etlb>kb zN##B^Fk_?nGbu-x%RrS!+jeLR&A$+FV`W_uQ9i;AE2Z4q)qU43ak)kL^u<{EcN{Gq zhuG?TsA>l0<+lKQ$h^h((BZJu_u)a{_P3vsGuS{}Np|<|7%zj&#?u6Bh-E=-=~hFE zKMJU_3ZwyX{l}OHtD-)z9g8aT%Vg-#k%Fz^vJ3bIy9=caMiy>MSn&5L_0QD&Y~+LU z%^28XC~120MoALT%ZT;TV$DG0;EQ3(BtO`&I%2ACsO+YA09$U#VAENVbu9i*qlI`u zL#NtPI}>&0UkXd(`6ByAUz)UVjY#i;yV_>6-^jjjDGo~Dh|%A{H!!YJUdggFv$QJB zhX46F6g9of#qwVtHTR6~pxti|`}in5hO1oCivLdrVdC28--DBrfzn|19O}5dRxUgR zr$9bzmDW$(sO;#_#pxqym-fJci9!w*;h@pXg6H-yv2QjNj9By%F+n*>nrAO)E z8#*fa1d5#?M86^OMrTq(dv{r2V$wm~Rn7Tu6oNZs)=D%Eg<%2i(_%Gk#E|}74r@3@ z9&W?6Pu(Ijj%XzO-iROCL4=G~^=A~XsJ{6%ZY+Jw6jY2x;%|Fz)W0zYwy^Iz+C#O^1h17FR)*_YyH z&OTM(>Gawe+Zll*6h{3Ra}UJnap@eI$5Jh+Ck5+IX%$Y&a(@;pnrmQFPzoHh&4J2O zp!a?%3J~qO^MG)CIC#X!=H0K0VUdplGuS>TD5Sg~`_fJFo+W%{ph@F8JOVNI39S+* zY|c|Hki@%Zy2W3?2bLalpYk^MjcNV6Oq*bCl}0c}Mlom0+Jsa!&wwtX$hnu>6Fw7& z4DyE9EYHHIRHCa;hy@>2ZP~$d))$8Z#MJjwcv5_AIEq5WrVXA9qPMoMP%)L?!qqrWOnON@Cu)VYqjR|4=DrN z7khbs`cWD?X}k!5oZN*%GHDu#sg70;<9v-N;ByLy;6L(W&x+rx*=9>soNw`rWZUcz zxpSfzH(22@_(}EC_eo%=+@LI^kY3Do%_$xcI4RKWV&B4_7?P+#ir6dI0C zKSfeOI~i=*#~5b>s7{bZKOnJZe>5!pwgiVy3Ok6AU&x4$9WpF$&bvDYO^hW=j?X+E z_%K5d3)*0|sgxOtffvt{htZd3qhI@^x3_FrxOk+6J##`f*Zgp&m|uhc*=7cgrB~3>%USL>EF#QpwC zFoiogS>I%*Zi2e?Q`@H>qSR*R9_jmI_{J89hTZ~9>>xL76{&3ia)rgzcUs=xndic& zoIiMRuu{l#!gm$m?nu6e_$Mi5$W(C2TvjJM6ydTdyrsFY2KI**4Ox^)1>#fZbT8vCl89Y zx5*QObbA$Cxk6_XnaXzy?fx!T5Avy4*gj*J`n*k+h{{6CunBjLA|WL&?2_GM3DlW8 zmmep2>7V7jqh1cak)S;mhTWjOSR#2+q2w5`wm1*rWh`ie_Q&5N!-f6sb?{)c&h40(<*)X1l{(t-t; zfyUC|Z*R%#c&{N|H-kZed?t}kqvgPYxtX!Ug7{d=jtg^j5>LVdm1+W-lF*~V=U1*06&m|$5X7R> zFRd$UlOain@Y`$@@*9p7nbgv%IJo4rgdqm=)Fc+qtT;lAo)?p?T$kjBiSo;(vz&$) z;-HbPNp7Pj-J;oSWoLg`sv z=cCfE$y;x}^$Zu=Szpf!+5%iuJQZFvHH@Bv)WFHoxV7cMz0)-#mXwD5o>gp|%7=g$ zJsJ;9j_VcJTxa%8)p*Fqt5SzRhmHv*Cv(MSnQjX|)#i9B~ zyv?e04ZAnk+LRKOtOX9-1lGxVD3Qh_L0Y0XBXbg4g@RH$UW~i)( zy)1J*y=~wb({$tLq+gP~{^#oS+sK!64b%({>F|FD2YqtDDdcOb2tg5I1#fV`s<>!ZR!r z1ZiKW_;34R85*nv4#R3_dO61|g*D?UV^!RDRHB!mr#j?hqTg(yM-;gA|T!T6dUg`mpEOUhF(R=B{{LLTaZwSo03F-j`&&+Z*{PvCX?S%xTj2$Y&3(wXRH&R(&tsw(4O%#Y21fe^eXDeBxG*5s#2?EGbl`(}rlnWm z*wx?Qs2#iO{9r5lw*KsGoQT&hRD5dq>*#v{v!xO$EPB|um7WkFkOjuxLA?IciuTR2 ztOz4&FI>6hSwh*)?A9-S4LL*2ShOlx#gE{+@JO<-Ub9PbtJ%82V@o9+1iUQ>W#?NI1I z&v;es{Xw2tKrQUisDDo;kID**_u4sM7`=vs&=HM&h7p3RX5PzGdg-cWhqd6>ek!S9 zpO#Rh9M09qGeoanIODXLu^2HcE~2&RW3$bT&Ea! zgRTh?5(LKzUF%{}h*iJJM=$5m_OJPZ7fTP1d}; zI?dXImv2>qXHDe}&18>I{JfmY6cSniXN#sYqJMp8junW`LpgKc4aN<(mC|+EFVy`q zz5leq|FMrc@`WTTjEX>-z5m-dx9Z$LSt#+As7bHA$TgnaO-b~l4R_l}4oM+(}DWIOUKobA3 zRMM&Uw}th8zITU+qOKeGxA&$ei^utHbN}7zl?t$iC{QP*RdaU`e{al zRa;72p;{h2CzuGA(;mDSB#lZj5kSsivOo&-7D5T`LA+T=;{UWv!WiHDYVq1nxCpJ| z6`!`0*z4O8vf(tbgA2%00Y*>ccn%EFP8HP{T=N!JYs1^w(>Pw=Qg&Z#fH3_f@Q(gk zw>1}@lm%dhL5B*K=Ya)P3?$Ui5oD9J+pB?~ujJTC>@`11>QN3&_+DMD1CKt@4>-Xn z6Rsa%e>e5B&WpS#?X@P8f>10j2X3gC=j%{MQ>@_F;pwt`PEMN{fw=&xNM9K z7Ol2a`*51eTW}YF^(*Z88ava+#F_mkCuPL-psg_2_;dhfM(Gz6&>*w;mCY!rn==K- z&T5z1$T8?=J)rHLl_9PgnWiTx$sNbl(+ONmfcK9% z%dUeCt7g3A5no}LKtCK>O!-m#BwF)+r7#yuHHOf2srQ0ODH)CKMC8I@KIuJMc$$ov zP;z2Ko&_Cz^2OT;8u^U|3=L{m*|Xz=1#&qWO$|xP)j-R+%)~-B;6HKwuzBJ_GVs9w zrKFwhv{V+78+G634L%O#o{e~moyBu>5C@=x(WgR3N+Gzn&v_&PRLgH4t{_CpI=$GF zfV~~UC2f0g9>5V$kFhH`cM}55JiJbkh|HF&*u~kQl_IA{K75lU?Q=u&_KiWSVlHTV4OegsGq2|D=q0&-P2uckn;5BW^YymnZ+=iyaqOn+hR+r z<%xbt-Obf3^6AaO`To5>#=ne~@@flcy5o(X$!(M50!zSMT)y1xQE8*o94Y+50I(wuIjDWrila*e7gm>ke-MoEUr?MrHiH$z1 zPvwxsyYOXy1yNO;W9T(|92(x@m_mM!<_GD_;UEI%@;OOoyWI_n(-$M2(F@&L_PeTu z%N~A|qTRWuYs-?E`sJXNEffBTL#k9HLa18|%x9`t_W8bg0&mFoargqH{L<2!)qo50 zPaZH&6oH+(3?H7$5{vUg{U`a{cj9@&dU_JVWv4y$yN<8ogs~=2^2#=mg zT;Qe)6l~xyrSHf;g%SZEfgmCWYQk06*I%gpa&_a_cno}jqSfx#al@&FB3ZMcd}R+o zFBSEaC~qc+fBmn2jT?tWpXv4Ob;Ng+Ve>7WZacsJJ(CsvjCf>_uuvV?XV9a(W?^m= zch9{-_)zB6M%sE=G^BhpGA||XTRj`ywPT4jQ%jFP8qjUpsh}KRp;A&f2^T_HsgebY z-hx{!kn(e~e@-0Dl9H1jcL?Bv3z$np9}3h2!MW(O`=(2Wpum-1Eh&Kr^{#@OYV^!) z?+L7307Nqe>V9Q>h04V2A}%BxlaN4o(ZncZ6@Mk^c?O2WL2|4F5=kaYbV}OlT7JJd z3LHD7%njb+c(gaqFe1Fiz4I)+9>IxX7Se}doc?l|G_7o5=0(6UUMDgB*6+OOY}6VC zq@n94!{5L(+OKL^Q?@goDvYk;x)#ezPgDHRk$8<~HcchFpmx`B6JbtoEuvFlH@0C_ z|NRRDU`WLvS7bhGD>JvFj=K-PCu-7WUM=>5~az^pkSf?M~eh%xfm3%E$w0lL=?CxE)zw z7rmC7Do);fxT8_>E{K~VJhZ9U=<+dDa?+m5y0z)cNvbd8q9l~ts;&MiGe*u*IU(6& z{)9H}c)z>50m7{GWZ=z_eY)>{uC-$aH07H_`Vwy7aLLxl(VZ}2+CqXf9b6R*z~fYZ zu5v|1Vqbv{EZuim8z`?JyMq#gij%BOZkJ9|mR%))6G1#*J77?TbaPKAvQoz>BO^c^ z`UWqqkuHB2_?6~x?W^mM5ig7)CcI(}pZ_bP2*h}k2#oCK(4yw4cD$oEG9P3mBcnqH z6+x6p+^yob~pghjC2pR zRWidQ1Hq5W9Uuc#nB$IdxkbdcgKb_G=>ta`%{z<3AKxFeCiO`zM?%`715=!M z-AVJaAvjNQ+<=5Z74=oG`gb{6K9f#2low~EdBD2=MlyOXGft#HITs!&2eC$XLQC#* z3^EVc_!6uWZa`(!*vxpv4Zq!`8j}No#?9f0%Qwr?Ym2!HCP{S^q*VOCsTh8>yp}`^ z-?ijW$u~ykB|q8&9(wL_z3vyXhEg<#x696cpA~B)<(2MnGt%qFacJv+pYRJaBfe*7 zwaSU-hL%1LJc*!0Q3*^ecUsn>OX3)Vcc8t<4tTd2JsAQ~hmgFU7NU~i5RQE)?zE(8 znH7E_9F%ksjM5L)28+LgW&Hwa$p6AeMtengRk8ows=|sDZc0Y+A-Oqie=92VM)Gj_ zc7q@L9b~4_=7~QAtN7*?{n*Gfn~B_tn;(?EBp)lOoOkSK#70w8K0(L?4UREL@Ylsi zh3E9kxn8{hrRvY?m(2F7E=JDs_{)s3RB0ql5;fJ)6oT}a*;1I70te-(KYy|vy57HN zm3vrkJ{R*jE|?62kx)Si3ypm&cK%H=?+yI5&sMypq>G+PGMLQ0z(`{2Gq<$nIE|X zUx=O%6mI%lnlzlK-c;}|*>p&4Vww95qY96goYWujUO2Nd4w%tpo!o=f@6t$?VVKP^ zS26+fkSq3N2IQ6O?JAE`VlOXV!yait*fP^bW69hgqg@fXzgHpmw zg$~4Y-;{I{_IOqnnw{ixd=1V^YMB|;_lmidWEzG{Hav!>B$U!ZyDq!8%tyMfI~ZM0 zD5ZNGG%2;27ao#ZIn5~&scfYgr2;;yaPx(ZSQMX`+vcP_@R&W(THS28KbHy-j!G%R zFxs-FRfR;wgQlCR;$zTxeMJJ%BJc$Sneb90sQN36W4bSNU3x*-eR#bO;E&&lOC|K( zxDU&vPo}|*_t&vvlu{bJ3~_sCZ-ccuEPoU%z3{I3k)(O)1uZ)bP1m<=`L~ds`9-d! z|L#|9|MXNK_ibmrR%PMnZEkkwl63L#KU!7%A}_FT!cPr*TSd2=B%;=>z1MWlur zb&BhAC-Vuhg{(p%#%x{hq!=QRY=_^JKKdg(PW1`}+TI2gVF=GPV&4lN!ntxJ8d12$ zL2T>Y!cD&!WZinQ-=Ut*xA_scw?%{+K>W##5Ln-s@^&gpV&Z87=`V`J^Qa^Q1At)0 zeGH&+E~SDUeT=moBYyQY#)MuOR{{|_ioLh|%oA;Z9RRj|^!q(oBpq2hJXJ29rKmsi zV!wUDW(~2&p7yJvkkvs0_iH}N%n19)Tv6Npr7#0M6J$qASdBT9 zi7?KvrHo*`^G?>3XBuWS75C@lU(2)J*`c^JVweK!uWLoLfeO*~u5KC_QkZG<+}!xz z`^@%h#l*L9lgPE1ScloELZ1=738E%NEM1C<+zU8h`k_y^eKqpXXp2(wifC9dPC;f3 zsg&;munqL6q-6k!flkk`AYJAv+gE;De0@VJMBDwyYYcQv)RoFyOLRvW*uWvQ%U@WB zP~rblsnp^)%8h7?)rX7ohw;##Q?zasbs9&)0UO?mXLu!09}nq^cA6?qnTIwwgT3a8 zTUV|-9QU<(=?sxnm%Vx=j83B8TvfwXI`G97N!E0-%A^J|IqaveODg$P0_Dz)NERk^ z!`pQ4PWnFqO%by05Vb%S$`|l?%NYO=>K%wKMiV5MNKDsE`G7MZgt!u_$c1qjSvV$T zDG6wip&IHQXTCUS6tF#p4G57L9@t)0{b2MZAE8xf1ZnX!B&fNJ2lSF8>$hLG$3i3w zS80Go3o*#1`Nn1P@Yp*$8P|6^u9<{?uUf>17~IfGNLdQGRL55d>6iS{vzOT zP?nfjz=9z{waD-_VGRC?1S1eC29lcKx4zpuCg?Z)V0Abq<7E-N+)R2Oia|`|kjbt; zPaU=i-4*!s`~jXQZ^vPtjuYl^(;a`(Fvi9VO2M*FilAwijINMGGh}V-Nd*Ib;d%a$ z)7F3ws0hTk##tV#vMz(qkQmw-Q1PLA%Yk_c#){+`3>rUxI5q%>jWQ!>HR6BcnD{~2t{00=+s77k-#%T?mG}SfYPi#tDsX9rdb?9uZ4MQ79`A6N*_iQraF@D zB8h=HgqlREd4!zKgBZu8!$3k&-n7>g+o<)(WZaYN>=X$C8tW8J3*`|3LQUjXTb69_ zb_#2pd&xA3rXR9Qfb4XRUdhE~I{CW?#Pn$U(Xj1{*u)rOE%9k^)*7?~ z876MA_k~CYUgd7j4E% zsFk{p%&hrsZFw(YmN~Xp9MBa4RZ0@O&@L`VQ%(>9YuQDhVn3hc`5WUvJpyQZ2mxNK zz;LSXi$>Y=xMg<*LP|)$+OsAAQ1w~ypVKvzo}EhmfTP*~Fkl-Ibki@<6aqBXX1Gz# z^0X@S{H5Ben&U}LZ9Qf}{AuKXr?XF*!OV;!Ga|3Z&VypgD#FT624E)+4LlGAeDJ))!PRHXL*(MGSM1ThY3!iO7X6? z+~h>ZJ%;bc0tRzC9z-BDH`2B=u|Xv&jS2)|A0zH5aV4U71$v~ZE2alY+GmJu8-y6T z)a0Z>poS6k8-+)Y%x@t@NDZ2{*WK{-s73_tS}l>aN|g@Vw@My0w4*x2%e;3zkTMA} z^vdqP&Xq*oR82!IPSP$q?qd!#w1?aynrlN@!TO-bLqw_QyR-sF;u;Dn7&1b13q5B; z!%8m%@f_IROPdpsEDd{rnK5^{a(O}yx378C4NP9X`6_V`C8`NFXqwH<-b-xu#2fK} zvm-Ai(|Gn?K(vq$y_qi7Hg@snMCqlfEf8$Q~X zUk`1c0CkLu*Wr1Lz?JBIRM5$o@JNoM7?7kDmSTp-`)#aL!w1X*9khx0i@nRxuz_Pf zsuA4^242{6yCED42v!ZEG_v&YQ2+r3aKWZ1lZYnPVE_ORUM(~3n-+}Wh2728a5&6@ zp-gB9to;!k8AK7Ph;bkzgzN$qBql@pr)|B*xHA~6h&3f*n2J|j1lVO;uT8MOwy-pL z)=Lh6s?Gsoal(gf&4&=?^tl&tMl1$MJukmx>d;yP3%k0MN-3}>Dy*O^ml}i{G3BDO zba+HQaCO647d4{?0y_*xx!QrhhjlKhUOgv&2SX}a@(`5!RgBgdH7AP4hB6~F>Mi2VFGLfN)q z(QCO<&zHDC*mRN2DAPm)K@bWBJqTj)!ciVu2(C~ppgdcIbjuoI$j5{eAR)sy6#xLN zBm>h|oZ;A@hAyA320{HYKw+%&<>?49wwj?vxR*rmGfXUwSV~~u9b(eP{64GrC3aoS2yHSH_e8!_|JE89UEEEECt!ILvW)Gs(GF15sd z1x}vY-e$0uq;^Swnt_9f&1$vFG>ODfQ#5%+(0%3R0lFkIBpGR>5b*SIDh=K48li+` zDo`&f_z_Da?QK+3bP+AjWK=619vp@lq7oa=YsD|Eo4*rMTsV?UZyUDahpmu4s48HB zbynrQlD(-Cy_tK<9}CyCjBD-Xl>{M z$`;&&mTvWCBiPRy@I{vT5!i-91o!N z{B~m-!J2yzwuZzOc1R7hm~lk~X_7cj>&w^+R5X;^G%|of8wluTInde(?+u@e3wF(` z*@e3EK_Qd?f&C7q385}7gDFU6aUi#_m~8sdAM3JZeS)&E)E7fjVbW=J&B5lj!A-ax z0HAv-wXWaOgNBF2Om0FAz6|PV0$fF`a;))Yvj%qyc@YC?5Z$1NP|=u3>vP1p`UXM+ zoyS-4owSTGjP7TP+g3r4jLpAm-Z-ouS_%?mDwR*!71A`>5z`?k4sqCv`pJT!i3!y} zwvT$w$k>``xVfEd`I|x%Cp1D=gbJHM=K{3fQXu=Pz`6+w5Dd*rAQ# znVfrLAIH#ETqAEydX+NlRuH4&XyeW3qL_+d(Q(-Zn%;#tWg)nVgD_)8 z5ni?m0gxtu4^hM17hdN~*&(WoP+d~l5XMsaZOh{Xzez0C7V|TdJ6waktpZA_bp+Ld zzS54{VD3eZLK1QzKvK1%o0=ft+pORz0J2cTgCfnoF)eb?br9XlTT38T^mG|fb(nDQ zSXSwjF)gUk17}rDB8m{y2%jkeh0~_Rp=nGsp|L2amgquD=cuH(xrflZ$jF6uQo#Xj zMzs|{VxVs<Hqie8A|uFi-4C~w_+L# zauBU#6m{;Z1>0O;^mN5E-`^BzU)GG`=G_%6C50jbUC-Brj{O^_dKRa2LF33gB%mpd z7%L7O5Vm}xnR2@wtEMp>zK}N$SB4TWW7lug%5wmnFjCizlEzkl9we*C$ZmT_y7_X& zdngWuTDhDV5zY6^OE(KKn87{Ct_v-ovkQ>JoUbO;%}@1nzX}P4Q+&|dDvPcBB&PD@ zDecm2!)uoWr;bn%Rt`(XR*fS&Rm4E;)r23YJ77SvC>lgW&RlNew0lI}%FzX2!GA#- z$~!Ogo>=_k9FNCuzA#@CtZxjXJpPUPu$Unf}{%dl}iMF>Ii~<5X)_Si(Zbvdr+1!Nqi6uO~c{T zmGCBI4$Lv&m}ng*u+p3pxNBRKDrFvA2jGGc=P_J}wWNN@zDCd^Lg972QFkI=?H0eiAI3$4Odg9z}Gm{9bP({)m!lH^= z;7bUo5SdWd=0(+`bkNa^*)*^s2&ygl{LC~W=XzcL;9thV2)nezjw*u|BeFl$o zdJf<}=!`1k;9lYg-j4vY{}l%bq8=b-LB-DPBN_WY#V4T^bN1G}tvS46ahouQp@R7| zBHk>zkyr(;EL+pv0ti0$`En=`IqV04G3gCft0u{!sJtvj4h`4iLv9d9ynQ$z+4wO^ z7^EU6d&Alh{VYH6J-y`RJp8fXIcBH<9bW5Hela~xI(xaP9L_2~xzcJ-HXvqPp${&? z7XySN*<)A(<>@tY0n(vO(_|g5-8Bg(5cuNnDq1ZtO?E6;qhjBy6b(0d0(d_%6i8U*jsSfRBD(lK=n! diff --git a/fonts/OpenSans-SemiboldItalic-webfont.svg b/fonts/OpenSans-SemiboldItalic-webfont.svg deleted file mode 100644 index 7166ec1..0000000 --- a/fonts/OpenSans-SemiboldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fonts/OpenSans-SemiboldItalic-webfont.ttf b/fonts/OpenSans-SemiboldItalic-webfont.ttf deleted file mode 100644 index d2d6318f6640448517db133a40a6a5a36d36ed48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40252 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 Z0p^q`UCg`8t*mL+fyY_#j+!w<{{z_tFYy2X diff --git a/fonts/OpenSans-SemiboldItalic-webfont.woff b/fonts/OpenSans-SemiboldItalic-webfont.woff deleted file mode 100644 index d4dfca402e53e59ec985ff4c6312864da493fa83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23764 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:

Source:
@@ -643,7 +643,7 @@
Parameters:
Source:
@@ -848,7 +848,7 @@
Properties
Source:
@@ -1126,7 +1126,7 @@
Properties:
Source:
@@ -1249,7 +1249,7 @@
Parameters:
Source:
@@ -1346,7 +1346,7 @@

EmbedMessageObject

Source:
@@ -1574,7 +1574,7 @@
Parameters:
Source:
@@ -1728,7 +1728,7 @@
Properties:
Source:
@@ -1758,13 +1758,13 @@
Properties:

diff --git a/icons/home.svg b/icons/home.svg deleted file mode 100644 index 676d2d3..0000000 --- a/icons/home.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/icons/search.svg b/icons/search.svg deleted file mode 100644 index ccc84b6..0000000 --- a/icons/search.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/index.html b/index.html index 4143d79..4c47a2b 100644 --- a/index.html +++ b/index.html @@ -44,15 +44,14 @@

Aghanim

-

Aghanim is a Command Client for create Discord bots with Eris in NodeJS based on Yuuko

-

Author : Desvelao^^ Version: v0.2.0

+

Aghanim is a Command Client to create Discord bots with Eris in NodeJS based on Yuuko.

+

Version: v0.3.0

Features

    -
  • Add Commands/Subcommands and Components from files or directories
  • -
  • Support for Subcommands (Command should be exist)
  • -
  • Builtin commands requirements or define yours
  • -
  • Define Commands as objects or use Command class
  • -
  • Define Components as object or a class that extends of Component class
  • +
  • Add commands/subcommands and Components from files or directories
  • +
  • Add interaction commands from files or directories
  • +
  • Add components from files or directories
  • +
  • Builtin commands requirements or define and register custom requirements
  • Define methods to run in some Eris events automatically with your Components

Using the bot

@@ -62,55 +61,89 @@

Using the package

Installation

$ npm install --save Desvelao/aghanim # npm
 $ yarn add Desvelao/aghanim # yarn
-
-# Dev branch
-$ npm install --save Desvelao/aghanim#dev # npm
-$ yarn add Desvelao/aghanim#dev # yarn
-
 

Usage

//index.js
-const Aghanim  = require('aghanim')
-const { Command, Component }  = require('aghanim')
+const Aghanim = require('aghanim');
+const { Command, Component } = require('aghanim');
 
+// Create bot
 const client = new Aghanim(
-	'your_bot_token', // Token used to auth your bot account
-    {
-  		prefix: 'a!', // Prefix used to trigger commands
-	}
-)
-
-client.addCategory('Fun','Fun commands')
-
-const pingCommand = new Command('ping', {
-  category : 'Fun', help : 'Get Pong!', args : ''},
-  async function(msg, args, client, command) {
-  	msg.channel.createMessage('Pong!')
-})
-
-client.addCommand(pingCommand)
-
-// Component:
-class MyComponent extends Component{
-	constructor(client, options) {
-		super(client) // this.client is Aghanim Client instance. You can use in other methods
-	}
-	ready(client){ // method fired in client.on('ready', handler) by default of this component. Each component can add handlers for events.
-		console.log('My component is ready')
-	}
-	messageCreate(msg, args, client, command){ // method fired in client.on('messageCreat', handler).
-		console.log(`Message: ${msg.content}`)
-		// this.client is Aghanim Client instance. You can use it here
-	}
+  'your_bot_token', // Token used to auth your bot account
+  {
+    prefix: 'a!' // Used by the commands manager based on text context. Use the interaction commands are the new way to interact
+  }
+);
+
+// Add interaction command. Use slash commands (/ping)
+const pingGlobalInteractionCommand = {
+  name: 'ping',
+  description: 'About',
+  type: Aghanim.Eris.Constants.ApplicationCommandTypes.CHAT_INPUT,
+  customOptions: {
+    defer: true
+  }
+  scope: {
+    type: 'global',
+  },
+  run: async function (interaction, client, command) {
+    // interaction command logic
+    // Ensure to reply the interaction
+    return interaction.createMessage('Pong');
+  }
+};
+
+client.addInteractionCommand(pingGlobalInteractionCommand);
+
+// Add category
+client.addCategory('Fun', 'Fun commands');
+
+// Add command
+const pingCommand = new Command(
+  'ping',
+  {
+    category: 'Fun',
+    help: 'Get Pong!',
+    args: ''
+  },
+  async function (msg, args, client, command) {
+    await msg.channel.createMessage('Pong!');
+  }
+);
+
+client.addCommand(pingCommand);
+
+// Add component:
+class MyComponent extends Component {
+  constructor(client, options) {
+    super(client); // this.client is Aghanim Client instance. You can use in other methods
+  }
+  ready(client) {
+    // method fired in client.on('ready', handler) by default of this component. Each component can add handlers for events.
+    console.log('My component is ready');
+  }
+  messageCreate(msg, args, client, command) {
+    // method fired in client.on('messageCreate', handler).
+    console.log(`Message: ${msg.content}`);
+    // this.client is Aghanim Client instance. You can use it here
+  }
 }
 
-client.addComponent(MyComponent)
+client.addComponent(MyComponent);
 
 // Bot connent
-client.connect()
+client.connect();
 
+

Run the script:

$ node index.js
-
+
+

Load Aghanim configuration

+

The Aghanim client can load configuration from a file in the current directory:

+
    +
  • aghanim.config.json
  • +
  • aghanim.config.js
  • +
+

or define the AGHANIM_CONFIG_FILE environment variable to define the absolute path to the configuration file (like .js or .json)

@@ -121,13 +154,13 @@

Usage


diff --git a/module-aghanim.html b/module-aghanim.html index c8b6d5b..25123fe 100644 --- a/module-aghanim.html +++ b/module-aghanim.html @@ -38,7 +38,7 @@

Module: aghanim

-
Aghanim module to create a Command Client for Eris using nodejs!
+
Aghanim module to create a Command Client for Eris using NodeJS!
@@ -710,6 +710,116 @@
Properties:
+

(static) constants

+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
constants + + +constants + + + + Constants
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +

(static) Eris

@@ -946,13 +1056,13 @@
Properties:

diff --git a/scripts/pagelocation.js b/scripts/pagelocation.js deleted file mode 100644 index e138368..0000000 --- a/scripts/pagelocation.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -$(document).ready(function () { - var currentSectionNav, target; - - // If an anchor hash is in the URL highlight the menu item - highlightActiveHash(); - // If a specific page section is in the URL highlight the menu item - highlightActiveSection(); - - // If a specific page section is in the URL scroll that section up to the top - currentSectionNav = $('#' + getCurrentSectionName() + '-nav'); - - if (currentSectionNav.position()) { - $('nav').scrollTop(currentSectionNav.position().top); - } - - // function to scroll to anchor when clicking an anchor linl - $('a[href*="#"]:not([href="#"])').click(function () { - /* eslint-disable no-invalid-this */ - if (location.pathname.replace(/^\//, '') === this.pathname.replace(/^\//, '') && location.hostname === this.hostname) { - target = $(this.hash); - target = target.length ? target : $('[name=' + this.hash.slice(1) + ']'); - if (target.length) { - $('html, body').animate({ - scrollTop: target.offset().top - }, 1000); - } - } - /* eslint-enable no-invalid-this */ - }); -}); - -// If a new anchor section is selected, change the hightlighted menu item -$(window).bind('hashchange', function (event) { - highlightActiveHash(event); -}); - -function highlightActiveHash(event) { - var oldUrl, oldSubSectionElement; - - // check for and remove old hash active state - if (event && event.originalEvent.oldURL) { - oldUrl = event.originalEvent.oldURL; - - if (oldUrl.indexOf('#') > -1) { - oldSubSectionElement = $('#' + getCurrentSectionName() + '-' + oldUrl.substring(oldUrl.indexOf('#') + 1) + '-nav'); - - if (oldSubSectionElement) { - oldSubSectionElement.removeClass('active'); - } - } - } - - if (getCurrentHashName()) { - $('#' + getCurrentSectionName() + '-' + getCurrentHashName() + '-nav').addClass('active'); - } -} - -function highlightActiveSection() { - var pageId = getCurrentSectionName(); - - $('#' + pageId + '-nav').addClass('active'); -} - -function getCurrentSectionName() { - var path = window.location.pathname; - var pageUrl = path.split('/').pop(); - - var sectionName = pageUrl.substring(0, pageUrl.indexOf('.')); - - // remove the wodr module- if its in the url - sectionName = sectionName.replace('module-', ''); - - return sectionName; -} - -function getCurrentHashName() { - var pageSubSectionId; - var pageSubSectionHash = window.location.hash; - - if (pageSubSectionHash) { - pageSubSectionId = pageSubSectionHash.substring(1).replace('.', ''); - - return pageSubSectionId; - } - - return false; -} diff --git a/styles/collapse.css b/styles/collapse.css deleted file mode 100644 index 4dc4121..0000000 --- a/styles/collapse.css +++ /dev/null @@ -1,27 +0,0 @@ -@media only screen and (min-width: 681px) { - nav > ul > li:hover .methods, - .active .methods { - display: block; - } - - .methods { - display: none; - } - - nav > ul > li { - padding: 20px 0; - } - - nav > ul > li > a { - padding: 0; - } - - nav > ul > li.active a { - margin-bottom: 10px; - } - - nav > ul > li:hover > a, - nav > ul > li.active > a { - margin-bottom: 15px; - } -} diff --git a/tutorial-1getting-started.html b/tutorial-1getting-started.html index 227ad4d..a79a85b 100644 --- a/tutorial-1getting-started.html +++ b/tutorial-1getting-started.html @@ -2,7 +2,7 @@ - JSDoc: Tutorial: Getting Started + JSDoc: Tutorial: Getting started @@ -17,14 +17,14 @@
-

Tutorial: Getting Started

+

Tutorial: Getting started

-

Getting Started

+

Getting started

@@ -45,46 +45,54 @@

Steps

  • Add Components
  • Add Command Requirements
  • -

    Fast Example

    +

    Example

    //index.js
    -const Aghanim  = require('aghanim')
    -const { Command, Component }  = require('aghanim')
    +const Aghanim = require('aghanim');
    +const { Command, Component } = require('aghanim');
     
     const client = new Aghanim(
    -	'your_bot_token', // Token used to auth your bot account
    -    {
    -  		prefix: 'a!', // Prefix used to trigger commands
    -	}
    -)
    -
    -client.addCategory('Fun','Fun commands')
    -
    -const pingCommand = new Command('ping', {
    -  category : 'Fun', help : 'Get Pong!', args : ''},
    -  async function(msg, args, client, command) {
    -  	msg.channel.createMessage('Pong!')
    -})
    -
    -client.addCommand(pingCommand)
    +  'your_bot_token', // Token used to auth your bot account
    +  {
    +    prefix: 'a!' // Prefix used to trigger commands
    +  }
    +);
    +
    +client.addCategory('Fun', 'Fun commands');
    +
    +const pingCommand = new Command(
    +  'ping',
    +  {
    +    category: 'Fun',
    +    help: 'Get Pong!',
    +    args: ''
    +  },
    +  async function (msg, args, client, command) {
    +    msg.channel.createMessage('Pong!');
    +  }
    +);
    +
    +client.addCommand(pingCommand);
     
     // Component:
    -class MyComponent extends Component{
    -	constructor(client, options) {
    -		super(client) // this.client is Aghanim Client instance. You can use in other methods
    -	}
    -	ready(client){ // method fired in client.on('ready', handler) by default of this component. Each component can add handlers for events.
    -		console.log('My component is ready')
    -	}
    -	messageCreate(msg, args, client, command){ // method fired in client.on('messageCreat', handler).
    -		console.log(`Message: ${msg.content}`)
    -		// this.client is Aghanim Client instance. You can use it here
    -	}
    +class MyComponent extends Component {
    +  constructor(client, options) {
    +    super(client); // this.client is Aghanim Client instance. You can use in other methods
    +  }
    +  ready(client) {
    +    // method fired in client.on('ready', handler) by default of this component. Each component can add handlers for events.
    +    console.log('My component is ready');
    +  }
    +  messageCreate(msg, args, client, command) {
    +    // method fired in client.on('messageCreate', handler).
    +    console.log(`Message: ${msg.content}`);
    +    // this.client is Aghanim Client instance. You can use it here
    +  }
     }
     
    -client.addComponent(MyComponent)
    +client.addComponent(MyComponent);
     
     // Bot connent
    -client.connect()
    +client.connect();
     
    $ node index.js
     
    @@ -95,13 +103,13 @@

    Fast Example


    diff --git a/tutorial-2create-bot.html b/tutorial-2create-bot.html index ca69e35..6d38318 100644 --- a/tutorial-2create-bot.html +++ b/tutorial-2create-bot.html @@ -31,23 +31,24 @@

    Create a bot

    Creating a bot

    Example

    //index.js
    -const Aghanim = require('aghanim')
    +const Aghanim = require('aghanim');
     
     const client = new Aghanim(
    -	'your_bot_token', // Token used to auth your bot account
    -    {
    -  		prefix: 'a!', // Prefix used to trigger commands
    -		helpMessage : ':information_source: __**AghanimBot help**__',
    -		helpDM : true, // Default help will use direct messages
    -		helpMessageAfterCategories : 'Use `a!help <category>` to see the others commands', //Message shown after categories in default help command
    -	}
    -)
    +  'your_bot_token', // Token used to auth your bot account
    +  {
    +    prefix: 'a!', // Prefix used to trigger commands
    +    helpMessage: ':information_source: __**AghanimBot help**__',
    +    helpDM: true, // Default help will use direct messages
    +    helpMessageAfterCategories:
    +      'Use `a!help <category>` to see the others commands' //Message shown after categories in default help command
    +  }
    +);
     
     // if it exists aghanim.config.js/json in project root, that configuration will be loaded before option object passed to instance initiation.
     
     // too you can do
    -const { Client } = requie('aghanim')
    -const client = new Client(token, configuration)
    +const { Client } = requie('aghanim');
    +const client = new Client(token, configuration);
     
    @@ -56,13 +57,13 @@

    Example


    diff --git a/tutorial-3command-command.html b/tutorial-3command-command.html new file mode 100644 index 0000000..bdb2fa9 --- /dev/null +++ b/tutorial-3command-command.html @@ -0,0 +1,132 @@ + + + + + JSDoc: Tutorial: Command + + + + + + + + + + +
    + +

    Tutorial: Command

    + +
    + +
    + + +

    Command

    +
    + +
    +

    Create a Command

    +
    // ping.js
    +const { Command } = require('aghanim');
    +
    +module.exports = new Command(
    +  'ping', // command name
    +  {
    +    // options object
    +    category: 'Fun',
    +    help: 'Get Pong!',
    +    args: '',
    +    requirements: [], // Define requirements for this command. See command requirements tutorial
    +    hooks: {
    +      // Add hooks to commnand
    +      prereq: [], // Array of hooks fired before command requirement execution. function(msg, args, client, command)
    +      prerun: [], // Array of hooks fired before command execution. function(msg, args, client, command)
    +      executed: [], // Array of hooks fired after command execution. function(msg, args, client, command)
    +      error: [] // Array of hooks fired if the command has some error. function(msg, args, client, command, error)
    +    },
    +    response: 'Pong!', // String or function(msg, args, client, commnad) that returns a string or EmbedMessageObject
    +    responseDM: 'Pong by DM!' // String or function(msg, args, client, commnad) that returns a string or EmbedMessageObject
    +  },
    +  async function (msg, args, client, command) {
    +    // run function. Only execute if not options.response or options.responseDM
    +    msg.channel.createMessage('Pong by run function!');
    +  }
    +);
    +
    +

    Command execute first of: response > responseDM > run

    +

    Add your command to your bot

    +
    // index.js
    +// bot defined...
    +const ping_command = require('./ping.js');
    +client.addCommmand(ping_command);
    +
    +const path = require('path');
    +//You can import the file directly using addCommandFile method
    +client.addCommandFile(path.join(__dirname, '/ping.js'));
    +
    +//Or you can import a directory of commands with addCommandDir method
    +client.addCommandDir(path.join(__dirname + 'path/to/commands'));
    +
    +

    Create a Subcommand

    +
    // pong.js
    +const { Command } = require('aghanim');
    +
    +module.exports = new Command(
    +  'pong',
    +  {
    +    childOf: 'ping', // Upper/Parent command Command. Parent command should be added before the subcommand
    +    category: 'Fun',
    +    help: 'Get Pong!',
    +    args: ''
    +  },
    +  async function (msg, args, client, command) {
    +    return msg.channel.createMessage('Pong!');
    +  }
    +);
    +
    +// This command will be fired with `[client.prefix]ping pong`
    +
    +

    Command Object

    +

    Create a command as object too

    +
    module.exports = {
    +	name: 'ping',
    +	category: 'Fun',
    +	help: 'Get Pong!',
    +	args: '',
    +	requirements: [],
    +	hooks : {
    +		prereq : [],
    +		prerun : [],
    +		executed : [],
    +		error: []
    +	},
    +	response: "Pong!",
    +	responseDM: "Pong by DM!",
    +	run: async (msg, args, client, command){
    +		return msg.channel.createMesage('Pong by run function')
    +	}
    +}
    +
    +
    + +
    + +
    + + + +
    + + + + + + + \ No newline at end of file diff --git a/tutorial-3command-interaction.html b/tutorial-3command-interaction.html new file mode 100644 index 0000000..b986bd4 --- /dev/null +++ b/tutorial-3command-interaction.html @@ -0,0 +1,122 @@ + + + + + JSDoc: Tutorial: Interaction command + + + + + + + + + + +
    + +

    Tutorial: Interaction command

    + +
    + +
    + + +

    Interaction command

    +
    + +
    +

    Interaction commands

    +

    These commands use the slash command (/) to be executed.

    +

    Definition

    +
    interface InteractionCommandDefinition {
    +  name: string,
    +  description: string,
    +  type: Aghanim.Eris.Constants.ApplicationCommandTypes.CHAT_INPUT,
    +  customOptions: {
    +    defer: boolean // send a signal as the bot is writing while running a long process of the command
    +    'dev.forceUpdate': boolean // force to update the interaction command when the bot is started
    +  }
    +  scope: {
    +    type: 'global' | 'guild', // global or guild
    +    guildIDs: number[] // used for guild type to define the specific guild IDs to register
    +  },
    +  run: (interaction, client, command) => Promise<any> { // Ensure to reply the interaction
    +}
    +
    +

    Create and add the interaction command

    +
    const Aghanim = require('aghanim');
    +
    +// Create an interaction command definition
    +const pingGlobalInteractionCommand = {
    +  name: 'ping',
    +  category: 'General',
    +  description: 'About',
    +  type: Aghanim.Eris.Constants.ApplicationCommandTypes.CHAT_INPUT,
    +  customOptions: {
    +    defer: true
    +  }
    +  scope: {
    +    type: 'global',
    +  },
    +  run: async function (interaction, client, command) {
    +    // interaction command logic
    +    // Ensure to reply the interaction
    +    return interaction.createMessage('Pong');
    +  }
    +};
    +
    +// Add the interaction command
    +bot.addInteractionCommand(pingGlobalInteractionCommand)
    +
    +// Create an interaction command definition specific to a guild
    +const pingGuildSpecificInteractionCommand = {
    +  name: 'ping',
    +  category: 'General',
    +  description: 'About',
    +  type: Aghanim.Eris.Constants.ApplicationCommandTypes.CHAT_INPUT,
    +  customOptions: {
    +    defer: true
    +  }
    +  scope: {
    +    type: 'guild',
    +    guildIDs: [123456789] // used for guild type to define the specific guild IDs to register
    +  },
    +  run: async function (interaction, client, command) {
    +    // interaction command logic
    +    // Ensure to reply the interaction
    +    return interaction.createMessage('Pong');
    +  }
    +};
    +
    +// Add the interaction command
    +bot.addInteractionCommand(pingGuildSpecificInteractionCommand)
    +
    +

    Add from a directory

    +

    You can add interaction commands from a directory. The files should be named as *.js and +export by default the interaction command definition.

    +
    const path = require('path');
    +bot.addInteractionCommandDir(path.join(__dirname, 'interaction_commands')))
    +
    +
    + +
    + +
    + + + +
    + + + + + + + \ No newline at end of file diff --git a/tutorial-3command.html b/tutorial-3command.html index 7f5825b..d37e750 100644 --- a/tutorial-3command.html +++ b/tutorial-3command.html @@ -2,7 +2,7 @@ - JSDoc: Tutorial: Create Commands/Subcommands + JSDoc: Tutorial: Create commands @@ -17,93 +17,24 @@
    -

    Tutorial: Create Commands/Subcommands

    +

    Tutorial: Create commands

    + + -

    Create Commands/Subcommands

    +

    Create commands

    -

    Create a Command

    -
    // ping.js
    -const { Command } = require('aghanim')
    -
    -module.exports = new Command('ping', // command name
    -	{ // options object
    -		category : 'Fun',
    -		help : 'Get Pong!',
    -		args : '',
    -		requirements: [], // Define requirements for this command. See command requirements tutorial
    -		hooks : { // Add hooks to commnand
    -			prereq : [], // Array of hooks fired before command requirement execution. function(msg, args, client, command)
    -			prerun : [], // Array of hooks fired before command execution. function(msg, args, client, command)
    -			executed : [], // Array of hooks fired after command execution. function(msg, args, client, command)
    -			error: [] // Array of hooks fired if the command has some error. function(msg, args, client, command, error)
    -		},
    -		response: "Pong!", // String or function(msg, args, client, commnad) that returns a string or EmbedMessageObject
    -		responseDM: "Pong by DM!", // String or function(msg, args, client, commnad) that returns a string or EmbedMessageObject
    -	},
    -	async function (msg, args, client, command) { // run function. Only execute if not options.response or options.responseDM
    -		msg.channel.createMessage('Pong by run function!')
    -})
    -
    -

    Command execute first of: response > responseDM > run

    -

    Add your command to your bot

    -
    	// index.js
    -	// bot defined...
    -	const ping_command = require('./ping.js')
    -	client.addCommmand(ping_command)
    -
    -	const path = require('path')
    -	//You can import the file directly using addCommandFile method
    -	client.addCommandFile(path.join(__dirname, '/ping.js'))
    -
    -	//Or you can import a directory of commands with addCommandDir method
    -	client.addCommandDir(path.join(__dirname + 'path/to/commands'))
    -
    -

    Create a Subcommand

    -
    // pong.js
    -const { Command } = require('aghanim')
    -
    -module.exports = new Command('pong', 
    -	{
    -		childOf : 'ping', // Upper/Parent command Command. Parent command should be added before the subcommand
    -		category : 'Fun',
    -		help : 'Get Pong!',
    -		args : ''
    -	},
    -	async function (msg, args, client, command) {
    -		return msg.channel.createMessage('Pong!')
    -	}
    -)
    -
    -// This command will be fired with `[client.prefix]ping pong`
    -
    -

    Command Object

    -

    Create a command as object too

    -
    module.exports = {
    -	name: 'ping',
    -	category: 'Fun',
    -	help: 'Get Pong!',
    -	args: '',
    -	requirements: [],
    -	hooks : {
    -		prereq : [],
    -		prerun : [],
    -		executed : [],
    -		error: []
    -	},
    -	response: "Pong!",
    -	responseDM: "Pong by DM!",
    -	run: async (msg, args, client, command){
    -		return msg.channel.createMesage('Pong by run function')
    -	}
    -}
    -
    +
    @@ -111,13 +42,13 @@

    Command Object


    diff --git a/tutorial-4components.html b/tutorial-4components.html index 107b57a..d0cbf9f 100644 --- a/tutorial-4components.html +++ b/tutorial-4components.html @@ -2,7 +2,7 @@ - JSDoc: Tutorial: Create Components + JSDoc: Tutorial: Create components @@ -17,73 +17,73 @@
    -

    Tutorial: Create Components

    +

    Tutorial: Create components

    -

    Create Components

    +

    Create components

    -

    You can extends your bot methods/funcionality or Eris structures throgh Aghanim Extension.

    +

    You can extends your bot methods/funcionality or Eris structures through Aghanim Components.

    Custom extensions: after instantiate your bot

    You can create Components:

    //my_component.js
    -const { Component } = require('aghanim')
    +const { Component } = require('aghanim');
     
     // Component:
    -class MyComponent extends Component{
    -	constructor(client, options) {
    -		super(client) // this.client is Aghanim Client instance. You can use in other methods
    -	}
    -	ready(){
    -		console.log('My component is ready')
    -	}
    -	messageCreate(msg, args, client, command){
    -		console.log(`Message: ${msg.content}`)
    -		// this.client is Aghanim Client instance. You can use it here
    -	}
    -	messageReactionAdd(msg, emoji, userID, client){
    -		// do something when a reactions is added to one message
    -	}
    +class MyComponent extends Component {
    +  constructor(client, options) {
    +    super(client); // this.client is Aghanim Client instance. You can use in other methods
    +  }
    +  ready() {
    +    console.log('My component is ready');
    +  }
    +  messageCreate(msg, args, client, command) {
    +    console.log(`Message: ${msg.content}`);
    +    // this.client is Aghanim Client instance. You can use it here
    +  }
    +  messageReactionAdd(msg, emoji, userID, client) {
    +    // do something when a reactions is added to one message
    +  }
     }
     
    -module.exports = MyComponent
    +module.exports = MyComponent;
     

    Add your custom component to your bot

    -
    	//index.js
    -	//bot defined...
    -	const MyComponent = require('./my_component.js')
    -	client.addComponent(MyComponent)
    +
    //index.js
    +//bot defined...
    +const MyComponent = require('./my_component.js');
    +client.addComponent(MyComponent);
     
    -	const path = require('path')
    -	//You can import the file directly using addComponentFile method
    -	client.addComponentFile(path.join(__dirname, '/my_component.js'))
    +const path = require('path');
    +//You can import the file directly using addComponentFile method
    +client.addComponentFile(path.join(__dirname, '/my_component.js'));
     
    -	//Or you can import a directory of components with addComponentDir method
    -	client.addComponentDir(path.join(__dirname + '/path/to/components_folder'))
    +//Or you can import a directory of components with addComponentDir method
    +client.addComponentDir(path.join(__dirname + '/path/to/components_folder'));
     

    Component Object

    Create a component as object

    //my_componnet.js
     module.exports = {
    -	name: 'ping',
    -	constructor: (client, options) => {
    -		// do something when create component instance
    -	},
    -	ready: () => {
    -		console.log('My component is ready')
    -	},
    -	messageCreate(msg, args, client, command){
    -		console.log(`Message: ${msg.content}`)
    -	},
    -	messageReactionAdd(msg, emoji, userID, client){
    -		// do something when a reactions is added to one message
    -	}
    -}
    +  name: 'ping',
    +  constructor: (client, options) => {
    +    // do something when create component instance
    +  },
    +  ready() {
    +    console.log('My component is ready');
    +  },
    +  messageCreate(msg, args, client, command) {
    +    console.log(`Message: ${msg.content}`);
    +  },
    +  messageReactionAdd(msg, emoji, userID, client) {
    +    // do something when a reactions is added to one message
    +  }
    +};
     

    Methods of events in components

    These events will be fired of components:

    @@ -96,6 +96,7 @@

    Methods of events in components

  • guildDelete
  • guildMemberAdd
  • guildMemberRemove
  • +
  • interactionCommandCreate
  • For more info about client events go to Eris

    The arguments of these events are same Eris and added client as last. That means that if for example:

    @@ -103,11 +104,11 @@

    Methods of events in components

  • Eris event: messageReactionAdd(message, emoji, userID)
  • Aghanim event: messageReactionAdd(message, emoji, userID, client)
  • -

    If you need listen more events of that Aghanim do by default you can do it

    -
    client.on(eventName, handler)
    +

    If you need listen more events of that Aghanim does by default you can do it.

    +
    client.on(eventName, handler);
     
     // or if you want add Aghanim functionality through components
    -client.on(eventName, client.handleEvent(eventName)) // that add client as last argument to event handler of Eris event handler
    +client.on(eventName, client.handleEvent(eventName)); // that adds the client as last argument to event handler of Eris event handler
     
    @@ -116,13 +117,13 @@

    Methods of events in components


    diff --git a/tutorial-5categories.html b/tutorial-5categories.html index d6995ce..bcb83cb 100644 --- a/tutorial-5categories.html +++ b/tutorial-5categories.html @@ -2,7 +2,7 @@ - JSDoc: Tutorial: Create a category + JSDoc: Tutorial: Create command categories @@ -17,14 +17,14 @@
    -

    Tutorial: Create a category

    +

    Tutorial: Create command categories

    -

    Create a category

    +

    Create command categories

    @@ -35,7 +35,7 @@

    Add a category

    // Add a category with name "Fun" client.addCategory('Fun', // Category name 'List of fun commands', ) // Description - {hide: false}) // options (optional). options.hide is false by default. Hide category of help default command. + {hide: false}) // options (optional). options.hide is false by default. Hide category of help default command.
    @@ -44,13 +44,13 @@

    Add a category


    diff --git a/tutorial-6command-requirements.html b/tutorial-6command-requirements.html index 06b2d56..18e9765 100644 --- a/tutorial-6command-requirements.html +++ b/tutorial-6command-requirements.html @@ -31,7 +31,7 @@

    Command requirements

    You can create command requirements for each command or use builtin command requirements creators

    Add a requirement

    @@ -57,8 +57,8 @@

    Add a requirement

    // responseDM: (msg, args, client, command, requirement, conditionReqContext) => returns string/embed // responseDM: (msg, args, client, command, requirement, conditionReqContext) => "DM: You don't have permissions to execute this command created by function" run: // custom function run(msg, args, client, command, requirement, conditionReqContext) - init: (client, command, requirement) => { - // do something when this requirement is added to commnad, for example add a hook to command + init: (client, command, requirement) => { + // do something when this requirement is added to command, for example add a hook to command } // You can add other props to be accesible through requirement variable } @@ -67,7 +67,7 @@

    Add a requirement

    run: (msg, args, client, command) => msg.channel.createMessage("This is my command") // If pass all command requirements, this will be run }
    -

    Define user builtin requirements

    +

    Define user built-in requirements

    Define a custom requirement or set of them to import easily from a command definition

    client.addCommandRequirement(requirement) // requirement can be a object or a function
     
    @@ -122,7 +122,7 @@ 

    Define user builtin requirements

    { // do something } @@ -139,7 +139,7 @@

    Builtin requirements creators

    // This object is passed to a command requirement creator function that returns a requirement object response: "This command only avaliable in guild" // Resplye with that if message doesn't come from a guild // responseDM: or reply with a dm - // run: or create a custom funcition + // run: or create a custom funcition } // You can add more requirements to check. Resply with first requirement failed to pass ] @@ -157,16 +157,16 @@

    Command requirements creators:

  • guild.deny: deny command on channels whose ids are on channels property
  • user.allow: allow command on channels whose ids are on channels property
  • user.deny: deny command on channels whose ids are on channels property
    {
    -// command definition...
    -	requirements : [
    -		{
    -			type: 'channel.allow', // map to the builtin requirement creator. Same interface for requirements from below
    -			store: [], // array of strings channles ids
    -			response, // optional
    -			responseDM, // optional
    -			run, // optional
    -		}
    -	]
    +  // command definition...
    +  requirements: [
    +    {
    +      type: 'channel.allow', // map to the builtin requirement creator. Same interface for requirements from below
    +      store: [], // array of strings channles ids
    +      response, // optional
    +      responseDM, // optional
    +      run // optional
    +    }
    +  ];
     }
     
  • @@ -178,16 +178,16 @@

    Command requirements creators:

  • channel.cooldown: allow command on channels if is not in cooldown
  • guild.cooldown: allow command on channels if is not in cooldown
  • user.cooldown: allow command on channels if is not in cooldown
    {
    -// command definition...
    -	requirements : [
    -		{
    -			type: 'channel.cooldown', // map to the builtin requirement creator. Same interface for requirements from below
    -			time: 60, // cooldown time in seconds. Set after a suscefully command execution
    -			response, // optional
    -			responseDM, // optional
    -			run, // optional
    -		}
    -	]
    +  // command definition...
    +  requirements: [
    +    {
    +      type: 'channel.cooldown', // map to the builtin requirement creator. Same interface for requirements from below
    +      time: 60, // cooldown time in seconds. Set after a suscefully command execution
    +      response, // optional
    +      responseDM, // optional
    +      run // optional
    +    }
    +  ];
     }
     
  • @@ -217,23 +217,23 @@

    Command requirements creators:

  • member.has.role: allow command on guild for member with a role or some of array of roles.

    {
    -// command definition...
    -	requirements : [
    -		{
    -			type: 'member.has.permisions', // map to the builtin requirement creator.
    -			role: "Admin", // no case sensitive. Admit pass an array of role names
    -			response, // optional
    -			responseDM, // optional
    -			run, // optional
    -		}
    -	]
    +  // command definition...
    +  requirements: [
    +    {
    +      type: 'member.has.permisions', // map to the builtin requirement creator.
    +      role: 'Admin', // no case sensitive. Admit pass an array of role names
    +      response, // optional
    +      responseDM, // optional
    +      run // optional
    +    }
    +  ];
     }
     
  • -

    Miscelaneous

    +

    Miscellaneous