Added SILC Thread Queue API
[crypto.git] / apps / irssi / scripts / mail-maildir.pl
1 # $Id$
2
3 $VERSION = "1.8";
4 %IRSSI = (
5     authors     => "Matti Hiljanen",
6     contact     => "qvr\@staff.peliportti.net",
7     name        => "mail-maildir",
8     description => "Mail counter statusbar item with maildir support",
9     license     => "Public Domain",
10     url         => "http://matin.maapallo.org/softa/irssi",
11 );
12
13 # Mail counter statusbar item
14 # for irssi 0.7.99 by Timo Sirainen
15 #
16 # Maildir support added by Matti Hiljanen
17
18 #  /SET maildir_mode - ON/OFF 
19 #  /SET mail_file - specifies mbox file/Maildir location
20 #  /SET mail_refresh_time - in seconds, how often to check for new mail
21
22 use Irssi::TextUI;
23
24 my $maildirmode = 0; # maildir=1, file(spools)=0
25
26 my $last_refresh_time, $refresh_tag;
27
28 # for mbox caching
29 my $last_size, $last_mtime, $last_mailcount, $last_mode;
30
31 sub mbox_count {
32   my $mailfile = shift;
33   my $count;
34   my $maildirmode=Irssi::settings_get_bool('maildir_mode'); 
35   if (!$maildirmode) {
36      my @stat = stat($mailfile);
37      my $size = $stat[7];
38      my $mtime = $stat[9];
39
40      # if the file hasn't changed, get the count from cache
41      return $last_mailcount if ($last_size == $size && $last_mtime == $mtime);
42      $last_size = $size;
43      $last_mtime = $mtime;
44
45      my $f = gensym;
46      return 0 if (!open($f, $mailfile));
47
48      while (<$f>) {
49         $count++ if (/^From /);
50         $count-- if (/^Subject: .*FOLDER INTERNAL DATA/);
51      }
52      close($f);
53      $last_mailcount = $count;
54   } else {
55      opendir(DIR, "$mailfile/cur") or return 0;
56      while (defined(my $file = readdir(DIR))) {
57         next if $file =~ /S/ || $file =~ /^(.|..)$/;
58         $count++;
59      }
60      closedir(DIR);
61
62      opendir(DIR, "$mailfile/new") or return 0;
63      while (defined(my $file = readdir(DIR))) {
64         next if $file =~ /^(.|..)$/;
65         $count++;
66      }
67      closedir(DIR);
68   }
69   return $count;
70 }
71
72 sub mail {
73   my ($item, $get_size_only) = @_;
74
75   $count = mbox_count(Irssi::settings_get_str('mail_file'));
76   if ($count == 0) {
77     # no mail - don't print the [Mail: ] at all
78     if ($get_size_only) {
79       $item->{min_size} = $item->{max_size} = 0;
80     }
81   } else {
82     $item->default_handler($get_size_only, undef, $count, 1);
83   }
84 }
85
86 sub refresh_mail {
87   Irssi::statusbar_items_redraw('mail');
88 }
89
90 sub read_settings {
91   my $time = Irssi::settings_get_int('mail_refresh_time');
92   my $mode = Irssi::settings_get_bool('maildir_mode');
93   unless ($time == $last_refresh_time) {
94      $last_refresh_time = $time;
95      Irssi::timeout_remove($refresh_tag) if ($refresh_tag);
96      $refresh_tag = Irssi::timeout_add($time*1000, 'refresh_mail', undef);
97   }
98   return if ($mode == $last_mode);
99   $last_mode = $mode;
100   if (!$mode) {
101      Irssi::settings_set_str('mail_file', "$ENV{'MAIL'}");
102   } else {
103      Irssi::settings_set_str('mail_file', "$ENV{'HOME'}/Maildir");
104   }
105   refresh_mail;
106 }
107
108 if (!$maildirmode) {
109    Irssi::settings_add_str('misc', 'mail_file', $ENV{'MAIL'});
110 } else {
111    Irssi::settings_add_str('misc', 'mail_file', "$ENV{'HOME'}/Maildir");
112 }
113 Irssi::settings_add_int('misc', 'mail_refresh_time', 60);
114 Irssi::settings_add_bool('misc', 'maildir_mode', "$maildirmode");
115
116 Irssi::statusbar_item_register('mail', '{sb Mail: $0-}', 'mail');
117
118 read_settings();
119 Irssi::signal_add('setup changed', 'read_settings');