html/cwho.pl


   1 ## Usage: /CWHO [-a | -l | -o | -v ] [ mask ]
   2 
   3 ##  ver 1.1 
   4 # - added sorting
   5 # - few fixes
   6 
   7 use Irssi 20020300;
   8 use strict;
   9 
  10 use vars qw($VERSION %IRSSI);
  11 $VERSION = "1.1";
  12 %IRSSI = (
  13         authors         => "Maciek \'fahren\' Freudenheim",
  14         contact         => "fahren\@bochnia.pl",
  15         name            => "Cached WHO",
  16         description     => "Usage: /CWHO [-a | -l | -o | -v ] [ mask ]",
  17         license         => "GNU GPLv2 or later",
  18         changed         => "Mon May  6 14:02:25 CEST 2002"
  19 );
  20 
  21 Irssi::theme_register([
  22 	'cwho_line', '%K[%W$[!-3]0%K][%C$1%B$[9]2%K][%B$[-10]3%P@%B$[34]4%K]%n'
  23 ]);
  24 
  25 sub sort_mode {
  26 	if ($a->[0] eq $b->[0]) {
  27 		return 0;
  28 	} elsif ($a->[0] eq "@") {
  29 		return -1;
  30 	} elsif ($b->[0] eq "@") {
  31 		return 1;
  32 	} elsif ($a->[0] eq "v") {
  33 		return -1;
  34 	} elsif ($b->[0] eq "v") {
  35 		return 1
  36 	};
  37 }
  38 
  39 Irssi::command_bind 'cwho' => sub {
  40 	my ($pars, $server, $winit) = @_;
  41 	$pars =~ s/^\s+//;
  42 	my @data = split(/ +/, $pars);
  43 	my ($cmode, $cmask, $i) = ('.', "*!*@*", 0);
  44 
  45 	unless ($winit && $winit->{type} eq "CHANNEL") {
  46 	    Irssi::print("You don't have active channel in that window");
  47 	    return;
  48 	}
  49 
  50 	my $channel = $winit->{name};
  51 	
  52 	while ($_ = shift(@data)) {
  53 		/^-a$/ and $cmode = '.', next;
  54 		/^-l$/ and $cmode = 'X', next;
  55 		/^-o$/ and $cmode = '@', next;
  56 		/^-v$/ and $cmode = 'v', next;
  57 		/[!@.]+/ and $cmask = $_, next;
  58 	}
  59 
  60 	my @sorted = ();
  61 	for my $hash ($winit->nicks()) {
  62 		my $mode = $hash->{op}? "@" : $hash->{voice}? "v" : " ";
  63 
  64 		if ($cmode eq "X") {
  65 			next if $mode ne " ";
  66 		} elsif ($mode !~ /$cmode/) {next}
  67 		
  68 		next unless $server->mask_match_address($cmask, $hash->{nick}, $hash->{host});	
  69 
  70 		my ($user, $host) = split(/@/, $hash->{host});
  71 		push @sorted, [ $mode, $hash->{nick}, $user, $host ];
  72 	}
  73 	
  74 	@sorted = sort { sort_mode || lc $a->[1] cmp lc $b->[1] } @sorted;
  75 	
  76 	$server->printformat($channel, MSGLEVEL_CLIENTCRAP, 'cwho_line', ++$i, @$_) for (@sorted);
  77 
  78 	Irssi::print("No matches for \'$cmask\'.") unless $i;
  79 }