diff options
author | Théophile Choutri <theophile@choutri.eu> | 2017-12-09 15:26:53 +0100 |
---|---|---|
committer | Théophile Choutri <theophile@choutri.eu> | 2017-12-11 22:14:07 +0100 |
commit | 1acc2b64941082398d5b2c25cfffefd056716ce2 (patch) | |
tree | f5ff74d1b1bd9212d53577d26b3d8dc7339a849c | |
parent | testing this, now (diff) |
implement WHOIS feature and a struct for data integrity
-rw-r--r-- | lib/exirc/client.ex | 34 | ||||
-rw-r--r-- | lib/exirc/commands.ex | 6 | ||||
-rw-r--r-- | lib/exirc/whois.ex | 18 |
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 + |