Back to Supabase

Slack Bot Mention Edge Function

apps/docs/content/guides/functions/examples/slack-bot-mention.mdx

1.26.082.1 KB
Original Source

The Slack Bot Mention Edge Function allows you to process mentions in Slack and respond accordingly.

Configuring Slack apps

For your bot to seamlessly interact with Slack, you'll need to configure Slack Apps:

  1. Navigate to the Slack Apps page.
  2. Under "Event Subscriptions," add the URL of the slack-bot-mention function and click to verify the URL.
  3. The Edge function will respond, confirming that everything is set up correctly.
  4. Add app-mention in the events the bot will subscribe to.

Creating the Edge Function

Deploy the following code as an Edge function using the CLI:

bash
supabase secrets set \
  SLACK_TOKEN=<xoxb-0000000000-0000000000-01010101010nacho101010> \
  --project-ref nacho_slacker

Here's the code of the Edge Function, you can change the response to handle the text received:

ts
import { WebClient } from 'npm:@slack/web-api@^7'
import { withSupabase } from 'npm:@supabase/server@^1'

const slackBotToken = Deno.env.get('SLACK_TOKEN') ?? ''
const botClient = new WebClient(slackBotToken)

console.log(`Slack URL verification function up and running!`)

// Slack calls this endpoint, so deploy with --no-verify-jwt.
export default {
  fetch: withSupabase({ auth: 'none' }, async (req) => {
    try {
      // Implement your Slack request signature verification here before trusting the payload
      // (validate `x-slack-signature` / `x-slack-request-timestamp` with your signing secret).
      const reqBody = await req.json()
      console.log(JSON.stringify(reqBody, null, 2))
      const { token, challenge, type, event } = reqBody

      if (type == 'url_verification') {
        return Response.json({ challenge })
      } else if (event.type == 'app_mention') {
        const { user, text, channel, ts } = event
        // Here you should process the text received and return a response:
        const response = await botClient.chat.postMessage({
          channel: channel,
          text: `Hello <@${user}>!`,
          thread_ts: ts,
        })
        return Response.json({ ok: true })
      }
    } catch (error) {
      return Response.json({ error: error.message }, { status: 500 })
    }
  }),
}