summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThéophile Choutri <theophile@choutri.eu>2017-12-09 15:26:53 +0100
committerThéophile Choutri <theophile@choutri.eu>2017-12-11 22:14:07 +0100
commit1acc2b64941082398d5b2c25cfffefd056716ce2 (patch)
treef5ff74d1b1bd9212d53577d26b3d8dc7339a849c
parenttesting this, now (diff)
implement WHOIS feature and a struct for data integrity
-rw-r--r--lib/exirc/client.ex34
-rw-r--r--lib/exirc/commands.ex6
-rw-r--r--lib/exirc/whois.ex18
3 files changed, 46 insertions, 12 deletions
diff --git a/lib/exirc/client.ex b/lib/exirc/client.ex
index 36cb87d..bf6e4fc 100644
--- a/lib/exirc/client.ex
+++ b/lib/exirc/client.ex
@@ -607,43 +607,57 @@ defmodule ExIrc.Client do
## WHOIS
+
def handle_data(%IrcMessage{cmd: @rpl_whoisuser, args: [_sender, nickname, username, hostname, _, realname]}, state) do
user = %{nickname: nickname, username: username, hostname: hostname, realname: realname}
{:noreply, %ClientState{state|whois_buffers: Map.put(state.whois_buffers, nickname, user)}}
end
+ def handle_data(%IrcMessage{cmd: @rpl_whoiscertfp, args: [_sender, nickname, "has client certificate fingerprint "<> fingerprint]}, state) do
+ {:noreply, %ClientState{state|whois_buffers: put_in(state.whois_buffers, [nickname, :certfp], fingerprint)}}
+ end
+
+ def handle_data(%IrcMessage{cmd: @rpl_whoisregnick, args: [_sender, nickname, _message]}, state) do
+ {:noreply, %ClientState{state|whois_buffers: put_in(state.whois_buffers, [nickname, :registered_nick?], true)}}
+ end
+
+ def handle_data(%IrcMessage{cmd: @rpl_whoishelpop, args: [_sender, nickname, "is available for help."]}, state) do
+ {:noreply, %ClientState{state|whois_buffers: put_in(state.whois_buffers, [nickname, :helpop?], true)}}
+ end
+
def handle_data(%IrcMessage{cmd: @rpl_whoischannels, args: [_sender, nickname, channels]}, state) do
- {:noreply, %ClientState{state|whois_buffers: Map.merge(state.whois_buffers[nickname], %{channels: channels})}}
+ chans = String.split(channels, " ")
+ {:noreply, %ClientState{state|whois_buffers: put_in(state.whois_buffers, [nickname, :channels], chans)}}
end
def handle_data(%IrcMessage{cmd: @rpl_whoisserver, args: [_sender, nickname, server_addr, server_name]}, state) do
- {:noreply, %ClientState{state|whois_buffers: Map.merge(state.whois_buffers[nickname], %{server: %{name: server_name, address: server_addr}})}}
+ new_buffer = state.whois_buffers |> put_in([nickname, :server_name], server_name) |> put_in([nickname, :server_address], server_addr)
+ {:noreply, %ClientState{state|whois_buffers: new_buffer}}
end
def handle_data(%IrcMessage{cmd: @rpl_whoisoperator, args: [_sender, nickname, _msg]}, state) do
- {:noreply, %ClientState{state|whois_buffers: Map.merge(state.whois_buffers[nickname], %{is_ircop?: true})}}
+ {:noreply, %ClientState{state|whois_buffers: put_in(state.whois_buffers, [nickname, :ircop?], true)}}
end
- def handle_data(%IrcMessage{cmd: @rpl_whoisaccount, args: [_sender, nickname, account_name]}, state) do
- {:noreply, %ClientState{state|whois_buffers: Map.merge(state.whois_buffers[nickname], %{account_name: account_name})}}
+ def handle_data(%IrcMessage{cmd: @rpl_whoisaccount, args: [_sender, nickname, account_name, "is logged in as"]}, state) do
+ {:noreply, %ClientState{state|whois_buffers: put_in(state.whois_buffers, [nickname, :account_name], account_name)}}
end
def handle_data(%IrcMessage{cmd: @rpl_whoissecure, args: [_sender, nickname, "is using a secure connection"]}, state) do
- {:noreply, %ClientState{state|whois_buffers: Map.merge(state.whois_buffers[nickname], %{use_tls?: true})}}
+ {:noreply, %ClientState{state|whois_buffers: put_in(state.whois_buffers, [nickname, :tls?], true)}}
end
def handle_data(%IrcMessage{cmd: @rpl_whoisidle, args: [_sender, nickname, idling_time, signon_time, "seconds idle, signon time"]}, state) do
- {:noreply, %ClientState{state|whois_buffers: Map.merge(state.whois_buffers[nickname], %{idling_time: idling_time, signon_time: signon_time})}}
+ new_buffer = state.whois_buffers |> put_in([nickname, :idling_time], idling_time) |> put_in([nickname, :signon_time], signon_time)
+ {:noreply, %ClientState{state|whois_buffers: new_buffer}}
end
def handle_data(%IrcMessage{cmd: @rpl_endofwhois, args: [_sender, nickname, "End of /WHOIS list."]}, state) do
- buffer = state.whois_buffers[nickname]
+ buffer = struct(Irc.Whois, state.whois_buffers[nickname])
send_event {:whois, buffer}, state
{:noreply, %ClientState{state|whois_buffers: Map.delete(state.whois_buffers, nickname)}}
end
-
-
def handle_data(%IrcMessage{cmd: @rpl_notopic, args: [channel]}, state) do
if state.debug? do
debug "INITIAL TOPIC MSG"
diff --git a/lib/exirc/commands.ex b/lib/exirc/commands.ex
index 60cd779..0d959c0 100644
--- a/lib/exirc/commands.ex
+++ b/lib/exirc/commands.ex
@@ -49,7 +49,9 @@ defmodule Irc.Commands do
#one of two replies is sent. If the topic is set, RPL_TOPIC is sent back else
#RPL_NOTOPIC.
#"""
- @rpl_whoiregnick "307"
+ @rpl_whoiscertfp "276"
+ @rpl_whoisregnick "307"
+ @rpl_whoishelpop "310"
@rpl_whoisuser "311"
@rpl_whoisserver "312"
@rpl_whoisoperator "313"
@@ -203,7 +205,7 @@ defmodule Irc.Commands do
@doc """
Send a WHOIS request about a user
"""
- def whois!(user), do: command! ['WHOIS', user]
+ def whois!(user), do: command! ['WHOIS ', user]
@doc """
Send password to server
diff --git a/lib/exirc/whois.ex b/lib/exirc/whois.ex
new file mode 100644
index 0000000..fb14e63
--- /dev/null
+++ b/lib/exirc/whois.ex
@@ -0,0 +1,18 @@
+defmodule Irc.Whois do
+ defstruct [account_name: nil,
+ channels: [],
+ helpop?: false,
+ hostname: nil,
+ idling_time: 0,
+ ircop?: false,
+ nickname: nil,
+ realname: nil,
+ registered_nick?: false,
+ server_address: nil,
+ server_name: nil,
+ signon_time: 0,
+ tls?: false,
+ username: nil,
+ ]
+end
+