summaryrefslogtreecommitdiff
path: root/lib/lsg_irc/dice_handler.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lsg_irc/dice_handler.ex')
-rw-r--r--lib/lsg_irc/dice_handler.ex72
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/lsg_irc/dice_handler.ex b/lib/lsg_irc/dice_handler.ex
new file mode 100644
index 0000000..b865100
--- /dev/null
+++ b/lib/lsg_irc/dice_handler.ex
@@ -0,0 +1,72 @@
+defmodule LSG.IRC.DiceHandler do
+ require Logger
+
+ @moduledoc """
+ # dice
+
+ !dice [6 | faces] [1 | rolls]
+ roll X times a dice of X faces.
+ """
+
+ @default_faces 6
+ @default_rolls 1
+ @max_rolls 50
+
+ defstruct client: nil, dets: nil
+
+ def irc_doc, do: @moduledoc
+
+ def start_link(client) do
+ GenServer.start_link(__MODULE__, [client])
+ end
+
+ def init([client]) do
+ ExIRC.Client.add_handler(client, self())
+ {:ok, %__MODULE__{client: client}}
+ end
+
+ def handle_info({:received, "!dice", sender, chan}, state) do
+ roll(state, sender, chan, @default_faces, @default_rolls)
+ {:noreply, state}
+ end
+
+ def handle_info({:received, "!dice "<>params, sender, chan}, state) do
+ {faces, rolls} = case String.split(params, " ", parts: 2) do
+ [faces, rolls] -> {faces, rolls}
+ [faces] -> {faces, "1"}
+ end
+
+ to_integer = fn(string, default) ->
+ case Integer.parse(string) do
+ {int, _} -> int
+ _ -> default
+ end
+ end
+
+ {faces, rolls} = {to_integer.(faces, @default_faces), to_integer.(rolls, @default_rolls)}
+
+ roll(state, sender, chan, faces, rolls)
+
+ {:noreply, state}
+ end
+
+ def handle_info(info, state) do
+ {:noreply, state}
+ end
+
+ defp roll(state, %{nick: nick}, chan, faces, 1) when faces > 0 do
+ random = :crypto.rand_uniform(1, faces+1)
+ ExIRC.Client.msg(state.client, :privmsg, chan, "#{nick} dice: #{random}")
+ end
+ defp roll(state, %{nick: nick}, chan, faces, rolls) when faces > 0 and rolls > 0 and rolls <= @max_rolls do
+ {results, acc} = Enum.map_reduce(Range.new(1, rolls), 0, fn(i, acc) ->
+ random = :crypto.rand_uniform(1, faces+1)
+ {random, acc + random}
+ end)
+ results = Enum.join(results, "; ")
+ ExIRC.Client.msg(state.client, :privmsg, chan, "#{nick} dice [#{acc}] #{results}")
+ end
+
+ defp roll(_, _, _, _, _), do: nil
+
+end