summaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
authorPaul Schoenfelder <paulschoenfelder@gmail.com>2014-11-26 15:34:33 -0600
committerPaul Schoenfelder <paulschoenfelder@gmail.com>2014-11-26 15:34:33 -0600
commitd27a643ee0feb4d8b401ea1f90f1950e8cde554c (patch)
treef1048598dacb95369e45486f3ffe8f3aa3bbb01b /README.md
parentVersion 0.9.1 (diff)
parentcreate example client application. Close #13. (diff)
Merge pull request #20 from jeffweiss/create_example_app
Create example client application. Close #13.
Diffstat (limited to 'README.md')
-rw-r--r--README.md102
1 files changed, 102 insertions, 0 deletions
diff --git a/README.md b/README.md
index d497463..cd09674 100644
--- a/README.md
+++ b/README.md
@@ -81,3 +81,105 @@ defmodule ExampleSupervisor do
end
end
```
+
+A more robust example usage will wait until connected before it attempts to logon and then wait until logged
+on until it attempts to join a channel. Please see the `examples` directory for more in-depth examples cases.
+
+```elixir
+
+defmodule ExampleApplication do
+ use Application
+
+ # See http://elixir-lang.org/docs/stable/elixir/Application.html
+ # for more information on OTP Applications
+ def start(_type, _args) do
+ import Supervisor.Spec, warn: false
+
+ {:ok, client} = ExIrc.start_client!
+
+ children = [
+ # Define workers and child supervisors to be supervised
+ worker(ExampleConnectionHandler, [client]),
+ # here's where we specify the channels to join:
+ worker(ExampleLoginHandler, [client, ["#ohaibot-testing"]])
+ ]
+
+ # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
+ # for other strategies and supported options
+ opts = [strategy: :one_for_one, name: ExampleApplication.Supervisor]
+ Supervisor.start_link(children, opts)
+ end
+end
+
+defmodule ExampleConnectionHandler do
+ defmodule State do
+ defstruct host: "chat.freenode.net",
+ port: 6667,
+ pass: "",
+ nick: "bitwalker",
+ user: "bitwalker",
+ name: "Paul Schoenfelder",
+ client: nil
+ end
+
+ def start_link(client, state \\ %State{}) do
+ GenServer.start_link(__MODULE__, [%{state | client: client}])
+ end
+
+ def init([state]) do
+ ExIrc.Client.add_handler state.client, self
+ ExIrc.Client.connect! state.client, state.host, state.port
+ {:ok, state}
+ end
+
+ def handle_info({:connected, server, port}, state) do
+ debug "Connected to #{server}:#{port}"
+ ExIrc.Client.logon state.client, state.pass, state.nick, state.user, state.name
+ {:noreply, state}
+ end
+
+ # Catch-all for messages you don't care about
+ def handle_info(msg, state) do
+ debug "Received unknown messsage:"
+ IO.inspect msg
+ {:noreply, state}
+ end
+
+ defp debug(msg) do
+ IO.puts IO.ANSI.yellow() <> msg <> IO.ANSI.reset()
+ end
+end
+
+defmodule ExampleLoginHandler do
+ @moduledoc """
+ This is an example event handler that listens for login events and then
+ joins the appropriate channels. We actually need this because we can't
+ join channels until we've waited for login to complete. We could just
+ attempt to sleep until login is complete, but that's just hacky. This
+ as an event handler is a far more elegant solution.
+ """
+ def start_link(client, channels) do
+ GenServer.start_link(__MODULE__, [client, channels])
+ end
+
+ def init([client, channels]) do
+ ExIrc.Client.add_handler client, self
+ {:ok, {client, channels}}
+ end
+
+ def handle_info(:logged_in, state = {client, channels}) do
+ debug "Logged in to server"
+ channels |> Enum.map(&ExIrc.Client.join client, &1)
+ {:noreply, state}
+ end
+
+ # Catch-all for messages you don't care about
+ def handle_info(_msg, state) do
+ {:noreply, state}
+ end
+
+ defp debug(msg) do
+ IO.puts IO.ANSI.yellow() <> msg <> IO.ANSI.reset()
+ end
+end
+```