#!/usr/bin/perl -w # Autor : Marc Quinton@stna.dgac.fr / quinquin/IRCnet # Date : june 1999. # $time_delay = 60; # delay in seconds between 2 /who * $log = $ENV{"HOME"} . "/.xchat/" . "who.log"; $do_log = 1; # end of configuration # ------------------------------------------------------------------------------------ IRC::print "\0035:: Loading Who script ::\003 \n"; if ($do_log) { open (LOG, ">>$log") || IRC::print "\0035:: inbound: error openning log file ::\003 \n"; # auto-flush ... select((select(LOG), $| = 1)[0]); } IRC::add_message_handler("INBOUND", "inbound_handler"); IRC::add_timeout_handler($time_delay * 1000, "who_timeout_handler"); # @myexpr = qw ( *toulous* *tls* ); @myexpr = qw ( *toulous* ); # global variables $current_expr = 0; # lists of users $list = $oldlist = ""; &who_timeout_handler(); sub who_timeout_handler { # 1: on continue, 0 on arrete # IRC::print "\0035:: who-timeout ::\003 \n"; $count++; $count = 0 if($count > 9) ; $list = ""; # reset flags in hash table foreach $user ( sort keys (%who_list)) { my $ref = $who_list{"$user"}; $$ref{"checked"} = 0; $list = "$list $$ref{nick}" if ($count ==0); # my $result = sprintf("checked=%s : nick=%s : time=%s : %s", $$ref{"checked"}, $$ref{"nick"}, time - $$ref{"time"}, $$ref{"expr"} ); # print "*** user=$user, $result\n"; } my $user_count = scalar split(/ /, $list) -1; if($count == 0 && $user_count> 0) { unless ($list eq $oldlist) { IRC::print "### $user_count $list\n"; $oldlist = $list; } } IRC::add_timeout_handler($time_delay * 1000, "who_timeout_handler"); $current_expr = 0; IRC::command("/who $myexpr[$current_expr]"); return 0; } sub inbound_handler { local($line) = @_; # IRC::print "inbound_handler() ''$line''\n"; # /who list # >> :server 352 me chan user addr serv2 nick foo1 :foo2 realname if($line =~ m/:(.*)\s+352\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?):(.*?)\s+(.*)/o) { $server = $1; # irc server adresse $me = $2; # my nick name $chan = $3; # which chan nick is on $user = $4; # username $addr = $5; # user adresse $serv2 = $6; # an other serv adress with meta char ? $nick = $7; # nickname $foo1 = $8; # flags ? $foo2 = $9; # flags ? $real = $10; # realname # IRC::print "\n\nline=$line\n"; # IRC::print "nick=$nick : chan=$chan : addr=$addr\n"; # IRC::print "real=$real\n"; my $key = sprintf("%s::%s::%s::%s", $nick, $user, $addr ); if(exists $who_list{"$key"}) { $ref=$who_list{"$key"}; $$ref{"checked"} = 1; } else { # this is a new entry, register this entry in an hashtable my(%info); $info{"checked"} = 1; $info{"addr"} = $addr; $info{"nick"} = $nick; $info{"chan"} = $chan; $info{"time"} = time; $info{"expr"} = $myexpr[$current_expr]; $who_list{"$key"} = \%info; # display this new entry my $result = sprintf("%-15s : %-12s : %s", $nick, $chan, $addr); IRC::print "*** + $result\n"; } return 1; } # /who end list # :Wanadoo.Entrechat.Net 315 quinquin *toulous* :Fin de la liste. # :server 315 me query :Fin de la liste. if($line =~ m/:(.*)\s+315\s+(.*?)\s+(.*?)\s+:(.*)/o) { $server = $1; # irc server adresse $me = $2; # my nick name $expr = $3; # expression for /who $msg = $4; # extended message # IRC::print "*** $expr end list\n"; print "*** $expr end list\n"; foreach $user ( keys (%who_list)) { my $ref = $ref=$who_list{"$user"}; if($$ref{"expr"} eq $myexpr[$current_expr]) { if($$ref{"checked"} == 0) { my $result = sprintf("%-15s : %-12s : %s : %s", $$ref{"nick"}, $$ref{"chan"}, $$ref{"addr"}, &hms(time - $$ref{"time"})); IRC::print "*** - $result\n"; delete $who_list{"$user"}; } my $result = sprintf("checked=%s : nick=%s : time=%s : %s : %s", $$ref{"checked"}, $$ref{"nick"}, time - $$ref{"time"}, $$ref{"expr"}, $myexpr[$current_expr] ); print "*** user=$user, $result\n"; } } printf "if : $current_expr, %s : %s\n", $myexpr[$current_expr], scalar(@myexpr); # do we need to check an other expr see list @myexpr if($current_expr < (scalar (@myexpr) -1)) { $current_expr++; sleep 1; IRC::command("/who $myexpr[$current_expr]"); } return 1; } printf LOG "%s\n", $line if ($do_log); return 0; } sub hms { local ($time) = @_; my $h = int($time / 3600); my $m = int($time /60) - ($h * 60); my $s = $time - ($h * 3600) - ($m * 60 ) ; print "h = $h\n"; print "m = $m\n"; print "s = $s\n"; my $res = sprintf "%0.2d:%0.2d:%0.2d", $h,$m,$s; return "$res" } _END_