discord-message-handler is a module written to simplify message and command handling for discord.js bots and applications.
Simply navigate to your project's folder and type npm install discord-message-handler --save
on the command line.
To start using the module you must require it into you script like this (changed in 2.0)
Old style require:
const MessageHandler = require('discord-message-handler').MessageHandler;
const handler = new MessageHandler();
ES2015:
const { MessageHandler } = require('discord-message-handler');
const handler = new MessageHandler();
Typescript:
import { MessageHandler } from 'discord-message-handler';
const handler = new MessageHandler();
Define rules for the message handler (shown later in the next sections) then parse messages in the as they arrive:
client.on('message', message => {
handler.handleMessage(message);
});
handler.whenMessageContainsWord("shrug").reply("¯\\_(ツ)_/¯");
handler.whenMessageContains("lol").sometimes(33).reply("kek"); // 33% chance
handler.whenMessageContainsExact("dota").replyOne(["volvo pls", "rip doto"]);
handler.whenMessageContainsOne(["br", "brazil"]).reply("huehue");
handler.whenMessageStartsWith("help").then(message => doSomething(message));
handler.onCommand("/doit").do((args, rawArgs, message) => {
message.channel.send(`Doing something for ${message.author}...`)
});
handler.onCommand("/information").alias("/info").alias("/i").do((args) => {
doSomething(args[0]);
});
handler
.onCommand("/info")
.minArgs(2)
.whenInvalid("Invalid command. Usage: /info <a> <b>")
.do((args) => {
doSomething(args[0]);
doSomethingElse(args[1]);
});
handler
.onCommand("!roll")
.minArgs(1)
.matches(/(\d+)?\s?d(6|20|100)/g)
.whenInvalid("Invalid command. Usage: `!roll <number of dices> d<type of dice>`. Valid dices: d6, d20, d100")
.do((args) => {
// Dice roll logic
})
In this version, you can chain commands and give whenInvalid an object with multiple parameters. They will be validated in the following order: 1. allowedChannels 2. minimumArguments 3. regularExpression
You can also pass in a flag when you want to send it to a user or a channel. Standard will be a reply in the channel.
handler
.onCommand("!roll")
.minArgs(1)
.matches(/(\d+)?\s?d(6|20|100)/g)
.allowedChannels(["45054768187"])
.whenInvalid({
sendToPlayer: true,
allowedChannels: "You are not allowed to use that in this channel.",
minimumArgs: "Did you forget something?",
regexPattern: "Please check your input."})
.do((args) => {
// Dice roll logic
})
You can automatically delete the message that triggered a command using the deleteInvocation
method. The time argument is optional, and if absent the message will be deleted imediatelly.
// User's message will be deleted after 1500ms
handler.onCommand("/afk").deleteInvocation(1500).then((message) => {
message.channel.send(`${message.author} is now AFK.`);
});
Consider you have the following structure:
├── commands
│ ├── greetings.js
│ └── helper.js
└── index.js
greetings.js:
module.exports.setup = function(handler) {
handler.onCommand("/help").reply("<some helpful message>");
handler.onCommand("/ping").reply("<actually calculate ping>");
}
helper.js:
const { MessageHandler } = require('discord-message-handler');
module.exports.setup = function(handler) {
/* [Optional] You can recreate the handler using the parent context so your IDE will properly give out suggestions for the handler */
const myhandler = new MessageHandler(handler);
myhandler.whenMessageContainsWord("hey").reply("yo!");
myhandler.whenMessageContainsWord("hi").reply("oh hi there :)");
}
index.js:
const { MessageHandler } = require('discord-message-handler');
const greetingsCommands = require('./commands/greetings');
const helperCommands = require('./commands/helper')
const handler = new MessageHandler();
greetingsCommands.setup(handler);
helperCommands.setup(handler);
// (...) code continues
In case you want message filters to be case sensitive you just need to call this function once:
handler.setCaseSensitive(true);
By default all message filters are case insensitive. (false)
To enable logging call handler.enableLogging()
and pass a function to handle logs.
handler.enableLogging((filterType, filter, message) => {
console.log(`${new Date().toISOString()} ${filterType}: ${filter} - "${message.content}"`);
});
Feel free to send a pull request or open an issue if something is not working as intended or you belive could be better.