# ElixirAgi

An [Asterisk]( client for the [AGI](
protocol written in [Elixir]( For a quick introduction to AGI you can read [this](

This is similar to [PAGI]( for PHP, and
[erlagi]( for Erlang.


# Using it with Mix

To use it in your Mix projects, first add it as a dependency:

def deps do
  [{:elixir_agi, "~> 0.0.1"}]
Then run mix deps.get to install it.

Also add the app in your mix.exs file:
    applications: [:logger, :elixir_agi],


# FastAGI

elixir_erlagi provides a FastAGI server, so you can run your AGI applications
through TCP in a different host, providing scalability. To use it, you have to
setup in your dialplan something like this:

exten => _X.,1,Answer
exten => _X.,n,AGI(agi://

And then in your elixir node, you can start the listener like this:

```elixir MyAppModule, %{initial_state: []}, :my_server_name, "", 4444, 10

`MyAppModule` must have a `start_link` function, and must return `{:ok, pid}` so
it will be linked to the AGI process that is handling the connection.


# Sample AGI Application

defmodule MyAppModule do
  use GenServer
  alias ElixirAgi.Agi, as: Agi
  require Logger

  def start_link(agi, initial_state) do
    GenServer.start_link __MODULE__, agi

  def init(agi) do
    {:ok, %{agi: agi}, 0}

  def handle_info(:timeout, state) do
    Logger.debug "Starting APP"
    Logger.debug "AA: #{inspect Agi.answer(state.agi)}"
    :timer.sleep 1000
    Logger.debug "AA: #{inspect Agi.hangup(state.agi)}"
    Agi.close state.agi
    {:noreply, state}



# AGI Commands

You can find the available AGI commands in the [AGI]( module.
Feel free to open a pull request to include new ones :) If you want to use a command that is not supported yet, you can
use the `exec/3` function of the AGI module.


# Documentation

Feel free to take a look at the [documentation](
served by or the source itself to find more.


# License
The source code is released under Apache 2 License.

Check [LICENSE]( file for more information.