@@ -33,7 +33,8 @@ defmodule ExIrc.Client do
33
33
debug?: false ,
34
34
retries: 0 ,
35
35
inet: :inet ,
36
- owner: nil
36
+ owner: nil ,
37
+ whois_buffers: % { }
37
38
end
38
39
39
40
#################
@@ -167,6 +168,16 @@ defmodule ExIrc.Client do
167
168
def names ( client , channel ) do
168
169
GenServer . call ( client , { :names , channel } , :infinity )
169
170
end
171
+
172
+ @ doc """
173
+ Ask the server for the user's informations.
174
+ """
175
+ @ spec whois ( client :: pid , user :: binary ) :: :ok | { :error , atom ( ) }
176
+ def whois ( client , user ) do
177
+ GenServer . call ( client , { :whois , user } , :infinity )
178
+ end
179
+
180
+
170
181
@ doc """
171
182
Change mode for a user or channel
172
183
"""
@@ -330,7 +341,7 @@ defmodule ExIrc.Client do
330
341
# Set SSL mode
331
342
state = % { state | ssl?: ssl }
332
343
# Open a new connection
333
- case Transport . connect ( state , String . to_char_list ( server ) , port , [ :list , { :packet , :line } , { :keepalive , true } ] ++ options ) do
344
+ case Transport . connect ( state , String . to_charlist ( server ) , port , [ :list , { :packet , :line } , { :keepalive , true } ] ++ options ) do
334
345
{ :ok , socket } ->
335
346
send_event { :connected , server , port } , state
336
347
{ :reply , :ok , % { state | connected?: true , server: server , port: port , socket: socket } }
@@ -397,6 +408,12 @@ defmodule ExIrc.Client do
397
408
Transport . send ( state , names! ( channel ) )
398
409
{ :reply , :ok , state }
399
410
end
411
+
412
+ def handle_call ( { :whois , user } , _from , state ) do
413
+ Transport . send ( state , whois! ( user ) )
414
+ { :reply , :ok , state }
415
+ end
416
+
400
417
# Handles a call to change mode for a user or channel
401
418
def handle_call ( { :mode , channel_or_nick , flags , args } , _from , state ) do
402
419
Transport . send ( state , mode! ( channel_or_nick , flags , args ) )
@@ -551,7 +568,7 @@ defmodule ExIrc.Client do
551
568
end
552
569
# Called when the client enters a channel
553
570
def handle_data ( % IrcMessage { nick: nick , cmd: "JOIN" } = msg , % ClientState { nick: nick } = state ) do
554
- channel = msg . args |> List . first |> String . strip
571
+ channel = msg . args |> List . first |> String . trim
555
572
if state . debug? , do: debug "JOINED A CHANNEL #{ channel } "
556
573
channels = Channels . join ( state . channels , channel )
557
574
new_state = % { state | channels: channels }
@@ -561,7 +578,7 @@ defmodule ExIrc.Client do
561
578
# Called when another user joins a channel the client is in
562
579
def handle_data ( % IrcMessage { nick: user_nick , cmd: "JOIN" , host: host , user: user } = msg , state ) do
563
580
sender = % SenderInfo { nick: user_nick , host: host , user: user }
564
- channel = msg . args |> List . first |> String . strip
581
+ channel = msg . args |> List . first |> String . trim
565
582
if state . debug? , do: debug "ANOTHER USER JOINED A CHANNEL: #{ channel } - #{ user_nick } "
566
583
channels = Channels . user_join ( state . channels , channel , user_nick )
567
584
new_state = % { state | channels: channels }
@@ -589,6 +606,65 @@ defmodule ExIrc.Client do
589
606
send_event { :topic_changed , channel , topic } , new_state
590
607
{ :noreply , new_state }
591
608
end
609
+
610
+
611
+ ## WHOIS
612
+
613
+
614
+ def handle_data ( % IrcMessage { cmd: @ rpl_whoisuser , args: [ _sender , nickname , username , hostname , _ , realname ] } , state ) do
615
+ user = % { nickname: nickname , username: username , hostname: hostname , realname: realname }
616
+ { :noreply , % ClientState { state | whois_buffers: Map . put ( state . whois_buffers , nickname , user ) } }
617
+ end
618
+
619
+ def handle_data ( % IrcMessage { cmd: @ rpl_whoiscertfp , args: [ _sender , nickname , "has client certificate fingerprint " <> fingerprint ] } , state ) do
620
+ { :noreply , % ClientState { state | whois_buffers: put_in ( state . whois_buffers , [ nickname , :certfp ] , fingerprint ) } }
621
+ end
622
+
623
+ def handle_data ( % IrcMessage { cmd: @ rpl_whoisregnick , args: [ _sender , nickname , _message ] } , state ) do
624
+ { :noreply , % ClientState { state | whois_buffers: put_in ( state . whois_buffers , [ nickname , :registered_nick? ] , true ) } }
625
+ end
626
+
627
+ def handle_data ( % IrcMessage { cmd: @ rpl_whoishelpop , args: [ _sender , nickname , _message ] } , state ) do
628
+ { :noreply , % ClientState { state | whois_buffers: put_in ( state . whois_buffers , [ nickname , :helpop? ] , true ) } }
629
+ end
630
+
631
+ def handle_data ( % IrcMessage { cmd: @ rpl_whoischannels , args: [ _sender , nickname , channels ] } , state ) do
632
+ chans = String . split ( channels , " " )
633
+ { :noreply , % ClientState { state | whois_buffers: put_in ( state . whois_buffers , [ nickname , :channels ] , chans ) } }
634
+ end
635
+
636
+ def handle_data ( % IrcMessage { cmd: @ rpl_whoisserver , args: [ _sender , nickname , server_addr , server_name ] } , state ) do
637
+ new_buffer = state . whois_buffers
638
+ |> put_in ( [ nickname , :server_name ] , server_name )
639
+ |> put_in ( [ nickname , :server_address ] , server_addr )
640
+ { :noreply , % ClientState { state | whois_buffers: new_buffer } }
641
+ end
642
+
643
+ def handle_data ( % IrcMessage { cmd: @ rpl_whoisoperator , args: [ _sender , nickname , _message ] } , state ) do
644
+ { :noreply , % ClientState { state | whois_buffers: put_in ( state . whois_buffers , [ nickname , :ircop? ] , true ) } }
645
+ end
646
+
647
+ def handle_data ( % IrcMessage { cmd: @ rpl_whoisaccount , args: [ _sender , nickname , account_name , _message ] } , state ) do
648
+ { :noreply , % ClientState { state | whois_buffers: put_in ( state . whois_buffers , [ nickname , :account_name ] , account_name ) } }
649
+ end
650
+
651
+ def handle_data ( % IrcMessage { cmd: @ rpl_whoissecure , args: [ _sender , nickname , _message ] } , state ) do
652
+ { :noreply , % ClientState { state | whois_buffers: put_in ( state . whois_buffers , [ nickname , :tls? ] , true ) } }
653
+ end
654
+
655
+ def handle_data ( % IrcMessage { cmd: @ rpl_whoisidle , args: [ _sender , nickname , idling_time , signon_time , _message ] } , state ) do
656
+ new_buffer = state . whois_buffers
657
+ |> put_in ( [ nickname , :idling_time ] , idling_time )
658
+ |> put_in ( [ nickname , :signon_time ] , signon_time )
659
+ { :noreply , % ClientState { state | whois_buffers: new_buffer } }
660
+ end
661
+
662
+ def handle_data ( % IrcMessage { cmd: @ rpl_endofwhois , args: [ _sender , nickname , _message ] } , state ) do
663
+ buffer = struct ( Irc.Whois , state . whois_buffers [ nickname ] )
664
+ send_event { :whois , buffer } , state
665
+ { :noreply , % ClientState { state | whois_buffers: Map . delete ( state . whois_buffers , nickname ) } }
666
+ end
667
+
592
668
def handle_data ( % IrcMessage { cmd: @ rpl_notopic , args: [ channel ] } , state ) do
593
669
if state . debug? do
594
670
debug "INITIAL TOPIC MSG"
@@ -645,7 +721,7 @@ defmodule ExIrc.Client do
645
721
end
646
722
# Called when we leave a channel
647
723
def handle_data ( % IrcMessage { cmd: "PART" , nick: nick } = msg , % ClientState { nick: nick } = state ) do
648
- channel = msg . args |> List . first |> String . strip
724
+ channel = msg . args |> List . first |> String . trim
649
725
if state . debug? , do: debug "WE LEFT A CHANNEL: #{ channel } "
650
726
channels = Channels . part ( state . channels , channel )
651
727
new_state = % { state | channels: channels }
@@ -655,7 +731,7 @@ defmodule ExIrc.Client do
655
731
# Called when someone else in our channel leaves
656
732
def handle_data ( % IrcMessage { cmd: "PART" , nick: from , host: host , user: user } = msg , state ) do
657
733
sender = % SenderInfo { nick: from , host: host , user: user }
658
- channel = msg . args |> List . first |> String . strip
734
+ channel = msg . args |> List . first |> String . trim
659
735
if state . debug? , do: debug "#{ from } LEFT A CHANNEL: #{ channel } "
660
736
channels = Channels . user_part ( state . channels , channel , from )
661
737
new_state = % { state | channels: channels }
@@ -729,7 +805,7 @@ defmodule ExIrc.Client do
729
805
{ :noreply , state }
730
806
end
731
807
# Called when a NOTICE is received by the client.
732
- def handle_data ( % IrcMessage { nick: from , cmd: "NOTICE" , args: [ target , message ] , host: host , user: user } = _msg , state ) do
808
+ def handle_data ( % IrcMessage { nick: from , cmd: "NOTICE" , args: [ _target , message ] , host: host , user: user } = _msg , state ) do
733
809
sender = % SenderInfo { nick: from ,
734
810
host: host ,
735
811
user: user }
0 commit comments