← Botkit Documentation ← Class Index
This is a class reference for all the methods exposed by the botbuilder-adapter-slack package.
Connect Botkit or BotBuilder to Slack.
To use this class in your application, first install the package:
npm install --save botbuilder-adapter-slackThen import this and other classes into your code:
const { SlackAdapter } = require('botbuilder-adapter-slack');This class includes the following methods:
- activityToSlack()
- continueConversation()
- deleteActivity()
- getAPI()
- getBotUserByTeam()
- getInstallLink()
- processActivity()
- sendActivities()
- updateActivity()
- validateOauthCode()
Parameters
| Argument | Type | Description |
|---|---|---|
| options | SlackAdapterOptions | An object containing API credentials, a webhook verification token and other options |
Create a Slack adapter.
The SlackAdapter can be used in 2 modes: * As an "internal integration connected to a single Slack workspace * As a "Slack app that uses oauth to connect to multiple workspaces and can be submitted to the Slack app.
Read here for more information about all the ways to configure the SlackAdapter →.
Use with Botkit:
const adapter = new SlackAdapter({
clientSigningSecret: process.env.CLIENT_SIGNING_SECRET,
botToken: process.env.BOT_TOKEN
});
const controller = new Botkit({
adapter: adapter,
// ... other configuration options
});Use with BotBuilder:
const adapter = new SlackAdapter({
clientSigningSecret: process.env.CLIENT_SIGNING_SECRET,
botToken: process.env.BOT_TOKEN
});
// set up restify...
const server = restify.createServer();
server.use(restify.plugins.bodyParser());
server.post('/api/messages', (req, res) => {
adapter.processActivity(req, res, async(context) => {
// do your bot logic here!
});
});Use in "Slack app" multi-team mode:
const adapter = new SlackAdapter({
clientSigningSecret: process.env.CLIENT_SIGNING_SECRET,
clientId: process.env.CLIENT_ID, // oauth client id
clientSecret: process.env.CLIENT_SECRET, // oauth client secret
scopes: ['bot'], // oauth scopes requested
oauthVersion: 'v1',
redirectUri: process.env.REDIRECT_URI, // url to redirect post login defaults to `https://<mydomain>/install/auth`
getTokenForTeam: async(team_id) => Promise<string>, // function that returns a token based on team id
getBotUserByTeam: async(team_id) => Promise<string>, // function that returns a bot's user id based on team id
});Formats a BotBuilder activity into an outgoing Slack message.
Parameters
| Argument | Type | description |
|---|---|---|
| activity | Partial<Activity> | A BotBuilder Activity object |
Returns
a Slack message object with {text, attachments, channel, thread_ts} as well as any fields found in activity.channelData
Standard BotBuilder adapter method for continuing an existing conversation based on a conversation reference. BotBuilder reference docs
Parameters
| Argument | Type | description |
|---|---|---|
| reference | Partial<ConversationReference> | A conversation reference to be applied to future messages. |
| logic | A bot logic function that will perform continuing action in the form async(context) => { ... } |
Standard BotBuilder adapter method to delete a previous message. BotBuilder reference docs.
Parameters
| Argument | Type | description |
|---|---|---|
| context | TurnContext | A TurnContext representing the current incoming message and environment. |
| reference | Partial<ConversationReference> | An object in the form {activityId: <id of message to delete>, conversation: { id: <id of slack channel>}} |
Get a Slack API client with the correct credentials based on the team identified in the incoming activity.
This is used by many internal functions to get access to the Slack API, and is exposed as bot.api on any bot worker instances.
Parameters
| Argument | Type | description |
|---|---|---|
| activity | Partial<Activity> | An incoming message activity |
Get the bot user id associated with the team on which an incoming activity originated. This is used internally by the SlackMessageTypeMiddleware to identify direct_mention and mention events.
In single-team mode, this will pull the information from the Slack API at launch.
In multi-team mode, this will use the getBotUserByTeam method passed to the constructor to pull the information from a developer-defined source.
Parameters
| Argument | Type | description |
|---|---|---|
| activity | Partial<Activity> | An incoming message activity |
Get the oauth link for this bot, based on the clientId and scopes passed in to the constructor.
Returns
A url pointing to the first step in Slack's oauth flow.
An example using Botkit's internal webserver to configure the /install route:
controller.webserver.get('/install', (req, res) => {
res.redirect(controller.adapter.getInstallLink());
});Accept an incoming webhook request and convert it into a TurnContext which can be processed by the bot's logic.
Parameters
| Argument | Type | description |
|---|---|---|
| req | any | A request object from Restify or Express |
| res | any | A response object from Restify or Express |
| logic | A bot logic function in the form async(context) => { ... } |
Standard BotBuilder adapter method to send a message from the bot to the messaging API. BotBuilder reference docs.
Parameters
| Argument | Type | description |
|---|---|---|
| context | TurnContext | A TurnContext representing the current incoming message and environment. |
| activities | An array of outgoing activities to be sent back to the messaging API. |
Standard BotBuilder adapter method to update a previous message with new content. BotBuilder reference docs.
Parameters
| Argument | Type | description |
|---|---|---|
| context | TurnContext | A TurnContext representing the current incoming message and environment. |
| activity | Partial<Activity> | The updated activity in the form {id: <id of activity to update>, ...} |
Validates an oauth v2 code sent by Slack during the install process.
Parameters
| Argument | Type | description |
|---|---|---|
| code | string | the value found in req.query.code as part of Slack's response to the oauth flow. |
An example using Botkit's internal webserver to configure the /install/auth route:
controller.webserver.get('/install/auth', async (req, res) => {
try {
const results = await controller.adapter.validateOauthCode(req.query.code);
// make sure to capture the token and bot user id by team id...
const team_id = results.team.id;
const token = results.access_token;
const bot_user = results.bot_user_id;
// store these values in a way they'll be retrievable with getBotUserByTeam and getTokenForTeam
} catch (err) {
console.error('OAUTH ERROR:', err);
res.status(401);
res.send(err.message);
}
});This is a specialized version of Botkit's core BotWorker class that includes additional methods for interacting with Slack. It includes all functionality from the base class, as well as the extension methods below.
When using the SlackAdapter with Botkit, all bot objects passed to handler functions will include these extensions.
To use this class in your application, first install the package:
npm install --save botbuilder-adapter-slackThen import this and other classes into your code:
const { SlackBotWorker } = require('botbuilder-adapter-slack');This class includes the following methods:
- deleteMessage()
- dialogError()
- replyEphemeral()
- replyInThread()
- replyInteractive()
- replyPrivate()
- replyPublic()
- replyWithDialog()
- startConversationInChannel()
- startConversationInThread()
- startPrivateConversation()
- updateMessage()
Parameters
| Argument | Type | Description |
|---|---|---|
| botkit | Botkit | The Botkit controller object responsible for spawning this bot worker |
| config | any | Normally, a DialogContext object. Can also be the id of a team. |
Reserved for use internally by Botkit's controller.spawn(), this class is used to create a BotWorker instance that can send messages, replies, and make other API calls.
It is possible to spawn a bot instance by passing in the Slack workspace ID of a team that has installed the app. Use this in concert with startPrivateConversation() and changeContext() to start conversations or send proactive alerts to users on a schedule or in response to external events.
// spawn a bot for a given team.
let bot = await controller.spawn('T0123456');
// start a 1:1 with a specific user
await bot.startPrivateConversation('U0123456');
// send a message
await bot.say('Hi user');| Name | Type | Description |
|---|---|---|
| api | WebClient | A copy of hte Slack WebClient giving, giving access to all of Slack's APIs via let res = await bot.api.object.method(params); |
Delete an existing message.
Parameters
| Argument | Type | description |
|---|---|---|
| update | Partial<BotkitMessage> | An object in the form of {id: <id of message to delete>, conversation: { id: <channel of message> }} |
// send a reply, capture the results
let sent = await bot.reply(message,'this is my original reply...');
// delete the sent message using the sent.id field
await bot.deleteMessage(sent);Return 1 or more error to a dialog_submission event that will be displayed as form validation errors.
Each error must be mapped to the name of an input in the dialog.
Parameters
| Argument | Type | description |
|---|---|---|
| errors | 1 or more objects in form {name: string, error: string} |
Like bot.reply, but sent as an "ephemeral" message meaning only the recipient can see it. Uses chat.postEphemeral
Parameters
| Argument | Type | description |
|---|---|---|
| src | any | an incoming message object |
| resp | any | an outgoing message object (or part of one or just reply text) |
Like bot.reply, but as a threaded response to the incoming message rather than a new message in the main channel.
Parameters
| Argument | Type | description |
|---|---|---|
| src | any | an incoming message object |
| resp | any | an outgoing message object (or part of one or just reply text) |
Like bot.reply, but used to respond to an interactive_message event and cause the original message to be replaced with a new one.
Parameters
| Argument | Type | description |
|---|---|---|
| src | any | an incoming message object of type interactive_message |
| resp | any | a new or modified message that will replace the original one |
Like bot.reply, but used to send an immediate private reply to a /slash command.
The message in resp will be displayed only to the person who executed the slash command.
Parameters
| Argument | Type | description |
|---|---|---|
| src | any | an incoming message object of type slash_command |
| resp | any | an outgoing message object (or part of one or just reply text) |
Like bot.reply, but used to send an immediate public reply to a /slash command.
The message in resp will be displayed to everyone in the channel.
Parameters
| Argument | Type | description |
|---|---|---|
| src | any | an incoming message object of type slash_command |
| resp | any | an outgoing message object (or part of one or just reply text) |
Reply to a button click with a request to open a dialog.
Parameters
| Argument | Type | description |
|---|---|---|
| src | any | An incoming interactive_callback event containing a trigger_id field |
| dialog_obj | Dialog | A dialog, as created using SlackDialog or authored to this spec. |
Switch a bot's context into a different channel.
After calling this method, messages sent with bot.say and any dialogs started with bot.beginDialog will occur in this new context.
Parameters
| Argument | Type | description |
|---|---|---|
| channelId | string | A Slack channel id, like one found in message.channel |
| userId | string | A Slack user id, like one found in message.user or in a <@mention> |
controller.hears('dm me', 'message', async(bot, message) => {
// switch to the channel specified in SLACK_CHANNEL_ID
// if just using bot.say and not starting a dialog, can use a fake value for user id.
await bot.startConversationInChannel(SLACK_CHANNEL_ID, message.user);
// say hello
await bot.say('Shall we discuss this matter over here?');
// ... continue...
await bot.beginDialog(ANOTHER_DIALOG);
});Switch a bot's context into a specific sub-thread within a channel.
After calling this method, messages sent with bot.say and any dialogs started with bot.beginDialog will occur in this new context.
Parameters
| Argument | Type | description |
|---|---|---|
| channelId | string | A Slack channel id, like one found in message.channel |
| userId | string | A Slack user id, like one found in message.user or in a <@mention> |
| thread_ts | string | A thread_ts value found in the message.thread_ts or message.ts field. |
controller.hears('in a thread', 'message', async(bot, message) => {
// branch from the main channel into a side thread associated with this message
await bot.startConversationInThread(message.channel, message.user, message.ts);
// say hello
await bot.say(`Let's handle this offline...`);
// ... continue...
await bot.beginDialog(OFFLINE_DIALOG);
});Switch a bot's context to a 1:1 private message channel with a specific user.
After calling this method, messages sent with bot.say and any dialogs started with bot.beginDialog will occur in this new context.
Parameters
| Argument | Type | description |
|---|---|---|
| userId | string | A Slack user id, like one found in message.user or in a <@mention> |
controller.hears('dm me', 'message', async(bot, message) => {
// switch to a 1:1 conversation in a DM
await bot.startPrivateConversation(message.user);
// say hello
await bot.say('We are in private now...');
await bot.beginDialog(MY_PRIVATE_DIALOG);
});Also useful when sending pro-active messages such as those sent on a schedule or in response to external events:
// Spawn a worker with a Slack team id.
let bot = await controller.spawn(SLACK_TEAM_ID);
// Set the context for the bot's next action...
await bot.startPrivateConversation(SLACK_ADMIN_USER);
// Begin a dialog in the 1:1 context
await bot.beginDialog(ALERT_DIALOG);Update an existing message with new content.
Parameters
| Argument | Type | description |
|---|---|---|
| update | Partial<BotkitMessage> | An object in the form {id: <id of message to update>, conversation: { id: <channel> }, text: <new text>, card: <array of card objects>} |
// send a reply, capture the results
let sent = await bot.reply(message,'this is my original reply...');
// update the sent message using the sent.id field
await bot.updateMessage({
text: 'this is an update!',
...sent
})Create a Slack Dialog object for use with replyWithDialog().
let dialog = new SlackDialog('My Dialog', 'callback_123', 'Save');
dialog.addText('Your full name', 'name').addEmail('Your email', 'email');
dialog.notifyOnCancel(true);
bot.replyWithDialog(message, dialog.asObject());To use this class in your application, first install the package:
npm install --save botbuilder-adapter-slackThen import this and other classes into your code:
const { SlackDialog } = require('botbuilder-adapter-slack');This class includes the following methods:
- addEmail()
- addNumber()
- addSelect()
- addTel()
- addText()
- addTextarea()
- addUrl()
- asObject()
- asString()
- callback_id()
- notifyOnCancel()
- state()
- submit_label()
- title()
Parameters
| Argument | Type | Description |
|---|---|---|
| title | string | Title of dialog |
| callback_id | string | Callback id of dialog |
| submit_label | string | Label for the submit button |
| elements | any | An array of dialog elements |
Create a new dialog object
Add an email input to the dialog
Parameters
| Argument | Type | description |
|---|---|---|
| label | string | |
| name | string | |
| value | string | |
| options (optional) | any |
Add a number input to the dialog
Parameters
| Argument | Type | description |
|---|---|---|
| label | string | |
| name | string | |
| value | string | |
| options (optional) | any |
Add a dropdown select input to the dialog
Parameters
| Argument | Type | description |
|---|---|---|
| label | string | |
| name | string | |
| value | ||
| option_list | ||
| options (optional) | any |
Add a telephone number input to the dialog
Parameters
| Argument | Type | description |
|---|---|---|
| label | string | |
| name | string | |
| value | string | |
| options (optional) | any |
Add a text input to the dialog
Parameters
| Argument | Type | description |
|---|---|---|
| label | ||
| name | string | |
| value | string | |
| options | ||
| subtype (optional) | string |
Add a text area input to the dialog
Parameters
| Argument | Type | description |
|---|---|---|
| label | string | |
| name | string | |
| value | string | |
| options | any | |
| subtype | string |
Add a URL input to the dialog
Parameters
| Argument | Type | description |
|---|---|---|
| label | string | |
| name | string | |
| value | string | |
| options (optional) | any |
Get the dialog object for use with bot.replyWithDialog()
Get the dialog object as a JSON encoded string.
Set the dialog's callback_id
Parameters
| Argument | Type | description |
|---|---|---|
| v | string | Value for the callback_id |
Set true to have Slack notify you with a dialog_cancellation event if a user cancels the dialog without submitting
Parameters
| Argument | Type | description |
|---|---|---|
| set | boolean | True or False |
Set the dialog's state field
Parameters
| Argument | Type | description |
|---|---|---|
| v | any | value for state |
Set the button text for the submit button on the dialog
Parameters
| Argument | Type | description |
|---|---|---|
| v | string | Value for the button label |
Set the title of the dialog
Parameters
| Argument | Type | description |
|---|---|---|
| v | string | Value for title |
A middleware for Botkit developers using the BotBuilder SlackAdapter class.
This middleware causes Botkit to emit message events by their type or subtype field rather than their default BotBuilder Activity type (limited to message or event).
This keeps the new Botkit behavior consistent withprevious versions, and provides helpful filtering on the many event types that Slack sends.
To use this, bind it to the adapter before creating the Botkit controller:
const adapter = new SlackAdapter(options);
adapter.use(new SlackEventMiddleware());
const controller = new Botkit({
adapter: adapter,
// ...
});
// can bind directly to channel_join (which starts as a message with type message and subtype channel_join)
controller.on('channel_join', async(bot, message) => {
// send a welcome
});To use this class in your application, first install the package:
npm install --save botbuilder-adapter-slackThen import this and other classes into your code:
const { SlackEventMiddleware } = require('botbuilder-adapter-slack');This class includes the following methods:
Not for direct use - implements the MiddlewareSet's required onTurn function used to process the event
Parameters
| Argument | Type | description |
|---|---|---|
| context | TurnContext | |
| next |
A middleware for Botkit developers using the BotBuilder SlackAdapter class. This middleware causes Botkit to emit more specialized events for the different types of message that Slack might send. Responsible for classifying messages:
* `direct_message` events are messages received through 1:1 direct messages with the bot
* `direct_mention` events are messages that start with a mention of the bot, i.e "@mybot hello there"
* `mention` events are messages that include a mention of the bot, but not at the start, i.e "hello there @mybot"
In addition, messages from bots and changing them to bot_message events. All other types of message encountered remain message events.
To use this, bind it to the adapter before creating the Botkit controller:
const adapter = new SlackAdapter(options);
adapter.use(new SlackMessageTypeMiddleware());
const controller = new Botkit({
adapter: adapter,
// ...
});To use this class in your application, first install the package:
npm install --save botbuilder-adapter-slackThen import this and other classes into your code:
const { SlackMessageTypeMiddleware } = require('botbuilder-adapter-slack');This class includes the following methods:
Not for direct use - implements the MiddlewareSet's required onTurn function used to process the event
Parameters
| Argument | Type | description |
|---|---|---|
| context | TurnContext | |
| next |
This interface defines the options that can be passed into the SlackAdapter constructor function.
Fields
| Name | Type | Description |
|---|---|---|
| botToken | string | A token (provided by Slack) for a bot to work on a single workspace |
| clientId | string | The oauth client id provided by Slack for multi-team apps |
| clientSecret | string | The oauth client secret provided by Slack for multi-team apps |
| clientSigningSecret | string | A token used to validate that incoming webhooks originated with Slack. |
| enable_incomplete | boolean | Allow the adapter to startup without a complete configuration. This is risky as it may result in a non-functioning or insecure adapter. This should only be used when getting started. |
| getBotUserByTeam | A method that receives a Slack team id and returns the bot user id associated with that team. Required for multi-team apps. |
|
| getTokenForTeam | A method that receives a Slack team id and returns the bot token associated with that team. Required for multi-team apps. |
|
| oauthVersion | string | Which version of Slack's oauth protocol to use, v1 or v2. Defaults to v1. |
| redirectUri | string | The URL users will be redirected to after an oauth flow. In most cases, should be https://<mydomain.com>/install/auth |
| scopes | A array of scope names that are being requested during the oauth process. Must match the scopes defined at api.slack.com |
|
| verificationToken | string | Legacy method for validating the origin of incoming webhooks. Prefer clientSigningSecret instead. |