#!/usr/bin/perl
# (c) 2007, Ilya Cassina
#
# inspired by 'xlist.pl' by Matthäus 'JonnyBG' Wander
# Usage: /elist [-min ] [-max
use strict;
use vars qw($VERSION %IRSSI);
use Irssi;
use Getopt::Long;
$VERSION = '1.2';
%IRSSI = (
authors => 'Ilya Cassina',
contact => '[email protected]',
name => 'Enanched LIST',
description => 'This script allow advanced parametrization ' .
'of the /list command. Accepted parameters are ' .
'-minusers <#users> and -maxusers <#users>. ',
license => 'GPLv2',
);
use Irssi qw(
command_bind
signal_add
);
### global variables ####
my %elist_channels = ();
my %elist_config = ();
### settings
Irssi::settings_add_bool($IRSSI{'name'}, 'elist_colorized', 1);
sub elist_channels_free {
%elist_channels = ();
}
sub elist_config_init {
%elist_config = (
mincount => 0,
maxcount => 10000,
yes => "",
chanmask => ""
);
}
sub elist {
my ($data, $server, $witem) = @_;
### init variables ###
elist_config_init();
#### processing arguments using Getopt ###
Getopt::Long::config('permute', 'no_ignore_case');
local(@ARGV) = split(/\s/, $data,);
GetOptions (
'mincount|m=i' => \$elist_config{"mincount"},
'maxcount|M=i' => \$elist_config{"maxcount"},
'yes|YES' => \$elist_config{"yes"}
);
## setting chanmask (remaining argument) ##
if (@ARGV . length == 0) {
$elist_config{"chanmask"} = "";
} else {
# adding '#' character at the beginning if not already present! #
if ($ARGV[0] !~/^\#.*/) {
$elist_config{"chanmask"} = "\#". $ARGV[0];
} else {
$elist_config{"chanmask"} = $ARGV[0];
}
}
### sending LIST command to the server ###
print "%K[%n".$server->{'tag'}."%K]%n %B<-->%n %m"."elist %n%B(%y"."min=%m".$elist_config{"mincount"}."%n".
", %y"."max=%m".$elist_config{"maxcount"}."%n".
", %y"."mask=%K'%m".$elist_config{"chanmask"}."%K'%B)";
$server->command("LIST " . ($elist_config{"yes"} ? "-YES " : "") . $elist_config{"chanmask"});
}
sub elist_collect {
my ($server, $data) = @_;
my (undef, $channel, $users, $topic) = split(/\s/, $data, 4);
$topic = substr($topic, 1);
if (!Irssi::settings_get_bool('elist_colorized')) {
# code below stolen from script: cleanpublic.pl by Jørgen Tjernø
$topic =~ s/\x03\d?\d?(,\d?\d?)?|\x02|\x1f|\x16|\x06|\x07//g;
}
if ($users >= $elist_config{"mincount"} and $users <= $elist_config{"maxcount"}) {
push @{$elist_channels{$users}}, [ $channel, $topic ];
}
}
sub elist_show {
my ($server) = @_;
my ($printstring, $channel);
## keys of elist_channels are (int) users in channel ##
foreach (reverse sort { $a <=> $b } keys %elist_channels) {
my $user_count = $_;
## values are arrays of [ channel_name, topic ] ##
foreach (@{$elist_channels{$user_count}}) {
$printstring = "%K[%n" . $server->{'tag'} . "%K]%n " .
sprintf("%4d", $user_count ) .
" " . @{$_}[0]; ## channel name
if (length @{$_}[1] > 0) {
$printstring .= " %B->%n " . @{$_}[1]; ## topic
}
print $printstring;
}
}
elist_channels_free();
print "%K[%n".$server->{'tag'}."%K]%n %B<-->%n End of %m"."elist%n";
}
command_bind('elist', \&elist);
signal_add('event 322', \&elist_collect);
signal_add('event 323', \&elist_show);
##print "Usage: /elist [-min ] [-max "
# EOF #
# vim: set expandtab tabstop=2 shiftwidth=2: