1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
|