diff options
author | Paul Schoenfelder <paulschoenfelder@gmail.com> | 2014-11-26 15:34:33 -0600 |
---|---|---|
committer | Paul Schoenfelder <paulschoenfelder@gmail.com> | 2014-11-26 15:34:33 -0600 |
commit | d27a643ee0feb4d8b401ea1f90f1950e8cde554c (patch) | |
tree | f1048598dacb95369e45486f3ffe8f3aa3bbb01b /README.md | |
parent | Version 0.9.1 (diff) | |
parent | create 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.md | 102 |
1 files changed, 102 insertions, 0 deletions
@@ -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 +``` |