2

I have a Slack command bot that posts ephemeral messages and lets the user decide whether they want to make the message visible to everyone else in the channel ('Send') or delete the message ('Cancel'). Since Slack API doesn't provide the original message when user interacts with an ephemeral message, I have to store original messages in Redis, retrieve them when user interacts with the posted message and delete the key from Redis afterwards. The one thing I'm worried about is clogging up Redis with keys that will never be deleted because user never interacts with the message (in other words, doesn't tap on any of the buttons, just leaves the message as is and walks away).

Does Slack API provide any way of knowing when ephemeral messages get deleted so I can clean up Redis? Or is there a better way to solve this problem in general?

Erik Kalkoken
  • 30,467
  • 8
  • 79
  • 114
nambatee
  • 1,478
  • 16
  • 27

1 Answers1

2

No - Slack has no mechanism to inform your app when an ephemeral message vanished. In general they will live until the user refreshes the page on his browser (in the web version).

But I can offer an alternative solution to storing all messages on redis:

Since you created the initial ephemeral message you should be able to always recreate that same message later if you know the exact functional context (e.g. User ID).

All you need to do is to store an ID linking to its context in the buttons of your first message. If the user clicks on the buttons the Slack request will include those IDs, which allows you to identify its context, e.g. take the proper action or recreate the same message for sending to the whole channel.

You can use the name or value field of an action for storing IDs. (See also this answer.)

That ID can either represent the instance of an object (e.g. a customer), so you can fetch that object from your DB again or it can be the ID of your server session, which enables you to work with server session and keep all the context data in the server session. (see also this answer).

Erik Kalkoken
  • 30,467
  • 8
  • 79
  • 114
  • Thanks! My ephemeral messages are created with data fetched from an API - I could pass the command that triggered the fetch in the button value and refetch when user taps the button but there's no guarantee that I get the same data - some responses are time-sensitive. That's what led me to storing original messages in Redis. Maybe I'll just set an expiration date on my Redis keys and purge them after a week or so. – nambatee Oct 09 '18 at 23:58