Call plugin functions with an object instead
Previously, plugin functions were called with 4 arguments. These 4 arguments are now part of the passed object instead, making the plugin system much more scalable in the future.master
parent
eea6a0c131
commit
5085cf363a
14
README.md
14
README.md
|
@ -126,21 +126,23 @@ The path is relative to the bot's folder.
|
||||||
|
|
||||||
### Creating a plugin
|
### Creating a plugin
|
||||||
Create a `.js` file that exports a function.
|
Create a `.js` file that exports a function.
|
||||||
This function will be called when the plugin is loaded with the following arguments: `(bot, knex, config, commands)`
|
This function will be called when the plugin is loaded with an object that has the following properties:
|
||||||
where `bot` is the [Eris Client object](https://abal.moe/Eris/docs/Client),
|
* `bot` - the [Eris Client object](https://abal.moe/Eris/docs/Client)
|
||||||
`knex` is the [Knex database object](https://knexjs.org/#Builder),
|
* `knex` - the [Knex database object](https://knexjs.org/#Builder)
|
||||||
`config` is the loaded config object,
|
* `config` - the loaded config
|
||||||
and `commands` is an object with functions to add and manage commands (see bottom of [src/commands.js](src/commands.js))
|
* `commands` - an object with functions to add and manage commands (see bottom of [src/commands.js](src/commands.js))
|
||||||
|
|
||||||
#### Example plugin file
|
#### Example plugin file
|
||||||
```js
|
```js
|
||||||
module.exports = function(bot, knex, config, commands) {
|
module.exports = function({ bot, knex, config, commands }) {
|
||||||
commands.addInboxThreadCommand('mycommand', [], (msg, args, thread) => {
|
commands.addInboxThreadCommand('mycommand', [], (msg, args, thread) => {
|
||||||
thread.replyToUser(msg.author, 'Reply from my custom plugin!');
|
thread.replyToUser(msg.author, 'Reply from my custom plugin!');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
(Note the use of [object destructuring](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Unpacking_fields_from_objects_passed_as_function_parameter) in the function parameters)
|
||||||
|
|
||||||
### Work in progress
|
### Work in progress
|
||||||
The current plugin API is fairly rudimentary and will be expanded in the future.
|
The current plugin API is fairly rudimentary and will be expanded in the future.
|
||||||
The API can change in non-major releases during this early stage. Keep an eye on [CHANGELOG.md](CHANGELOG.md) for any changes.
|
The API can change in non-major releases during this early stage. Keep an eye on [CHANGELOG.md](CHANGELOG.md) for any changes.
|
||||||
|
|
|
@ -265,7 +265,7 @@ function initPlugins() {
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins.forEach(pluginFn => {
|
plugins.forEach(pluginFn => {
|
||||||
pluginFn(bot, knex, config, commands);
|
pluginFn({ bot, knex, config, commands });
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(`Loaded ${plugins.length} plugins (${builtInPlugins.length} built-in plugins, ${plugins.length - builtInPlugins.length} external plugins)`);
|
console.log(`Loaded ${plugins.length} plugins (${builtInPlugins.length} built-in plugins, ${plugins.length - builtInPlugins.length} external plugins)`);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
commands.addInboxThreadCommand('alert', '[opt:string]', async (msg, args, thread) => {
|
commands.addInboxThreadCommand('alert', '[opt:string]', async (msg, args, thread) => {
|
||||||
if (args.opt && args.opt.startsWith('c')) {
|
if (args.opt && args.opt.startsWith('c')) {
|
||||||
await thread.setAlert(null);
|
await thread.setAlert(null);
|
||||||
|
|
|
@ -3,7 +3,7 @@ const moment = require('moment');
|
||||||
const blocked = require("../data/blocked");
|
const blocked = require("../data/blocked");
|
||||||
const utils = require("../utils");
|
const utils = require("../utils");
|
||||||
|
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
async function removeExpiredBlocks() {
|
async function removeExpiredBlocks() {
|
||||||
const expiredBlocks = await blocked.getExpiredBlocks();
|
const expiredBlocks = await blocked.getExpiredBlocks();
|
||||||
const logChannel = utils.getLogChannel();
|
const logChannel = utils.getLogChannel();
|
||||||
|
|
|
@ -6,7 +6,7 @@ const threads = require('../data/threads');
|
||||||
const blocked = require('../data/blocked');
|
const blocked = require('../data/blocked');
|
||||||
const {messageQueue} = require('../queue');
|
const {messageQueue} = require('../queue');
|
||||||
|
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
// Check for threads that are scheduled to be closed and close them
|
// Check for threads that are scheduled to be closed and close them
|
||||||
async function applyScheduledCloses() {
|
async function applyScheduledCloses() {
|
||||||
const threadsToBeClosed = await threads.getThreadsThatShouldBeClosed();
|
const threadsToBeClosed = await threads.getThreadsThatShouldBeClosed();
|
||||||
|
|
|
@ -2,7 +2,7 @@ const path = require('path');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const config = require('../config');
|
const config = require('../config');
|
||||||
|
|
||||||
module.exports = bot => {
|
module.exports = ({ bot }) => {
|
||||||
if (! config.enableGreeting) return;
|
if (! config.enableGreeting) return;
|
||||||
|
|
||||||
bot.on('guildMemberAdd', (guild, member) => {
|
bot.on('guildMemberAdd', (guild, member) => {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
commands.addInboxThreadCommand('id', [], async (msg, args, thread) => {
|
commands.addInboxThreadCommand('id', [], async (msg, args, thread) => {
|
||||||
thread.postSystemMessage(thread.user_id);
|
thread.postSystemMessage(thread.user_id);
|
||||||
});
|
});
|
||||||
|
|
|
@ -4,7 +4,7 @@ const utils = require("../utils");
|
||||||
|
|
||||||
const LOG_LINES_PER_PAGE = 10;
|
const LOG_LINES_PER_PAGE = 10;
|
||||||
|
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
const logsCmd = async (msg, args, thread) => {
|
const logsCmd = async (msg, args, thread) => {
|
||||||
let userId = args.userId || (thread && thread.user_id);
|
let userId = args.userId || (thread && thread.user_id);
|
||||||
if (! userId) return;
|
if (! userId) return;
|
||||||
|
|
|
@ -3,7 +3,7 @@ const Eris = require('eris');
|
||||||
const transliterate = require("transliteration");
|
const transliterate = require("transliteration");
|
||||||
const erisEndpoints = require('eris/lib/rest/Endpoints');
|
const erisEndpoints = require('eris/lib/rest/Endpoints');
|
||||||
|
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
if (! config.allowMove) return;
|
if (! config.allowMove) return;
|
||||||
|
|
||||||
commands.addInboxThreadCommand('move', '<category:string$>', async (msg, args, thread) => {
|
commands.addInboxThreadCommand('move', '<category:string$>', async (msg, args, thread) => {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
const utils = require("../utils");
|
const utils = require("../utils");
|
||||||
const threads = require("../data/threads");
|
const threads = require("../data/threads");
|
||||||
|
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
commands.addInboxServerCommand('newthread', '<userId:userId>', async (msg, args, thread) => {
|
commands.addInboxServerCommand('newthread', '<userId:userId>', async (msg, args, thread) => {
|
||||||
const user = bot.users.get(args.userId);
|
const user = bot.users.get(args.userId);
|
||||||
if (! user) {
|
if (! user) {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
const attachments = require("../data/attachments");
|
const attachments = require("../data/attachments");
|
||||||
const utils = require('../utils');
|
const utils = require('../utils');
|
||||||
|
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
// Mods can reply to modmail threads using !r or !reply
|
// Mods can reply to modmail threads using !r or !reply
|
||||||
// These messages get relayed back to the DM thread between the bot and the user
|
// These messages get relayed back to the DM thread between the bot and the user
|
||||||
commands.addInboxThreadCommand('reply', '[text$]', async (msg, args, thread) => {
|
commands.addInboxThreadCommand('reply', '[text$]', async (msg, args, thread) => {
|
||||||
|
|
|
@ -7,7 +7,7 @@ const { parseArguments } = require('knub-command-manager');
|
||||||
const whitespaceRegex = /\s/;
|
const whitespaceRegex = /\s/;
|
||||||
const quoteChars = ["'", '"'];
|
const quoteChars = ["'", '"'];
|
||||||
|
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
/**
|
/**
|
||||||
* "Renders" a snippet by replacing all argument placeholders e.g. {1} {2} with their corresponding arguments.
|
* "Renders" a snippet by replacing all argument placeholders e.g. {1} {2} with their corresponding arguments.
|
||||||
* The number in the placeholder is the argument's order in the argument list, i.e. {1} is the first argument (= index 0)
|
* The number in the placeholder is the argument's order in the argument list, i.e. {1} is the first argument (= index 0)
|
||||||
|
|
|
@ -5,7 +5,7 @@ const config = require('../config');
|
||||||
|
|
||||||
const {THREAD_STATUS} = require('../data/constants');
|
const {THREAD_STATUS} = require('../data/constants');
|
||||||
|
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
// Check for threads that are scheduled to be suspended and suspend them
|
// Check for threads that are scheduled to be suspended and suspend them
|
||||||
async function applyScheduledSuspensions() {
|
async function applyScheduledSuspensions() {
|
||||||
const threadsToBeSuspended = await threads.getThreadsThatShouldBeSuspended();
|
const threadsToBeSuspended = await threads.getThreadsThatShouldBeSuspended();
|
||||||
|
|
|
@ -2,7 +2,7 @@ const config = require('../config');
|
||||||
const threads = require("../data/threads");
|
const threads = require("../data/threads");
|
||||||
const Eris = require("eris");
|
const Eris = require("eris");
|
||||||
|
|
||||||
module.exports = bot => {
|
module.exports = ({ bot }) => {
|
||||||
// Typing proxy: forwarding typing events between the DM and the modmail thread
|
// Typing proxy: forwarding typing events between the DM and the modmail thread
|
||||||
if(config.typingProxy || config.typingProxyReverse) {
|
if(config.typingProxy || config.typingProxyReverse) {
|
||||||
bot.on("typingStart", async (channel, user) => {
|
bot.on("typingStart", async (channel, user) => {
|
||||||
|
|
|
@ -10,7 +10,7 @@ const readFile = promisify(fs.readFile);
|
||||||
|
|
||||||
const GIT_DIR = path.join(__dirname, '..', '..', '.git');
|
const GIT_DIR = path.join(__dirname, '..', '..', '.git');
|
||||||
|
|
||||||
module.exports = (bot, knex, config, commands) => {
|
module.exports = ({ bot, knex, config, commands }) => {
|
||||||
commands.addInboxServerCommand('version', [], async (msg, args, thread) => {
|
commands.addInboxServerCommand('version', [], async (msg, args, thread) => {
|
||||||
const packageJson = require('../../package.json');
|
const packageJson = require('../../package.json');
|
||||||
const packageVersion = packageJson.version;
|
const packageVersion = packageJson.version;
|
||||||
|
|
Loading…
Reference in New Issue