The comprehensive step by step tutorial of building Slack Bot using Node.js and MongoDB with the help of Slackbots module. Slack become the popular tools recently that used by developers. There is a Bot feature on the Slack that can be accessed by Slack RTM. On the Node.js environment, there are a lot of modules that can use for accessing Slack RTM easily. We will be using this Slackbots module for this tutorial. You can find more available methods on their GitHub README. We are already written the tutorial for Java and Spring Boot, we can replicate the steps for generating Slack Bot token from there.
The scenario for this tutorial same as Java version tutorial. There is catch the keyword from a conversation or chats that contains harsh words or bad words (ex: fu*ck, sh*t, b*tch) then save it to MongoDB include with User who sends it. The Slack will count that words from MongoDB until getting 5 words then the Bot will send back the message to channels to warns the sender of bad words.
The following tools, frameworks, and modules are required for this tutorial:
- Node.js
- Mongoose module
- Bluebird module
- Slackbots module
- MongoDB
- Slack Account
- IDE and Text Editor
- Terminal (OSX/Linux) or Node.js Command Line (Windows)
Before continuing to the steps of the tutorial, make sure you have installed Recommended version of Node.js and MongoDB on your machine.
1. Generate Slack Bot Token
We need a Slack token before moving to Spring Boot MongoDB Slack Bot tutorial. For that, on the browser go to https://yourworkspace.slack.com/services/new/bot. You will redirect to the login form if not logged in yet. Log in using your workspaces user then you will entering Slack Bot configuration page.
Give username for your bot then click `Add Bot Integration` button. That's it, now you have your Bot token that ready to use. Save that code somewhere in your local, do not try to save it on public repositories or the bot will be disabled by Slack.
2. Create a Node.js Application
To create a Node.js application, open the terminal then go to your Node projects folder then create a folder for this Node.js app.
mkdir node-slackbot
Next, go to the newly created folder then type this command to initialize the Node.js application.
cd node-slackbot
npm init
Leave all question as default press enter few times, so the result will be like this.
{
"name": "slackbot",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Then type yes to complete this Node app wizard. Now, you will see a file `package.json` that contains required modules for creating Node application. Open and edit `package.json` then add dependencies for all modules that required for this tutorial by replacing all codes with this.
{
"name": "slackbot",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "npm test",
"start": "node index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"bluebird": "^3.5.1",
"mongoose": "^4.13.6",
"slackbots": "^0.3.0"
}
}
Next, install all modules and dependencies by type this command.
npm install
Now, create a new Javascript file on the root of the project folder.
touch index.js
Open and edit `index.js` then declare this required variables.
var SlackBot = require('slackbots'); // import slackbot library
var mongoose = require('mongoose'); // import mongoose library for accessing MongoDB
Declare the variable for handle HTTP request and response including server creation method.
var http = require('http');
http.createServer((req, res) => {}).listen(1337, '127.0.0.1');
Add the MongoDB connection using Mongoose.js and Bluebird module.
/* Create MongoDB Connection */
mongoose.Promise = require('bluebird');
mongoose.connect('mongodb://localhost/slackbot', { useMongoClient: true, promiseLibrary: require('bluebird') })
.then(() => console.log('connection succesful'))
.catch((err) => console.error(err));
Run your Node app by type this command.
npm start
You will see response below on the Terminal or Node.js command line if Node app is working.
> [email protected] start /Users/didin/Documents/NodeApps/node-slackbot
> node index.js
connection succesful
2. Create Mongoose.js Model
To create a model that represents MongoDB collection, create a folder with a new Javascript file on the root of the project directory.
mkdir models
touch models/Badword.js
Open and edit `Badword.js` file then add this lines of codes.
var mongoose = require('mongoose');
var BadwordSchema = new mongoose.Schema({
user_id: String,
keyword: String,
receive_date: { type: Date, default: Date.now },
});
module.exports = mongoose.model('Badword', BadwordSchema);
3. Create Helper for Retrieve and Send Slack Bot Messages
For accessing Slack Bot or Slack RTM, create a new folder and Javascript file.
mkdir helpers
touch helpers/bot.js
Open and edit `helpers/bot.js` then import and declare the required modules.
var SlackBot = require('slackbots');
var mongoose = require('mongoose');
var Badword = require('../models/Badword.js');
Next, instantiate `Slackbots` library with your own Slack Bot token.
var bot = new SlackBot({
token: 'BOT_API_KEY',
name: 'SlackBot'
});
Create initial methods for first run.
exports.run = () => {
bot.on('start', onStart);
bot.on('message', onMessage);
}
Create `onStart` function to start the Slack Bot on the Slack Team.
var onStart = () => {
console.log('Bot started');
}
Create save function and count bad words function including sending the message back to Slack channel.
var saveWord = (channel,user, word) => {
Badword.create({user_id:user.id,keyword:word}, (err, post) => {
if (err) {
console.log(err);
return;
} else {
countWord(channel,user);
}
});
}
var countWord = (channel,user) => {
Badword.find({user_id:user.id}).exec((err, badwords) => {
if (err) {
console.log(err);
return;
} else {
if(badwords.length > 5) {
bot.postMessageToChannel(channel.name, 'It\'s enough '+user.name+' you will kicked from this channel!', {as_user: true});
} else {
bot.postMessageToChannel(channel.name, 'Becareful '+user.name+' you have say bad word '+badwords.length+' times.', {as_user: true});
}
}
});
}
Create function for retrieve message from Slack channel.
var onMessage = (message) => {
users = [];
channels = [];
var botUsers = bot.getUsers();
users = botUsers._value.members;
var botChannels = bot.getChannels();
channels = botChannels._value.channels;
if(message.type === 'message' && Boolean(message.text)) {
var channel = channels.find(channel => channel.id === message.channel);
var usr = users.find(user => user.id === message.user);
if(usr.name !== 'attitudebot') {
if(message.text.toLowerCase().indexOf('shit') || message.text.toLowerCase().indexOf('fuck') || message.text.toLowerCase().indexOf('bitch')) {
var keyword = '';
if(message.text.toLowerCase().indexOf('shit')) {
keyword = 'shit';
}
if(message.text.toLowerCase().indexOf('fuck')) {
keyword = 'fuck';
}
if(message.text.toLowerCase().indexOf('bitch')) {
keyword = 'bitch';
}
saveWord(channel,usr,keyword);
}
}
}
}
4. Test and Run The Slack Bot App
Before test and run the Slack Bot app, make sure MongoDB service is running or you can type this on the other Terminal tab.
mongod
Now, run the Node.js app.
npm start
Open your Slack on the browser or desktop then invite Slack Bot to the Team. After that, you can test using the bad word to your channel as below example.
That's it, a simple example of Slack Bot using Node.js, Mongoose.js and Slackbots module. You can find the full source code on our GitHub.
That just the basic. If you need more deep learning about MEAN Stack, Angular, and Node.js, you can find the following books:
For more detailed on MEAN stack and Node.js, you can take the following course:
- Angular (Angular 2+) & NodeJS - The MEAN Stack Guide
- Start Building Web Apps And Services With Node. js + Express
- Build a REST API with node. js, ExpressJS, and MongoDB
Thanks!