Slacker's an Elixir bot library for Slack.
It has chat matching functionality built-in, but you can extend it to handle all kinds of events.
Slacker can match regex or literal strings, then execute a given function (module optional).
defmodule TARS do
use Slacker
use Slacker.Matcher
match ~r/Sense of humor\. New level setting: ([0-9]+)%/, :set_humor
match "Great idea. A massive, sarcastic robot.", [CueLight, :turn_on]
def set_humor(tars, msg, level) do
reply = "Sense of humor set to #{level}"
say tars, msg["channel"], reply
end
end
Slacker will call your function with the matching message hash. You can use say/3
to respond, be sure to include the channel you want to talk to.
Your robot is really just a GenServer
, you can catch RTM events from Slack and do whatever you like with them.
defmodule CASE do
use Slacker
def handle_cast({:handle_incoming, "presence_change", msg}, state) do
say self, msg["channel"], "You're the man who brought us the probe?"
{:noreply, state}
end
end
You can also use Slack's "Web API" via the Slacker.Web
module. All of the available RPC methods are downcased and underscored.
users.getPresence
-> Slacker.Web.users_get_presence("your_api_key", user: "U1234567890")
Add this to your deps:
def deps do
[{:websocket_client, github: "jeremyong/websocket_client"},
{:slacker, "~> 0.0.3"}]
end
Create a bot user in the Slack GUI, and then pass your api token to your bot's start_link/1
:
{:ok, tars} = TARS.start_link("your_api_token")
It's up to you to supervise your brand new baby bot.
You're going to need to invite your bot to a channel by @
-mentioning them.
Gimme dem PR's.
Some of this stuff is a real pain in the ass to test, just do your best. 🚀
TODO:
- Keep a map of usernames to ids.
- Keep a map of channel names to ids.
- Private messaging support.
- RTM tests.
See the LICENSE file. (MIT)