Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can a Slack bot detect a direct message vs a message in a channel?

Tags:

slack-api

TL;DR: Via the Slack APIs, how can I differentiate between a message in a channel vs a direct message?

I have a working Slack bot using the RTM API, let's call it Edi. And it works great as long as all commands start with "@edi"; e.g. "@edi help". It currently responses to any channel it's a member of and direct messages. However, I'd like to update the bot so that when it's a direct message, there won't be a need to start a command with "@edi"; e.g. "@edi help" in a channel, but "help" in a direct message. I don't see anything specific to differentiate between the two, but I did try using the channel.info endpoint and counting the number of people in "members"; however, this method only works on public channel. For private channels and direct messages, the endpoint returns an "channel_not_found" error.

Thanks in advance.

like image 925
Roger Avatar asked Dec 12 '16 23:12

Roger


People also ask

Can direct messages in Slack be seen?

Reading Your Private Messages Can your boss read your Slack direct messages? In brief, yes, but they can't actively read your messages as you send them. Slack allows employers to download and export Slack conversations, whether they're public or private, into zip files.

Can Slack bot send direct message to user?

Bot users can't post to a direct message conversation between two users using chat.

How does Slack bot work?

You may see Slackbot in channels throughout your workspace, delivering reminders and automated messages for you and your teammates. When there's a reminder or a message just for you, Slackbot will send you a DM. You can access your DM with Slackbot the same way you would find a DM with anyone else in your workspace.

Can Slack bot post to private channel?

A bot can't post in a private channel if it's not a member - you need to invite it to the channel like you would a person.


2 Answers

I talked to James at Slack and he gave me a simply way to determine if a message is a DM or not; if a channel ID begins with a:

  • C, it's a public channel
  • D, it's a DM with the user
  • G, it's either a private channel or multi-person DM

However, these values aren't set in stone and could change at some point, or be added to.

So if that syntax goes away, another way to detect a DM to use both channels.info and groups.info. If they both return “false” for the “ok” field, then you know it’s a DM.

Note:

  • channels.info is for public channels only
  • groups.info is for private channels and multi-person DMs only

Bonus info: Once you detect a that a message is a DM, use either the user ID or channel ID and search for it in the results of im.list; if you find it, then you’ll know it’s a DM to the bot.

  • “id” from im.list is the channel ID
  • “user” from im.list is the user ID from the person DM’ing with the bot
  • You don’t pass in the bot’s user ID, because it’s extracted from the token
like image 194
Roger Avatar answered Nov 05 '22 16:11

Roger


Slack have added Conversations API some time ago. You should use it to differentiate between PM/channel instead of relying on prefix.

From Conversations API documentation:

Each channel has a unique-to-the-team ID that begins with a single letter prefix, either C, G, or D. When a channel is shared across teams (see Developing for Shared Channels), the prefix of the channel ID may be changed, e.g. a private channel with ID G0987654321 may become ID C0987654321.

This is one reason you should use the conversations methods instead of the previous API methods! You cannot rely on a private shared channel's unique ID remaining constant during its entire lifetime.

Get conversation info using conversations.info method and check is_im flag. is_im == true means that the conversation is a direct message between two distinguished individuals or a user and a bot.

like image 20
dvor Avatar answered Nov 05 '22 16:11

dvor