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