diff options
Diffstat (limited to 'scripts/elist.pl')
-rw-r--r-- | scripts/elist.pl | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/scripts/elist.pl b/scripts/elist.pl new file mode 100644 index 0000000..06e934f --- /dev/null +++ b/scripts/elist.pl @@ -0,0 +1,137 @@ +#!/usr/bin/perl + +# (c) 2007, Ilya Cassina <icassina@gmail.com> +# +# inspired by 'xlist.pl' by Matthäus 'JonnyBG' Wander <jbg@swznet.de> + +# Usage: /elist [-min <usercount>] [-max <usercount] [#]<channelmask> + + +use strict; +use vars qw($VERSION %IRSSI); + +use Irssi; +use Getopt::Long; + +$VERSION = '1.2'; +%IRSSI = ( + authors => 'Ilya Cassina', + contact => 'icassina@gmail.com', + 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 <usercount>] [-max <usercount] [#]<channelmask>" + +# EOF # +# vim: set expandtab tabstop=2 shiftwidth=2: |