summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2002-03-10 21:33:46 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2002-03-10 21:33:46 +0000
commit02c9b7d1cf9d6863a871b5133f4dabb68f1101b7 (patch)
tree887ad4f86261354f2439f9cdbcfcc6c24d7d8cd1
parent0b7ebb6adb03df18f79612d7df77cd3cce1ed0c7 (diff)
downloadirssi-02c9b7d1cf9d6863a871b5133f4dabb68f1101b7.zip
new scripts
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@2571 dbcabf3a-b0e7-0310-adc4-f8d773084564
-rw-r--r--scripts/Makefile.am4
-rw-r--r--scripts/mail.pl133
-rw-r--r--scripts/usercount.pl160
3 files changed, 296 insertions, 1 deletions
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index b6dfbc4e..9b612c29 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -8,8 +8,10 @@ script_DATA = \
buf.pl \
dns.pl \
kills.pl \
+ mail.pl \
mlock.pl \
quitmsg.pl \
- splitlong.pl
+ splitlong.pl \
+ usercount.pl
EXTRA_DIST = $(script_DATA)
diff --git a/scripts/mail.pl b/scripts/mail.pl
new file mode 100644
index 00000000..12007c84
--- /dev/null
+++ b/scripts/mail.pl
@@ -0,0 +1,133 @@
+# $Id: mail.pl,v 1.1 2002/03/10 21:33:46 cras Exp $
+
+$VERSION = "2.0";
+%IRSSI = (
+ authors => "Matti Hiljanen, Timo Sirainen",
+ contact => "matti\@hiljanen.com, tss\@iki.fi",
+ name => "mail",
+ description => "Mail counter statusbar item with maildir support",
+ license => "Public Domain",
+ url => "http://matin.maapallo.org/softa/irssi, http://irssi.org, http://scripts.irssi.de",
+);
+
+# Mail counter statusbar item
+# for irssi 0.8.1 by Timo Sirainen
+#
+# Maildir support added by Matti Hiljanen
+#
+# /SET maildir_mode - ON/OFF
+# /SET mail_file - specifies mbox file/Maildir location
+# /SET mail_refresh_time - in seconds, how often to check for new mail
+# /SET mail_ext_program - specify external mail checker program
+
+use Irssi::TextUI;
+
+my $maildirmode = 0; # maildir=1, file(spools)=0
+my $extprog;
+my ($last_refresh_time, $refresh_tag);
+
+# for mbox caching
+my $last_size, $last_mtime, $last_mailcount, $last_mode;
+
+sub mbox_count {
+ my $mailfile = shift;
+ my $count = 0;
+ my $maildirmode=Irssi::settings_get_bool('maildir_mode');
+ if ($extprog ne "") {
+ $count = `$extprog`;
+ chomp $count;
+ } else {
+ if (!$maildirmode) {
+ if (-f $mailfile) {
+ my @stat = stat($mailfile);
+ my $size = $stat[7];
+ my $mtime = $stat[9];
+
+ # if the file hasn't changed, get the count from cache
+ return $last_mailcount if ($last_size == $size && $last_mtime == $mtime);
+ $last_size = $size;
+ $last_mtime = $mtime;
+
+ my $f = gensym;
+ return 0 if (!open($f, $mailfile));
+
+ while (<$f>) {
+ $count++ if (/^From /);
+ $count-- if (/^Subject: .*FOLDER INTERNAL DATA/);
+ }
+ close($f);
+ $last_mailcount = $count;
+ }
+ } else {
+ opendir(DIR, "$mailfile/cur") or return 0;
+ while (defined(my $file = readdir(DIR))) {
+ next if $file =~ /S/ || $file =~ /^(.|..)$/;
+ $count++;
+ }
+ closedir(DIR);
+
+ opendir(DIR, "$mailfile/new") or return 0;
+ while (defined(my $file = readdir(DIR))) {
+ next if $file =~ /^(.|..)$/;
+ $count++;
+ }
+ closedir(DIR);
+ }
+ }
+ return $count;
+}
+
+sub mail {
+ my ($item, $get_size_only) = @_;
+
+ $count = mbox_count(Irssi::settings_get_str('mail_file'));
+ if ($count == 0) {
+ # no mail - don't print the [Mail: ] at all
+ if ($get_size_only) {
+ $item->{min_size} = $item->{max_size} = 0;
+ }
+ } else {
+ $item->default_handler($get_size_only, undef, $count, 1);
+ }
+}
+
+sub refresh_mail {
+ Irssi::statusbar_items_redraw('mail');
+}
+
+sub read_settings {
+ $extprog = Irssi::settings_get_str('mail_ext_program');
+ my $time = Irssi::settings_get_int('mail_refresh_time');
+ my $mode = Irssi::settings_get_bool('maildir_mode');
+ unless ($time == $last_refresh_time) {
+ $last_refresh_time = $time;
+ Irssi::timeout_remove($refresh_tag) if ($refresh_tag);
+ $refresh_tag = Irssi::timeout_add($time*1000, 'refresh_mail', undef);
+ }
+ return if ($mode == $last_mode);
+ $last_mode = $mode;
+ if (!$mode) {
+ Irssi::settings_set_str('mail_file', "$ENV{'MAIL'}");
+ } else {
+ Irssi::settings_set_str('mail_file', "$ENV{'HOME'}/Maildir");
+ }
+ refresh_mail;
+}
+
+if (!$maildirmode) {
+ Irssi::settings_add_str('misc', 'mail_file', $ENV{'MAIL'});
+} else {
+ Irssi::settings_add_str('misc', 'mail_file', "$ENV{'HOME'}/Maildir");
+}
+
+Irssi::settings_add_str('misc', 'mail_ext_program', '');
+Irssi::settings_add_int('misc', 'mail_refresh_time', 60);
+Irssi::settings_add_bool('misc', 'maildir_mode', "$maildirmode");
+
+Irssi::statusbar_item_register('mail', '{sb Mail: $0-}', 'mail');
+
+read_settings();
+Irssi::signal_add('setup changed', 'read_settings');
+refresh_mail();
+
+# EOF
diff --git a/scripts/usercount.pl b/scripts/usercount.pl
new file mode 100644
index 00000000..fbf9d7fb
--- /dev/null
+++ b/scripts/usercount.pl
@@ -0,0 +1,160 @@
+use Irssi 20020101.0250 ();
+$VERSION = "1.14";
+%IRSSI = (
+ authors => 'David Leadbeater, Timo Sirainen, Georg Lukas',
+ contact => 'dgl@dgl.cx, tss@iki.fi, georg@boerde.de',
+ name => 'usercount',
+ description => 'Adds a usercount for a channel as a status bar item',
+ license => 'GNU GPLv2 or later',
+ url => 'http://irssi.dgl.yi.org/',
+);
+
+# Add usercount = { }; to your statusbar config
+# /set usercount_show_zero on or off to show users when 0 users of that type
+# /set usercount_show_ircops (default off)
+# /set usercount_show_halfops (default on)
+
+# you can customize the look of this item from theme file:
+# sb_usercount = "{sb %_$0%_ nicks ($1-)}";
+# sb_uc_ircops = "%_*%_$*";
+# sb_uc_ops = "%_@%_$*";
+# sb_uc_halfops = "%_%%%_$*";
+# sb_uc_voices = "%_+%_$*";
+# sb_uc_normal = "$*";
+# sb_uc_space = " ";
+
+
+use strict;
+use Irssi::TextUI;
+
+my ($ircops, $ops, $halfops, $voices, $normal, $total);
+my ($timeout_tag, $recalc);
+
+# Called to make the status bar item
+sub usercount {
+ my ($item, $get_size_only) = @_;
+ my $wi = !Irssi::active_win() ? undef : Irssi::active_win()->{active};
+
+ if(!$wi || $wi->{type} ne "CHANNEL") { # only works on channels
+ $item->{min_size} = $item->{max_size} = 0;
+ return;
+ }
+
+ if ($recalc) {
+ $recalc = 0;
+ calc_users($wi);
+ }
+
+ my $theme = Irssi::current_theme();
+ my $format = $theme->format_expand("{sb_usercount}");
+ if ($format) {
+ # use theme-specific look
+ my $ircopstr = $theme->format_expand("{sb_uc_ircops $ircops}", Irssi::EXPAND_FLAG_IGNORE_EMPTY);
+ my $opstr = $theme->format_expand("{sb_uc_ops $ops}", Irssi::EXPAND_FLAG_IGNORE_EMPTY);
+ my $halfopstr = $theme->format_expand("{sb_uc_halfops $halfops}", Irssi::EXPAND_FLAG_IGNORE_EMPTY);
+ my $voicestr = $theme->format_expand("{sb_uc_voices $voices}", Irssi::EXPAND_FLAG_IGNORE_EMPTY);
+ my $normalstr = $theme->format_expand("{sb_uc_normal $normal}", Irssi::EXPAND_FLAG_IGNORE_EMPTY);
+ my $space = $theme->format_expand('{sb_uc_space}', Irssi::EXPAND_FLAG_IGNORE_EMPTY);
+ $space = " " unless $space;
+
+ my $str = "";
+ $str .= $ircopstr.$space if defined $ircops;
+ $str .= $opstr.$space if defined $ops;
+ $str .= $halfopstr.$space if defined $halfops;
+ $str .= $voicestr.$space if defined $voices;
+ $str .= $normalstr.$space if defined $normal;
+ $str =~ s/\Q$space\E$//;
+
+ $format = $theme->format_expand("{sb_usercount $total $str}",
+ Irssi::EXPAND_FLAG_IGNORE_REPLACES);
+ } else {
+ # use the default look
+ $format = "{sb \%_$total\%_ nicks \%c(\%n";
+ $format .= '*'.$ircops.' ' if (defined $ircops);
+ $format .= '@'.$ops.' ' if (defined $ops);
+ $format .= '%%'.$halfops.' ' if (defined $halfops);
+ $format .= "+$voices " if (defined $voices);
+ $format .= "$normal " if (defined $normal);
+ $format =~ s/ $//;
+ $format .= "\%c)}";
+ }
+
+ $item->default_handler($get_size_only, $format, undef, 1);
+}
+
+sub calc_users() {
+ my $channel = shift;
+ my $server = $channel->{server};
+
+ $ircops = $ops = $halfops = $voices = $normal = 0;
+ for ($channel->nicks()) {
+ if ($_->{serverop}) {
+ $ircops++;
+ }
+
+ if ($_->{op}) {
+ $ops++;
+ } elsif ($_->{halfop}) {
+ $halfops++;
+ } elsif ($_->{voice}) {
+ $voices++;
+ } else {
+ $normal++;
+ }
+ }
+
+ $total = $ops+$halfops+$voices+$normal;
+ if (!Irssi::settings_get_bool('usercount_show_zero')) {
+ $ircops = undef if ($ircops == 0);
+ $ops = undef if ($ops == 0);
+ $halfops = undef if ($halfops == 0);
+ $voices = undef if ($voices == 0);
+ $normal = undef if ($normal == 0);
+ }
+ $halfops = undef unless Irssi::settings_get_bool('usercount_show_halfops');
+ $ircops = undef unless Irssi::settings_get_bool('usercount_show_ircops');
+}
+
+sub refresh {
+ if ($timeout_tag > 0) {
+ Irssi::timeout_remove($timeout_tag);
+ $timeout_tag = 0;
+ }
+ Irssi::statusbar_items_redraw('usercount');
+}
+
+sub refresh_check {
+ my $channel = shift;
+ my $wi = Irssi::active_win()->{active};
+ return if $wi->{name} ne $channel->{name};
+ return if $wi->{server}->{tag} ne $channel->{server}->{tag};
+
+ # don't refresh immediately, or we'll end up refreshing
+ # a lot around netsplits
+ $recalc = 1;
+ Irssi::timeout_remove($timeout_tag) if ($timeout_tag > 0);
+ $timeout_tag = Irssi::timeout_add(500, 'refresh', undef);
+}
+
+sub refresh_recalc {
+ $recalc = 1;
+ refresh();
+}
+
+$recalc = 1;
+$timeout_tag = 0;
+
+Irssi::settings_add_bool('misc', 'usercount_show_zero', 1);
+Irssi::settings_add_bool('misc', 'usercount_show_ircops', 0);
+Irssi::settings_add_bool('misc', 'usercount_show_halfops', 1);
+
+Irssi::statusbar_item_register('usercount', undef, 'usercount');
+Irssi::statusbars_recreate_items();
+
+Irssi::signal_add_last('nicklist new', 'refresh_check');
+Irssi::signal_add_last('nicklist remove', 'refresh_check');
+Irssi::signal_add_last('nick mode changed', 'refresh_check');
+Irssi::signal_add_last('setup changed', 'refresh_recalc');
+Irssi::signal_add_last('window changed', 'refresh_recalc');
+Irssi::signal_add_last('window item changed', 'refresh_recalc');
+