README.md

# SlackThrottle

Slack Web API wrapper library that automatically throttles all requests according to API rate limits.

[hexdocs](https://hexdocs.pm/slack_throttle)

## Installation

Add `slack_throttle` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [{:slack_throttle, "~> 0.1.0"}]
end
```

Ensure `slack_throttle` is started before your application:

```elixir
def application do
  [applications: [:slack_throttle]]
end
```

## Usage

Look up the API method you want to use in the
[Slack documentation](https://api.slack.com/methods). Function names are
method names with dots replaced by underscores:

```elixir
# method: channels.info
iex> SlackThrottle.API.channels_info("some token", %{channel: "C123456"})
%{"ok" => true, "channel" => %{"id" => "C123456", ...}}
```

If you don't care about the response, e.g. when broadcasting a message,
use `:cast` as the third argument:

```elixir
# method: chat.postMessage
iex> SlackThrottle.API.chat_postMessage("some token", params, :cast)
:ok
```

Broadcasts are executed asynchronously and return `:ok` immediately.

## Rate Limits

The Slack Web API is subject to
[rate limiting](https://api.slack.com/docs/rate-limits).  Requests are only
allowed at a rate of one per second on a per-access-token basis.

To comply with these restrictions, the library queues all function calls
(grouped by access token) and executes them at the given rate.  These queues
are priority queues: Regular blocking function calls have higher priority than
asynchronous broadcasts (the `:cast` ones).

## Configuration

The API throttle rate `:api_throttle` can be configured as well as the
timeout for blocking function calls `:enqueue_sync_timeout`:

```elixir
config :slack_throttle,
  api_throttle: 1000, # in milliseconds
  enqueue_sync_timeout: 20000 # in milliseconds
```

## Built for and used by

[lunchorder](https://lunch.cjh.io), a lunch order list making Slack app

## License

MIT