summaryrefslogtreecommitdiff
path: root/lib/irc/parser/isupport.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/irc/parser/isupport.ex')
-rw-r--r--lib/irc/parser/isupport.ex32
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