Building Slack Bot using Node.js and MongoDB

Building Slack Bot using Node.js and MongoDB

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.

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: fuck, sht, 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

3. 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);

4. 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);
      }
    }
  }
}

5. 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.

node-js mongodb chatbot

Bootstrap 5 Complete Course with Examples

Bootstrap 5 Tutorial - Bootstrap 5 Crash Course for Beginners

Nest.JS Tutorial for Beginners

Hello Vue 3: A First Look at Vue 3 and the Composition API

Building a simple Applications with Vue 3

Deno Crash Course: Explore Deno and Create a full REST API with Deno

How to Build a Real-time Chat App with Deno and WebSockets

Convert HTML to Markdown Online

HTML entity encoder decoder Online

How to Use Express.js, Node.js and MongoDB.js

In this post, I will show you how to use Express.js, Node.js and MongoDB.js. We will be creating a very simple Node application, that will allow users to input data that they want to store in a MongoDB database. It will also show all items that have been entered into the database.

Ecommerce MERN(MongoDB Express.js React.js Node.js) Redux Tailwind

Ecommerce MERN(MongoDB Express.js React.js Node.js) Redux Tailwind

Node.js Express MongoDB Tutorial

Node.js Express MongoDB Tutorial is CRUD example, I have created to showcase Express web framework, MongoDB NoSQL database, and Node.js server platform.

How to Hire Node.js Developers And How Much Does It Cost?

A Guide to Hire Node.js Developers who can help you create fast and efficient web applications. Also, know how much does it cost to hire Node.js Developers.

Build a REST API using Node.js, Express.js, Mongoose.js and MongoDB

Node.js, Express.js, Mongoose.js, and MongoDB is a great combination for building easy and fast REST API. You will see how fast that combination than other existing frameworks because of Node.js is a packaged compilation of Google’s V8 JavaScript engine and it works on non-blocking and event-driven I/O. Express.js is a Javascript web server that has a complete function of web development including REST API.