1.1.0 • Published 3 months ago

@bcpros/nestjs-slack-bolt v1.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
3 months ago

code style: prettier All Contributors


Table of Contents


Description

This module gives a handy way to develop Slack applications using the Nestjs framework

Features

The Nestjs Slack Bolt module offers the following features to simplify the interaction between your application and Slack API:

  • Message Handling
  • Command Handling
  • Action Handling
  • Event Handling
  • Shortcut Handling

Installation

The module can be installed using yarn or npm:

$ yarn add nestjs-slack-bolt

OR

$ npm i nestjs-slack-bolt

Setting Up

Add these variables to the .env file to set up the module:

# To define on API mode
SLACK_SIGNING_SECRET="**"

# To define on Socket mode
SLACK_APP_TOKEN="**"

# Required variables
SLACK_BOT_TOKEN="**"
SLACK_SOCKET_MODE=true

Usage

To use the module, import the SlackModule:

import { Module } from '@nestjs/common';
import { SlackModule } from 'nestjs-slack-bolt';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [SlackModule.forRoot()],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Examples

Here are a few examples to demonstrate how you can use the Nestjs Slack Bolt module in your application:

Using annotations

Handling a message event

import { Controller } from '@nestjs/common';
import { Message } from 'nestjs-slack-bolt';
import { SlackEventMiddlewareArgs } from '@slack/bolt';

@Controller()
export class AppController {
  @Message('hi')
  message({ say }: SlackEventMiddlewareArgs) {
    say('Hello, I received your message!');
  }
  // Other handlers...
}

Handling an action

import { Controller } from '@nestjs/common';
import { Action } from 'nestjs-slack-bolt';
import { SlackActionMiddlewareArgs } from '@slack/bolt';

@Controller()
export class AppController {
  @Action('click')
  action({ say }: SlackActionMiddlewareArgs) {
    say('Click event received, nice job!');
  }
  // Other handlers...
}

Handling a command

import { Controller } from '@nestjs/common';
import { Command } from 'nestjs-slack-bolt';
import { SlackCommandMiddlewareArgs } from '@slack/bolt';

@Controller()
export class AppController {
  @Command('/list')
  command({ say }: SlackCommandMiddlewareArgs) {
    say('The /list command has been received. Processing...');
  }
  // Other handlers...
}

Handling an event

import { Controller } from '@nestjs/common';
import { Event } from 'nestjs-slack-bolt';
import { SlackEventMiddlewareArgs } from '@slack/bolt';

@Controller()
export class AppController {
  @Event('app_home_opened')
  event({ say }: SlackEventMiddlewareArgs) {
    say('The app was just opened!');
  }
  // Other handlers...
}

Handling a shortcut event

import { Controller } from '@nestjs/common';
import { Shortcut } from 'nestjs-slack-bolt';

@Controller()
export class AppController {
  @Shortcut('test_shortcut')
  async shortcut({ shortcut, ack, client, logger }) {
    try {
      await ack(); //Acknowledge shortcut request

      const result = await client.views.open({
        trigger_id: shortcut.trigger_id,
        view: { /* Your view parameters */ }
      });

      logger.info(result); // Log the result
    } 
    catch (error) {
      logger.error(error); // Log any error
    }
  }
  // Other handlers...
}

These examples demonstrate how to handle different types of interactions in your Slack application using the NestJS Slack Bolt module.

Using the SlackService

import { Controller } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { SlackService } from 'nestjs-slack-bolt/services/slack.service';
import { Cron, CronExpression } from '@nestjs/schedule';
import { from } from 'rxjs';

@Controller()
export class AppController {
  constructor(
    private readonly slackService: SlackService,
    private readonly configService: ConfigService,
  ) {}

  @Cron(CronExpression.EVERY_10_SECONDS)
  cronJob() {
    this.searchUsers()
      .pipe()
      .subscribe((users) => {
        console.log(JSON.stringify(users));
      });
  }

  searchUsers(cursor?: string) {
    return from(
      this.slackService.client.users.list({
        token: this.configService.get('SLACK_BOT_TOKEN'),
        limit: 1,
        ...(cursor && { cursor }),
      }),
    );
  }
}

Contributors ✨

Thanks goes to these wonderful people (emoji key):

This project follows the all-contributors specification. Contributions of any kind welcome!