All Projects → BlakeWilliams → Elixir Slack

BlakeWilliams / Elixir Slack

Licence: mit
Slack real time messaging and web API client in Elixir

Programming Languages

elixir
2628 projects

Labels

Projects that are alternatives of or similar to Elixir Slack

Go Sarah
Simple yet customizable bot framework written in Go.
Stars: ✭ 188 (-67.97%)
Mutual labels:  bot, slack
Phabulous
A Phabricator bot for Slack
Stars: ✭ 222 (-62.18%)
Mutual labels:  bot, slack
Hubot Slack
Slack Developer Kit for Hubot
Stars: ✭ 2,260 (+285.01%)
Mutual labels:  bot, slack
Php Slack Bot
Slack bot user written in PHP
Stars: ✭ 161 (-72.57%)
Mutual labels:  bot, slack
Pokemongo Bot
The Pokemon Go Bot, baking with community.
Stars: ✭ 3,730 (+535.43%)
Mutual labels:  bot, slack
Slack Starterbot
Python-powered simple starter Slack bot.
Stars: ✭ 169 (-71.21%)
Mutual labels:  bot, slack
Serverless Slack App
A Serverless.js Slack App Boilerplate with OAuth and Bot actions
Stars: ✭ 217 (-63.03%)
Mutual labels:  bot, slack
React Slack Chat
[UPDATED] A Server-less Beautiful Gooey / Material Design Slack Chat Web Integrating Widget.
Stars: ✭ 139 (-76.32%)
Mutual labels:  bot, slack
Bottender
⚡️ A framework for building conversational user interfaces.
Stars: ✭ 3,803 (+547.87%)
Mutual labels:  bot, slack
Intelligo
🤖 Chatbot Framework for Node.js.
Stars: ✭ 347 (-40.89%)
Mutual labels:  bot, slack
Office Simulator
Miss the office life? You won't any more with this wonderful office slack simulator.
Stars: ✭ 152 (-74.11%)
Mutual labels:  bot, slack
Joe
A general-purpose bot library inspired by Hubot but written in Go. 🤖
Stars: ✭ 417 (-28.96%)
Mutual labels:  bot, slack
Slick
Slick, a Slack bot in Go
Stars: ✭ 150 (-74.45%)
Mutual labels:  bot, slack
Flottbot
A chatbot framework written in Go. All configurations are made in YAML files, or inside scripts written in your favorite language.
Stars: ✭ 175 (-70.19%)
Mutual labels:  bot, slack
Trebekbot
An addictive Jeopardy! bot for Slack. Fun fact, after I added this to my work Slack I was told to limit it to a single channel because productivity ground to a halt. (Five years later, the #jeopardy channel is still going strong.)
Stars: ✭ 147 (-74.96%)
Mutual labels:  bot, slack
Sactive Bot
😈 An extensible chat bot framework. sactive-bot is an evolution of the open source hubot project. - https://www.shipengqi.top/sactive-bot .
Stars: ✭ 212 (-63.88%)
Mutual labels:  bot, slack
Norrisbot
a Slack bot that kicks asses (roundhouse-kicks to be accurate...)
Stars: ✭ 134 (-77.17%)
Mutual labels:  bot, slack
Tradingview Webhook Bot
⚙️ Send TradingView alerts to Telegram, Discord, Slack, Twitter and/or Email.
Stars: ✭ 135 (-77%)
Mutual labels:  bot, slack
Slack Meme
A Meme Bot for Slack.
Stars: ✭ 322 (-45.14%)
Mutual labels:  bot, slack
Awesome Bots
Awesome Links about bots.
Stars: ✭ 412 (-29.81%)
Mutual labels:  bot, slack

Build Status

Elixir-Slack

This is a Slack Real Time Messaging API client for Elixir. You'll need a Slack API token which can be retrieved by following the Token Generation Instructions or by creating a new bot integration.

Installing

Add Slack to your mix.exs dependencies function.

def application do
  [extra_applications: [:logger]]
end

def deps do
  [{:slack, "~> 0.23.6"}]
end

Upgrading from 0.x to 0.20+

The newest version of the Slack client introduces breaking changes with regards to starting and connecting to the Real Time Messaging API. rtm.start is now deprecated and has since been replaced with rtm.connect. This has removed the list of bots, channels, groups, users, and ims that are normally returned from rtm.start. Additionally, these lists are now rate-limited. In order to achieve relative parity to the old way of doing things, you'll need to make one change in your code:

Make additional calls to the Slack API to fetch bots, channels, groups, users, and IMs

Wherever you grab the passed in slack state, add in additional calls to populate these lists:

slack
|> Map.put(:bots, Slack.Web.Bots.info(%{token: token}) |> Map.get("bot"))
|> Map.put(:channels, Slack.Web.Channels.list(%{token: token}) |> Map.get("channels"))
|> Map.put(:groups, Slack.Web.Groups.list(%{token: token}) |> Map.get("groups"))
|> Map.put(:ims, Slack.Web.Im.list(%{token: token}) |> Map.get("ims"))
|> Map.put(:users, Slack.Web.Users.list(%{token: token}) |> Map.get("members"))

RTM (Bot) Usage

Define a module that uses the Slack behaviour and defines the appropriate callback methods.

defmodule SlackRtm do
  use Slack

  def handle_connect(slack, state) do
    IO.puts "Connected as #{slack.me.name}"
    {:ok, state}
  end

  def handle_event(message = %{type: "message"}, slack, state) do
    send_message("I got a message!", message.channel, slack)
    {:ok, state}
  end
  def handle_event(_, _, state), do: {:ok, state}

  def handle_info({:message, text, channel}, slack, state) do
    IO.puts "Sending your message, captain!"

    send_message(text, channel, slack)

    {:ok, state}
  end
  def handle_info(_, _, state), do: {:ok, state}
end

To run this example, you'll want to call Slack.Bot.start_link(SlackRtm, [], "TOKEN_HERE") and run the project with mix run --no-halt.

You can send messages to channels using send_message/3 which takes the message as the first argument, channel/user as the second, and the passed in slack state as the third.

The passed in slack state holds the current user properties as me, team properties as team, and the current websocket connection as socket.

If you want to do things like trigger the sending of messages outside of your Slack handlers, you can leverage the handle_info/3 callback to implement an external API.

This allows you to both respond to Slack RTM events and programmatically control your bot from external events.

{:ok, rtm} = Slack.Bot.start_link(SlackRtm, [], "token")
send rtm, {:message, "External message", "#general"}
#=> {:message, "External message", "#general"}
#==> Sending your message, captain!

Slack has a lot of message types so it's a good idea to define a callback like above where unhandled message types don't crash your application. You can find a list of message types and examples on the RTM API page.

You can find more detailed documentation on the Slack hexdocs page.

Web API Usage

The complete Slack Web API is implemented by generating modules/functions from the JSON documentation. You can view this project's documentation for more details.

There are two ways to authenticate your API calls. You can configure api_token on slack that will authenticate all calls to the API automatically.

config :slack, api_token: "VALUE"

Alternatively you can pass in %{token: "VALUE"} to any API call in optional_params. This also allows you to override the configured api_token value if desired.

Quick example, getting the names of everyone on your team:

names = Slack.Web.Users.list(%{token: "TOKEN_HERE"})
|> Map.get("members")
|> Enum.map(fn(member) ->
  member["real_name"]
end)

Web Client Configuration

A custom client callback module can be configured for cases in which you need extra control over how calls to the web API are performed. This can be used to control timeouts, or to add additional custom error handling as needed.

config :slack, :web_http_client, YourApp.CustomClient

All Web API calls from documentation-generated modules/functions will call post!/2 with the generated url and body passed as arguments.

In the case where you only need to control the options passed to HTTPoison/hackney, the default client accepts a keyword list as an additional configuration parameter. Note that this is ignored if configuring a custom client.

See HTTPoison docs for a list of available options.

config :slack, :web_http_client_opts, [timeout: 10_000, recv_timeout: 10_000]

Testing

For integration tests, you can change the default Slack URL to your fake Slack server:

config :slack, url: "http://localhost:8000"
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].