nestjs-slack-bolt
Version:
A NestJS module for seamless integration with Slack using the Bolt SDK
291 lines (226 loc) • 10.3 kB
Markdown
<p align="center">
<a href="https://github.com/bamada/nest-slack-bolt" target="blank"><img src="logo.svg" width="100" alt="Nestjs Slack Bolt" /></a>
</p>
<p align="center">A <a href="http://nestjs.com/" target="blank">Nestjs</a> module to interact seamlessly with <a href="https://api.slack.com/" target="_blank">Slack</a> API using the <a href="https://api.slack.com/bolt">Bolt</a> SDK.</p>
<p align="center">
<a href="https://www.npmjs.com/package/nestjs-slack-bolt" target="_blank"><img src="https://img.shields.io/npm/v/nestjs-slack-bolt.svg" alt="NPM Version" /></a>
<a href="https://www.npmjs.com/package/nestjs-slack-bolt" target="_blank"><img src="https://img.shields.io/npm/l/nestjs-slack-bolt.svg" alt="Package License" /></a>
<a href="https://www.npmjs.com/package/nestjs-slack-bolt" target="_blank"><img src="https://img.shields.io/npm/dm/nestjs-slack-bolt.svg" alt="NPM Downloads" /></a>
<a href="https://github.com/bamada/nest-slack-bolt/actions"><img src="https://github.com/bamada/nest-slack-bolt/workflows/CI/badge.svg" alt="CI Status" /></a>
<a href="https://github.com/bamada/nest-slack-bolt#contributors-"><img src="https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square" alt="All Contributors" /></a>
<a href="https://github.com/prettier/prettier"><img src="https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square" alt="code style: prettier" /></a>
</p>
## Table of Contents
- [Description](#description)
- [Features](#features)
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Configuration](#configuration)
- [Usage](#usage)
- [Using annotations](#using-annotations)
- [Handling a message event](#handling-a-message-event)
- [Handling an action](#handling-an-action)
- [Handling a command](#handling-a-command)
- [Handling an event](#handling-an-event)
- [Handling a shortcut event](#handling-a-shortcut-event)
- [Using the SlackService](#using-the-slackservice)
- [Troubleshooting](#troubleshooting)
- [Changelog](#changelog)
- [Contributing](#contributing)
- [Support](#support)
- [License](#license)
- [Contributors](#contributors-)
## Description
This module provides a convenient way to develop Slack applications using the Nestjs framework. It seamlessly integrates the Slack Bolt SDK with NestJS, allowing you to leverage the power of both platforms.
## Features
- **Message Handling**: Easily respond to and process incoming Slack messages.
- **Command Handling**: Implement custom Slack commands for your application.
- **Action Handling**: React to user interactions with buttons, select menus, and other Slack UI elements.
- **Event Handling**: Listen and respond to various Slack events in real-time.
- **Shortcut Handling**: Create and manage global and message shortcuts.
- **View Submissions**: Process and respond to modal view submissions.
- **Seamless NestJS Integration**: Utilize NestJS dependency injection and module system with Slack Bolt.
- **Decorators for Easy Setup**: Use custom decorators to quickly set up event listeners.
## Installation
```bash
$ npm install nestjs-slack-bolt
# or
$ yarn add nestjs-slack-bolt
```
## Quick Start
1. Install the package
2. Set up environment variables (see Configuration)
3. Import SlackModule in your app.module.ts:
```typescript
import { Module } from '@nestjs/common';
import { SlackModule } from 'nestjs-slack-bolt';
@Module({
imports: [SlackModule.forRoot()],
})
export class AppModule {}
```
4. Use decorators in your controllers to handle Slack events
## Configuration
Add these variables to your `.env` file:
```bash
# Required for all modes
SLACK_BOT_TOKEN="xoxb-your-bot-token"
# Required for socket mode
SLACK_APP_TOKEN="xapp-your-app-token"
SLACK_SOCKET_MODE=true
# Required for HTTP mode
SLACK_SIGNING_SECRET="your-signing-secret"
```
You can also pass options to `SlackModule.forRoot()`:
```typescript
SlackModule.forRoot({
logLevel: LogLevel.DEBUG,
// other Bolt app options
});
```
## Usage
### Using annotations
#### Handling a message event
```typescript
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
```typescript
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
```typescript
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
```typescript
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
```typescript
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...
}
```
### Using the SlackService
```typescript
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 }),
}),
);
}
}
```
## Troubleshooting
Here are some common issues and their solutions:
1. "**Cannot find module 'nestjs-slack-bolt'**": Ensure you've installed the package correctly.
2. "**Invalid token**": Double-check your SLACK_BOT_TOKEN in the .env file.
3. **Socket mode not working**: Verify that SLACK_APP_TOKEN is set and SLACK_SOCKET_MODE is true.
For more issues, please check our GitHub issues or open a new one.
## Changelog
See CHANGELOG.md for details on recent changes.
## Contributing
We welcome contributions! Please see our CONTRIBUTING.md for details on how to contribute.
## Support
For support, please open an issue on our GitHub repository.
## License
This project is licensed under the MIT License - see the LICENSE file for details.
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bamada"><img src="https://avatars.githubusercontent.com/u/7466570?v=4?s=100" width="100px;" alt="madcam"/><br /><sub><b>madcam</b></sub></a><br /><a href="https://github.com/bamada/nest-slack-bolt/commits?author=bamada" title="Tests">⚠️</a> <a href="https://github.com/bamada/nest-slack-bolt/commits?author=bamada" title="Code">💻</a> <a href="https://github.com/bamada/nest-slack-bolt/commits?author=bamada" title="Documentation">📖</a> <a href="https://github.com/bamada/nest-slack-bolt/issues?q=author%3Abamada" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nadirabbas"><img src="https://avatars.githubusercontent.com/u/38838675?v=4?s=100" width="100px;" alt="Nadir Abbas"/><br /><sub><b>Nadir Abbas</b></sub></a><br /><a href="https://github.com/bamada/nest-slack-bolt/commits?author=nadirabbas" title="Tests">⚠️</a> <a href="https://github.com/bamada/nest-slack-bolt/commits?author=nadirabbas" title="Documentation">📖</a> <a href="https://github.com/bamada/nest-slack-bolt/issues?q=author%3Anadirabbas" title="Bug reports">🐛</a> <a href="https://github.com/bamada/nest-slack-bolt/commits?author=nadirabbas" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ognjenco"><img src="https://avatars.githubusercontent.com/u/8527400?v=4?s=100" width="100px;" alt="ognjenco"/><br /><sub><b>ognjenco</b></sub></a><br /><a href="https://github.com/bamada/nest-slack-bolt/issues?q=author%3Aognjenco" title="Bug reports">🐛</a> <a href="https://github.com/bamada/nest-slack-bolt/commits?author=ognjenco" title="Code">💻</a> <a href="https://github.com/bamada/nest-slack-bolt/commits?author=ognjenco" title="Documentation">📖</a> <a href="https://github.com/bamada/nest-slack-bolt/commits?author=ognjenco" title="Tests">⚠️</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification.