README.md

# Slack

A simple wrapper for handling interactive Slack HTTP requests.

Currently, only [slash command] and [interactive message] (button & menu) requests are supported.

Documentation can be found at [https://hexdocs.pm/slack_interactive](://hexdocs.pm/slack_interactive).

[slash command]: https://api.slack.com/slash-commands
[interactive message]: https://api.slack.com/docs/interactive-messages

## Installation

The package can be installed by adding `slack` with reference to `hex: :slack_interactive` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [{:slack, "~> 0.1.1", hex: :slack_interactive}]
end
```

## With Phoenix Controllers

Use `Slack.Phoenix.ActionController` in your Phoenix controllers with
your validation token provided by Slack. Valid Slack requests will be
forwarded to `handle_action` or `handle_command` respective to the
request type.

  ```elixir
  defmodule App.SlackController do
    use Slack.Phoenix.ActionController, token: "SLACK_TOKEN"

    import Plug.Conn

    def handle_action(action, conn, slack) do
      conn
      |> put_status(200)
      |> text("Working on this action")
    end

    def handle_command(command, conn, slack) do
      conn
      |> put_status(200)
      |> text("Working on this command")
    end
  end
  ```

## Handling Requests

  Define a route in your Phoenix router with the `:dispatch` action
  to validate incoming requests and dispatch to the overridable
  functions `handle_action` or `handle_command`.

  ```
  defmodule App.Router do
    use Phoenix.Router

    post "/slack/*path", App.SlackController, :dispatch
  end
  ```

  If an incoming request contains a matching validation token, either
  `handle_action` or `handle_command` will be called. Override these
  functions in your controller to manipulate the validated Slack data
  and respond to the request. The following arugments are passed to
  these functions:
  * `action` or `command`: Either the action `map` or command `string`
  from the request.
  * `conn`: The incoming request as a `Plug.Conn`.
  * `slack`: The incoming request parameters converted to a `Slack`
  struct.

  A `Plug.Conn` is expected as the return value for these functions.

## Slack Argument

  The third argument passed to the handle functions contains the
  below fields. The default value of these fields is `nil` if the
  incoming request did not contain a matching field name.

  * action - map with :name and :value for action request (action
    request only)
  * command - slash command string (command request only)
  * text - the text string following the slash command (command
    request only)
  * team - map with :domain and :id for Slack team
  * channel - map with :name and :id for Slack channel
  * user - map with :name and :id for Slack user
  * token - validation token used to confirm request came from Slack
  * reponse_url - string containing URL for delayed response to request


  Action request only fields (defaults to `nil` for command requests):
  * callback_id - string of callback_id from message attachment
  * action_ts - string timestamp when action occurred
  * message_ts - string timestamp when message containing action
    was posted
  * attachment_id - string id for specific attachment within message
  * original_message - original message JSON object

  See Slack docs for [responding to button] and [menu actions] and [slash commands]

  [responding to button]: https://api.slack.com/docs/message-buttons
  [menu actions]: https://api.slack.com/docs/message-menus
  [slash commands]: https://api.slack.com/slash-commands

## Changelog

### [0.1.1] - 2017-16-05
 - **Added** Interactive Menu Message support