#!/usr/bin/env perl
#
# Script : users.pl
# Command: /USERS
# Client : irssi 0.7.98, Timo Sirainen
#
# Miguel Angel Perez, <iceman\@iceman.networking-center.org>
# ][ceman on iRC Hispano <irc.irc-hispano.org>
#
####################################################################


use Irssi;

# Max Num of Chars per Nick accepted by iRC Server.
#
$MaxChars = 9;  


sub TLU {

    my $window = Irssi::active_win(); 			# Active Window.
    $name = $window->get_active_name();			# Active Win Name.
    $actwin = $window->{active};

    if ($name =~ /^(\#|\&|\+|\!)(\w+|\d+)/) {		# Maybe Channel?

        @Nicknames = $actwin->nicks();
        $Num = scalar(@Nicknames);
        $ops = 0;					# Num. of +o's.
	$voz = 0;					# Num. of +v's.
	$usr = 0;					# Rest of Usrs.

        $window->print("");

        foreach $Nick (@Nicknames) {
   
	    # Unfortunately, no printf() prebuilt func is present on
            # irssi PERL API. Thus, we adjust manually text to be printed
            # on the screen.

            if (length($Nick->{nick}) < $MaxChars) {
                for ($esp = 0; $esp = $MaxChars - length($Nick->{nick}); $esp++) {
                     $Nick->{nick} = $Nick->{nick}." ";
                }
            }               

            # Actual User HostMask.
            # 

            $maskx = "%n\[$Nick->{host}\]";

            if (length($maskx) > 45) {
                $mask = substr($maskx, 0, 45);
            } else {
                $mask = $maskx;
            }

            #################################################
            # Organizing users by iRC channel mode (+o!+v| ).
            #
            
            if ($Nick->{op} == 1) { # Modo +o
		$Ops[$ops] = "\[%9\@%n\] %W$Nick->{nick}  $mask";
		$ops++;

            } elsif ($Nick->{voice} == 1) { # Modo +v
		$Voz[$voz] = "\[%9v%n\] %W$Nick->{nick}  $mask";
		$voz++;

            } else {	# Rest.
                $Usr[$usr] = "\[ \] %W$Nick->{nick}  $mask";
		$usr++;
            }
        }

        ########################################################
        # Sorting Alphabetically Nicknames on Channel.
        #

        if (scalar(@Ops) != 0) {

            @O = sort {uc($a) cmp uc($b)} @Ops;
            @Ops = ();

            for ($i = 0; $i < $Num; $i++) {
                next if $O[$i] eq "";
                $window->print("$O[$i]") unless $O[$i] =~ /^(\n|\s+)/;
            }
        }


        if (scalar(@Voz) != 0) {

            @V = sort {uc($a) cmp uc($b)} @Voz;
            @Voz = ();

            for ($i = 0; $i < $Num; $i++) {
                next if $V[$i] eq "";
                $window->print("$V[$i]") unless $V[$i] =~ /^(\n|\s+)/;
            }
            
        }

 
        if (scalar(@Usr) != 0) {

            @U = sort {uc($a) cmp uc($b)} @Usr;
            @Usr = ();

            for ($i = 0; $i < $Num; $i++) {
                next if $U[$i] eq "";
                $window->print("$U[$i]") unless $U[$i] =~ /^(\n|\s+)/;
            }
        }

        $window->print("");
        $window->print("Number of Users in <%W$actwin->{name}%n>: %y".$Num);
        $window->print("");

        ###########################################
        # Emptying Arrays after use.
        #
 
        @Nicknames = ();
        @O = ();
        @U = ();
        @V = ();


    #############################################
    # If Active Window is no channel ...
    # ... Options get reduced to: 
    #    a. Queries or DCCs.
    #    b. Status Window.

    } elsif ($name eq "(status)") { 	# Status.
	$window->print("Window Info: %WSTATUS");
    } elsif ($name =~ /^=(.*)/) {
        $name =~ s/=//;
        $window->print("DCC Chat established with: %W$name");
    } else {
        $window->print("Query established with: %W$name");
    }
}

Irssi::print("Loading Users List Module ...");
Irssi::command_bind('users', 'TLU');
