diff options
Diffstat (limited to 'lib/irc/client/command/who.ex')
-rw-r--r-- | lib/irc/client/command/who.ex | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/irc/client/command/who.ex b/lib/irc/client/command/who.ex new file mode 100644 index 0000000..1654ef6 --- /dev/null +++ b/lib/irc/client/command/who.ex @@ -0,0 +1,62 @@ +defmodule Irc.Client.Command.Who do + alias Irc.Parser.Line + alias Irc.User + use Irc.Parser.Numeric + + @type t :: {:who, target :: String.t, [Irc.User.t]} + + def init(_) do + {nil, "WHO", nil} + end + + def handle_command("WHO", [target], conn) do + args = if Irc.Connection.supports?(conn, "whox") do + " nuhs%cuhsnfdar" + end + {:buffer, %{target: target, acc: [], error: nil}, {:send, ['WHO ', target, args]}} + end + + @errors [err_NOSUCHSERVER(), rpl_TRYAGAIN()] + def handle_buffer(%Line{command: error, args: args}, buffer, _conn) when error in @errors do + #? + {:buffer, %{buffer | error: {error, args}}} + end + + def handle_buffer(%Line{command: rpl_ENDOFWHO()}, buffer, _conn) do + result = if buffer.error do + {:error, buffer.error} + else + {:ok, buffer.acc} + end + {:finish, nil, {:event, {:who, buffer.target, result}}} + end + + def handle_buffer(%Line{command: rpl_WHOREPLY(), args: args}, buffer, conn) do + case args do + [_, c, u, h, s, n, f, d | a_r] -> + {a,r} = case a_r do + [a, r] -> {a, r} + [r] -> {nil, r} + end + {modes, _} = Irc.Parser.Prefix.parse(f, conn) + chanmodes = %{buffer.target => modes} + user = %Irc.User{ + user: u, + host: h, + server: s, + nick: n, + account: a, + name: r, + channels: [buffer.target], + chanmodes: chanmodes + } + + _ -> + {:finish, nil} # ERROFFEL + end + {:buffer, %{buffer | acc: [args | buffer.acc]}} + end + + def handle_buffer(_, _), do: :postpone + +end |