#!/usr/bin/env perl -w # # Script : users.pl # Command: /USERS # Client : irssi 0.7.98, Timo Sirainen # # Miguel Angel Perez, # ][ceman on iRC Hispano # #################################################################### use Irssi; # Maximum Number of Chars accepted in Nick space. # This is the default value in most of IRC servers. # $MaxChars = 9; sub TLU { my ($sign) = $_[0]; my $window = Irssi::active_win(); # Actual Window. $name = $window->get_active_name(); # Actual Window Name. $actwin = $window->{active}; if ($name =~ /^(\#|\&|\+|\!)(\w+|\d+)/) { # Channel? @Nicknames = $actwin->nicks(); $Num = scalar(@Nicknames); $ops = 0; # Num. +o. $voz = 0; # Num. +v. $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) { # Mode +o $Ops[$ops] = "\[%9\@%n\] %W$Nick->{nick} $mask"; $ops++; } elsif ($Nick->{voice} == 1) { # Mode +v $Voz[$voz] = "\[%9v%n\] %W$Nick->{nick} $mask"; $voz++; } else { $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(""); if ($sign eq "info") { $window->print("********************************"); $window->print("[] Operators : $ops"); $window->print("[] Voice Users (+v) : $voz"); $window->print("[] Rest of Users : $usr"); $window->print("********************************"); $window->print(""); } $window->print("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::command_bind('users', 'TLU'); Irssi::print "USERS Module Loaded.."; Irssi::print "Execute '/users' or '/users info' to get the asked Users List."; Irssi::print "][ceman, , 2001.";