$name = "Whois" ;
$version = "1.0" ;
$desription = "Affichage propre du whois" ;

Xchat::register($name,$version,$description,"unload") ;
Xchat::print("\0038$name v$version \0039loaded") ;
Xchat::hook_server("RAW LINE","raw_handler") ;

# Globales (Config)
#  Couleurs
my $color_line = '6' ;
my $color_legend = '3' ;
my $color_text = '00' ;
#  Marge
my $margin_length = 10 ;

my $registered = false ;

sub color {
	# 2 = gras
	# 3 = couleur
	# 15 = fin
	# 22 = reverse
	# 31 = souligné
	return chr(3).int(shift) ;
}

sub raw_handler {
	my $raw = $_[0][1] ;
	my $return = Xchat::EAT_XCHAT ; # Politique de retour par défaut : On ne laisse pas xchat traiter cet evenement

	# RPL_WHOISUSER : Infos sur l'identité de l'utilisateur
	if ( $raw eq '311' ) {
		display_hr() ;
		$nick = $_[0][3] ;
		$user = $_[0][4] ;
		$host = $_[0][5] ;
		$star = $_[0][6] ;
		$real = $_[0][7] ;
		display_line('Nick',$nick) ;
		display_line('User',$user) ;
		display_line('Real',$real) ;
		display_line('Host',$host) ;
		display_line('Mask',$nick.'!'.$user.'@'.$host) ;

	# Modes
	} elsif ( $raw eq '379' ) { 
		display_line('Modes',$_[0][7]) ;
		if ( $_[0][8] ) { display_line('SNoMask',$_[0][8]) ; }

	#RPL_WHOISHOST : Host et IP
	} elsif ( $raw eq '378' ) {
		display_line('Host',$_[0][7]) ;
		display_line('IP',$_[0][8]) ;

	# RPL_WHOISREGNICK : Pseudo Enregistré
	} elsif ( $raw eq '307' ) {
		display_line('RegNick',$_[1][4]) ;
		$registered = true ;

	# RPL_WHOISCHANNELS : Salons sur lequel l'utilisateur est présent
	} elsif ( $raw eq '319' ) {
		sub secret_chan {
			local $chan = shift ;
			local $secret = shift ;
			if ( $secret == 1 ) { return chr(22).$chan.chr(22) ; }
			else { return $chan ; }
		}
		my @chans_q = () ;
		my @chans_a = () ;
		my @chans_o = () ;
		my @chans_h = () ;
		my @chans_v = () ;
		my @chans_u = () ;
		my $chanlist = $_[1][4] ;
		$chanlist =~ s/^:// ; # Strip ":"
		my @chans = split(/ /,$chanlist) ;
		display_line('Chans',scalar(@chans).'------------') ;
		while ( scalar(@chans) ne 0 ) {
			my $chan = shift(@chans) ;
			my $secret = 0 ;
			if ( $chan =~ s/^\?//) { $secret = 1 ; }
			if ( $chan =~ s/^\~//) { push(@chans_q,secret_chan($chan,$secret)) ; }
			elsif ( $chan =~ s/^\&//) { push(@chans_a,secret_chan($chan,$secret)) ; }
			elsif ( $chan =~ s/^\@//) { push(@chans_o,secret_chan($chan,$secret)) ; }
			elsif ( $chan =~ s/^\%//) { push(@chans_h,secret_chan($chan,$secret)) ; }
			elsif ( $chan =~ s/^\+//) { push(@chans_v,secret_chan($chan,$secret)) ; }
			else{ push(@chans_u,secret_chan($chan,$secret)) ; }
		}
		if ( @chans_q ) { display_line(scalar(@chans_q).' ~',color(6).join(' ',sort(@chans_q))) ; }
		if ( @chans_a ) { display_line(scalar(@chans_a).' &',color(4).join(' ',sort(@chans_a))) ; }
		if ( @chans_o ) { display_line(scalar(@chans_o).' @',color(3).join(' ',sort(@chans_o))) ; }
		if ( @chans_h ) { display_line(scalar(@chans_h).' %',color(11).join(' ',sort(@chans_h))) ; }
		if ( @chans_v ) { display_line(scalar(@chans_v).' v',color(7).join(' ',sort(@chans_v))) ; }
		if ( @chans_u ) { display_line(scalar(@chans_u).' #',join(' ',@chans_u)) ; }

	# RPL_WHOISSERVER : Serveur par lequel l'utilisateur accede au réseau
	} elsif ( $raw eq '312' ) {
		display_line('Server',$_[1][4]) ;

	# Away
	} elsif ( $raw eq '301' ) {
		display_line('Away',$_[1][4]) ;

	# RPL_WHOISBOT
	} elsif ( $raw eq '335' ) {
		display_line('Bot',$_[1][4]) ;
	
	# Oper
	} elsif ( $raw eq '313' ) {
		display_line('Oper',$_[1][4]) ;

	# SSL
	} elsif ( $raw eq '671' ) {
		display_line('Secure',$_[1][4]) ;
		
	# Special (SWhois)
	} elsif ( $raw eq '320' ) {
		display_line('Special',$_[1][4]) ;

	# Idle
	} elsif ( $raw eq '317' ) {
		display_line('Idle',duration($_[0][4])) ;
		display_line('Signon',scalar(gmtime($_[0][5]))) ;

	# Aviable for help
	} elsif ( $raw eq '310' ) {
		display_line('Helper',$_[1][4]) ;

	# Actualy
	} elsif ( $raw eq '338' ) {
		display_line('Actualy',$_[1][4]) ;

	# RPL_ENDOFWHOIS : Fin du whois
	} elsif ( $raw eq '318' ) {
		display_hr($raw) ;
		if ($registered eq true) {
			IRC::command("/msg nickserv info ".$_[0][3]." ALL") ;
			IRC::command("/msg nickserv glist ".$_[0][3]) ;
			IRC::command("/msg nickserv alist ".$_[0][3]) ;
			$registered = false ;
		}
	# NO_SUCH_NICK_CHANNEL : pseudo innexistant
	} elsif ( $raw eq '401' ) {
		# >> :columbia.rs2i.net 401 SpideR blabla :No such nick/channel
		display_hr($raw) ;
		display_line($_[0][3],"aucun pseudo / salon de ce nom") ;
	# ELSE : Les autre cas, xchat laisse passer
	} else {
		$return = Xchat::EAT_NONE ; # Par défaut la fonction laisse xchat traiter l'evenement
	}
	return $return ;
}


sub display_line {
# Affiche une ligne de whois sous la forme legende | texte (chacun étant un paramètre)
	my $legend = shift ;
	my $text = strip_dots(shift) ;
	my $space = ' ' x ( $margin_length - length($legend) - 1 ) ;
	Xchat::print(color($color_line).'|'.$space.color($color_legend).' '.$legend."\t".chr(15).$text) ;
}

sub display_hr {
# Affiche une barre permettant d'entourer le texte du whois
	my $space = '-' x $margin_length ;
	Xchat::print(color($color_line).'+'.$space."\t".$space.$space.$space) ;
}

sub duration {
# Prends en paramètre des secondes et retourne une chaine représentant la mise en forme de ces secondes
	my $s = shift;
	my $m = int($s/60) ; $s = $s % 60 ;
	my $h = int($m/60) ; $m = $m % 60 ;
	my $d = int($h/24) ; $h = $h % 24 ;
	if ( $d > 0 ) { $return = "$d d $h h $m m $s s" ; }
	elsif ( $h > 0 ) { $return = "$h h $m m $s s" ; }
	elsif ( $m > 0 ) { $return = "$m m $s s" ; }
	else { $return = "$s s" ; }
	return $return ;
}

sub strip_dots {
# Prends en parametre une chaine et retourne la même chaine sans les : du début s'il y en avait
	my $param = shift ;
	$param =~ s/^:// ;
	return $param ;
}

sub unload {
	Xchat::print("\0038$name v$version \0034unloaded") ;
}
