Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time



DestinySlackBot is built using botkit in concert with standard es2015 JavaScript.
Babel is used for transpiling


  • Navigate to Bungie and create an application
    • Take note of your application's Bungie API Key
  • Navigate to Slack and create an app
    • After creating your app, take note of Client ID and Client Secret
    • Navigate to the Bot Users tab and name give your bot user a name.
  • Navigate to Twitch and create an app (bottom of page)
    • Make note of the API key
  • Make sure NodeJS is installed


Run npm i

Open ./app.config.js and update it with the Bungie API Key, Slack Client ID, Slack Client Secret, Twitch API Key obtained during preparation. The port can be modified as well if desired.

  "APP": {
    "PORT": 8001,

    "BUNGIE": {
      "API_KEY": "Bungie Api Key"
    "GG" : {
    "SLACK": {
      "CLIENT_ID": "Slack Client Id",
      "CLIENT_SECRET": "Slack Client Secret"
    "TWITCH": {
      "API_KEY": "Twitch Api Key"
      "API_URL": ""

Interactive Messages

Slack has introduced the ability to serve interactive messages which users can interact with. DestinySlackBot leverages this for various features. To use them locally, there are some additional required steps:

  • Install the localtunnel package from npm npm i -g localtunnel
  • Navigate to the Interactive Messages tab on Your Slack App's Config Page
    • Decide on a unique name to use (we will refer to it as someuniquename)
    • Set the Request URL to https://<someuniquename> replacing <someuniquename> with your chosen name

Running the bot

Assuming everything above was done properly, we should now be set to run the bot


There are some npm scripts defined in package.json used for building the bot

Both build commands will create the ./dist directory and output the built scripts to it.

  • npm run build will build the bot and include sourcemaps
  • npm run build-deploy will build the bot without sourcemaps


Using node, you can simply run node dist/app.js to start the bot

If you are using an IDE that supports debugging, dist/app.js is the entry point.

For the Interactive Messages to work, there is one more command that needs to be run when the application is started:

lt --subdomain <someuniquename> --port <port>


  • <someuniquename> is replaced with the same name as was provided to Slack
  • <port> is whatever value was decided on in app.config.json (default is 8001)

Register the bot to your slack team

When the bot starts up, you should see some output in your console similar to the following:

** Starting webserver on port 8001
info: ** Serving webhook endpoints for Slash commands and outgoing webhooks at:
info: ** Serving login URL:
info: ** Serving oauth return endpoint:
  • Navigate to the OAuth & Permissions tab on Your Slack App's Config Page

    • Set the redirect URL(s) to:
  • Navigate to specified in the output and authorize the bot on your team.

Congratulations! the bot should be set up and good to go!

Adding a new command

Adding a command is pretty straight forward (hopefully!)

To add a new command to the bot, create a new .js file under ./commands

Boilerplate for a new command:

import BotAction from '../../bot/BotAction';
import CommandParamRegex from '../../bot/CommandParamRegex';
import weeklyStats from './weeklyStats';
import {WEEK} from './weeklyStats';
import {COMMAND_GROUPING, REGEX} from '../../constants';

let command = ['<the base command/commands>'],
    respondsTo = ['direct_message', 'direct_mention', 'mention'],
    description = '',
    paramRegex = {
        // Parameters to be parsed out of user input, regex-based
        gamerTag: new CommandParamRegex(REGEX.ANY_TEXT)

// Action to be invoked when command is entered
function action(bot, message, command) {
    // Return a promise
    return weeklyStats(WEEK.PREVIOUS, command)
            .then(response => {
                return bot[command.replyFunctionName](message, response)

export default new BotAction({
    // Specify the group this command is a part of
    requiresAdmin // Optional

Add the new command to the index file in its directory

Basic error handling happens at the point where the action is invoked ./Bot/BotAction.js.invoke which is the reason we want to return a promise from the action itself.

A good example of this is ./util/getPlayerId which queries Bungie for a membershipId based on a provided gamerTag. If there is a match for this gamertag on multiple platforms, we need to let the user specify the platform. To do this, we return Promise.reject() with an error describing this and the default error handling picks it up and responds with an interactive message to allow the user to select a platform.


No description, website, or topics provided.



No releases published


No packages published