summaryrefslogtreecommitdiffstats
path: root/scripts/elist.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/elist.pl')
-rw-r--r--scripts/elist.pl137
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: