diff options
Diffstat (limited to 'lib/irc/parser/isupport.ex')
-rw-r--r-- | lib/irc/parser/isupport.ex | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/lib/irc/parser/isupport.ex b/lib/irc/parser/isupport.ex index 9dd7f30..dda4220 100644 --- a/lib/irc/parser/isupport.ex +++ b/lib/irc/parser/isupport.ex @@ -1,8 +1,17 @@ defmodule Irc.Parser.Isupport do @moduledoc """ - ISUPPORT list parser + ISUPPORT list parser. """ + @typedoc "Server ISUPPORT." + @type t :: %{key => value} + @type key :: String.t + @type value :: true | Integer.t() | Map.t() | prefix_map + + @type prefix :: String.t() + @type mode :: String.t() + @type prefix_map :: %{prefix() => mode()} + def parse(list, acc \\ %{}) do list = List.flatten(list) Enum.reduce(list, acc, fn(entry, acc) -> @@ -13,25 +22,36 @@ defmodule Irc.Parser.Isupport do else Map.put(acc, entry, true) end - [entry, value] -> Map.put(acc, entry, parse_value(value)) + [entry, value] -> Map.put(acc, entry, parse_value(entry, value)) end end) end - defp parse_value(value) do + defp parse_value(entry, value) do if String.contains?(value, ":") do Enum.reduce(String.split(value, ","), %{}, fn(key_and_value, acc) -> case String.split(key_and_value, ":", parts: 2) do [key] -> Map.put(acc, key, nil) - [key, value] -> Map.put(acc, key, format_value(value)) + [key, value] -> Map.put(acc, key, format_value(key, value)) end end) else - format_value(value) + format_value(entry, value) + end + end + + def format_value("PREFIX", value) do + case String.split(value, ")", parts: 2) do + ["("<>modes, prefixes] -> + modes = String.split(modes, "", trim: true) + prefixes = String.split(prefixes, "", trim: true) + Enum.reduce(Enum.with_index(modes), %{}, fn({mode, position}, acc) -> + Map.put(acc, Enum.at(prefixes, position), mode) + end) end end - def format_value(value) do + def format_value(key, value) do case Integer.parse(value) do {i, ""} -> i _ -> value |