Skip to content
Edge Functions

Slack Bot Mention Edge Function

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:

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:

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 })
}
}),
}