Node.js and MongoDB Slack Bot Example

by Didin J. on Jan 05, 2018 Node.js and MongoDB Slack Bot Example

Step by step tutorial of building Slack Bot using Node.js and MongoDB with the help of Slackbots module

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.

Node.js and MongoDB Slack Bot Example - Create Bot

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.

Node.js and MongoDB Slack Bot Example - Slack API Token


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.

Node.js and MongoDB Slack Bot Example - Slack Bot 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:

Thanks!