Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support posting to response_url for message actions (buttons) #113

Open
jmanian opened this issue Oct 7, 2016 · 9 comments
Open

support posting to response_url for message actions (buttons) #113

jmanian opened this issue Oct 7, 2016 · 9 comments
Labels

Comments

@jmanian
Copy link
Collaborator

jmanian commented Oct 7, 2016

When creating messages with interactive buttons, one of the ways to update the message after someone hits a button is to use make a request to the response_url, which is included in the action payload. It would be very convenient if this client could make those requests.

I did some initial poking around: I tried using the response_url as the endpoint, and then put the updated message content in the body, but I got Faraday::ClientError: the server responded with status 500, so I think I don't understand Faraday.

https://api.slack.com/docs/message-buttons#how_to_respond_to_message_button_actions

@dblock
Copy link
Collaborator

dblock commented Oct 8, 2016

It's just an HTTP POST to that URL, no? Examine the error in the 500, you're probably not formatting the message right.

Try to build a very simple sample on top of examples and I'll try to help you out.

@dblock dblock added the question label Oct 8, 2016
@jmanian
Copy link
Collaborator Author

jmanian commented Oct 9, 2016

Yes, whoops, I don't remember exactly what I was doing the other day, but I think I just needed to call to_json on the payload to get it to work. Either way, I can get it to work now like this:

connection.post do |req|
  req.url response_url
  req.body = {text: 'new message', attachments: [...]}.to_json
end

Do you think it makes sense to put a method on Slack::Web::Client that takes care of this? I'm not sure, because it's not actually part of the Web API, but it does sort of fit in there, and doesn't really fit in anywhere else.

If you think it makes sense on Slack::Web::Client then I can work on a PR.

@dblock
Copy link
Collaborator

dblock commented Oct 9, 2016

What's connection in this case? I totally think that making it easier would be great for the library. Can you post a little bit more code around the above and we can try and come up with a cleaner DSL?

@jmanian
Copy link
Collaborator Author

jmanian commented Oct 9, 2016

I'm using Slack::Web::Faraday::Connection#connection.

So for instance I can run it on the command line like this:

client = Slack::Web::Client.new(token: token)
client.send(:connection).post(response_url, args.to_json)

The reason I'm using Slack::Web::Faraday::Connection#connection is I wanted to inherit all the Faraday settings from there, though I honestly don't know if they're all desirable for this use case — I haven't dug in enough.

The reason I thought the new method should be an instance method on Slack::Web::Client was that I thought the request needed to include the token (and the instance contains the token). But it turns out that the request does not need the token, so the method could easily just be a class method somewhere instead.

@dblock
Copy link
Collaborator

dblock commented Oct 10, 2016

This is not in a realtime context, right? I mean the response URL appears as a response to what code? I think that response needs to become a class that exposes a connection method that automatically uses response_url. With Faraday I think this means adding some code that wraps the response into the class.

@jmanian
Copy link
Collaborator Author

jmanian commented Oct 10, 2016

Actually the response_url does not appear as a direct response to the app's code (for instance it does not come in a response to a Web API method call). Rather it appears in the payload of a POST to the app's API when a user clicks a button. So the URL first appears in a context completely divorced from slack-ruby-client. If I understand correctly, it sounds like your suggestion would only work if the response_url appeared within an interaction that was managed by slack-ruby-client.

@dblock
Copy link
Collaborator

dblock commented Oct 10, 2016

Oh I see, this is in response to a command, something that I had to do in https://github.com/dblock/slack-market/blob/master/slack-market/api/endpoints/slack_endpoint.rb for example. I guess there's nothing to do in the client indeed. If we wanted to support slash and other commands out of the box that code would belong at a higher level, ie. in slack-ruby-bot-server for example.

So you don't even need a token to POST to response_url, right? And there's really just one method on that to do POST. I think Slack::Web::Client is the wrong place to put code for it, maybe we should have a class like Slack::Web::Response that gets constructed with response_url: ... and inherits all the options?

@avand
Copy link

avand commented Nov 29, 2017

Was there any decision made with regard to how to respond to messages via response_url with the gem?

@dblock
Copy link
Collaborator

dblock commented Nov 29, 2017

No decision @avand, see my suggestion if you want to try to PR something.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants