Guri

Guri was created to automate tasks and let people know about what's happening. It is a bot system that uses chat messages as commands. You can easily write command handlers to automate anything you want. Nice things you can automate (but not limited to):

Guri is not only limited to command handling. It can also be used to automatically post useful information to a chat room.

Usage

Add Guri to your mix.exs dependencies:

defp deps do
  [{:guri, "~> 0.1.0"}]
end

Add Guri to your mix.exs applications:

def application do
  [applications: [:guri]]
end

And run:

mix deps.get

Configuration

In your config/config.exs add the following config:


# Bot adapter (currently only Slack is supported)
config :guri, :adapter, Guri.Adapters.Slack

# Configure your Slack bot
config :guri, :slack,
  bot_name: "BOT_NAME", # the one you created in Slack
  channel_name: "CHANNEL_NAME", # the name of the channel the bot is in
  url: "https://slack.com/api",
  token: "TOKEN" # Token from Slack (e.g.: abced-00000000-AASDADzxczxcasd)

# Command Handlers you want to use
config :guri, :handlers, [
    MyApp.Deploy,
    MyApp.Stats
]

Creating a Handler

You can create as many handlers as you wish. The example bellow is using an Agent, but you can use a GenServer or even a simple module. Your handler needs to call Guri.Dispatcher.register_handler(__MODULE__, ["deploy"]) in order to answer to any deploy command. A single handler can handle different commands (e.g. Guri.Dispatcher.register_handler(MyApp.Deploy, ["deploy", "rollback"])).

# Example of handler responsible for deployments

defmodule MyApp.Deploy do
  def start_link do
    {:ok, pid} = Agent.start_link(fn -> [] end, name: __MODULE__)
    Guri.Dispatcher.register_handler(__MODULE__, ["deploy"])
    {:ok, pid}
  end

  def handle_command(%{name: "deploy", args: []}) do
    Guri.Bot.send_message("Deploying all projects to production")
  end
  def handle_command(%{name: "deploy", args: [project]}) do
    Guri.Bot.send_message("Deploying `#{project}` to production")
  end
  def handle_command(%{name: "deploy", args: [project, "to", env]}) do
    Guri.Bot.send_message("Deploying `#{project}` to `#{env}`")
  end
  def handle_command(_) do
    Guri.Bot.send_message("Sorry, I couldn't understand what you want to deploy")
  end
end

Run Test

mix test