[prev] [thread] [next] [lurker] [Date index for 2004/04/05]
--fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Bit icky but it's a stab Simon --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="siesta-digest.patch" Index: Config.pm.in =================================================================== --- Config.pm.in (revision 1496) +++ Config.pm.in (working copy) @@ -1,7 +1,7 @@ # $Id$ package Siesta::Config; use strict; -use vars qw( $CONFIG_FILE $ROOT $MESSAGES @STORAGE $ARCHIVE $LOG_PATH $LOG_LEVEL $config ); +use vars qw( $CONFIG_FILE $ROOT $MESSAGES @STORAGE $ARCHIVE $DIGESTS $LOG_PATH $LOG_LEVEL $config ); use AppConfig qw(:expand :argcount); use base 'Exporter'; our @EXPORT_OK = qw( $config ); @@ -16,18 +16,18 @@ Where to install everything to. Currently this is set to - @@ROOT@@ + @@ROOT@@ =head2 C<$CONFIG_FILE> Where the config file is currently - @@ROOT@@/siesta.conf + @@ROOT@@/siesta.conf This can be overridden when using the command line tools by using - -f <new config file> + -f <new config file> =head3 CONFIG OPTIONS @@ -52,6 +52,12 @@ By default - @@ROOT@@/archive/<list name>/ +=item digests + +Where we save our digest spools + +By default = @@ROOT@@/digests/ + =item log_path Where we log things @@ -104,6 +110,7 @@ $config->get('storage_pass')), $MESSAGES = $config->get('messages'); $ARCHIVE = $config->get('archive'); + $DIGESTS = $config->get('digests'); $LOG_PATH = $config->get('log_path'); $LOG_LEVEL = $config->get('log_level'); } @@ -128,6 +135,9 @@ archive => { DEFAULT => '@@ROOT@@/archive', }, + digests => { + DEFAULT => '@@ROOT@@/digests', + } log_path => { DEFAULT => '@@ROOT@@/error', }, Index: lib/Siesta/Plugin/Digest.pm =================================================================== --- lib/Siesta/Plugin/Digest.pm (working copy) +++ lib/Siesta/Plugin/Digest.pm (working copy) @@ -0,0 +1,89 @@ +package Siesta::Plugin::Digest; +use strict; +use base 'Siesta::Plugin'; +__PACKAGE__->columns( TEMP => qw( send_this )); + +use Email::LocalDelivery; +use Email::Folder; + +sub description { "handle the digest collating and sending" } +sub personal { 1 } + + +# TODO do this on a time basis? + +sub process { + my $self = shift; + my $mail = shift; + + my $path = $self->pref('path'); + + unless ($self->user) { # first pass + $self->add_to_digest( $mail ); + my ($count, $digest) = $self->get_digest(); + + if ($count > $self->pref('messages')) { # spool is big enough + $self->send_this($digest); + + # we should probably lock this + if (-f $path) { + unlink($path) || die "Couldn't unlink '$path'\n"; + } else { + chdir($path) || die "Couldn't chdir to '$path'\n"; + unlink(<*>) || die "Couldn't unlink '$path/*'\n"; + } + } + return; # carry on + } + + # okay, this user isn't interested in digests, continue with the + # regular mail + return unless $self->pref( 'digest' ); + + return 1 unless $self->send_this; # the digest isn't ready yet, stop. + $mail = $self->send_this; + return; +} + +# get the number of digests and the body of the digest +sub get_digest { + my $self = shift; + my $count = 0; + + my $path = $self->pref('path'); + my $folder = Email::Folder->new($self->pref('path')) + || die "Couldn't open email folder '$path'\n"; + my @messages = $folder->messages; + my $digest = Siesta->bake('digest', list => $self->list, messages => @messages); + + return ($#messages, $digest); +} + +# spool to disk +sub add_to_digest { + my ($self, $mail) = @_; + + my $path = $self->pref('path'); + Email::LocalDelivery->deliver( $mail->as_string, $path ) + or die "storage of digets mail into '$path' failed"; +} + + +sub options { + my $self = shift; + my $name = $self->list->name; + +{ + path => { + description => "where to spool the digest", + type => "string", + default => "$Siesta::Config::DIGEST/$name/", + }, + messages => { + description => "how many messages to spool before sending the digest", + type => "number", + default => "20", + } + }; +} + + Index: messages/digest =================================================================== --- messages/digest (working copy) +++ messages/digest (working copy) @@ -0,0 +1,44 @@ +Send [% list.name %] mailing list submissions to + [% list.post_address -%] + +[%# TODO +To subscribe or unsubscribe via the World Wide Web, visit + WEBADDRESS +or, via email, send a message with subject or body 'help' to + LISTHELP +-%] + +You can reach the person managing the list at + [% list.owner %] + +When replying, please edit your Subject line so it is more specific +than "Re: Contents of [% list.name %] digest..." + + +Today's Topics: + +[%- SET count = 0 -%] +[%- FOREACH message = messages +%] + [%- count = count + 1 -%] + [%- count %]. [%- message.header('subject') %] ([% message.header('from') %]) + +[%- END -%] + +[%- SET count = 1 -%] + +[% FOREACH message = messages %] + + +--__--__-- + + +Message: [% count %] +Date: [% message.header('date') %] +To: [% message.header('to') %] +Subject: [% message.header('subject') %] +From: [% message.header('from') %] +[% IF message.header('cc') %]Cc: [% message.header('cc') %][% END %] + +[% message.body() %] +[% count = count + 1 %] +[% END %] --fUYQa+Pmc3FrFX/N--
Generated at 13:56 on 01 Jul 2004 by mariachi 0.52