finish notifyemail plugin

master
Joey Hess 2012-03-28 18:52:11 -04:00
parent d68d255268
commit a22be4eef0
3 changed files with 49 additions and 28 deletions

View File

@ -1,15 +1,15 @@
#!/usr/bin/perl
package IkiWiki::Plugin::changemail;
package IkiWiki::Plugin::notifyemail;
use warnings;
use strict;
use IkiWiki 3.00;
sub import {
hook(type => "formbuilder_setup", id => "changemail", call => \&formbuilder_setup);
hook(type => "formbuilder", id => "changemail", call => \&formbuilder);
hook(type => "getsetup", id => "changemail", call => \&getsetup);
hook(type => "change", id => "changemail", call => \&notify);
hook(type => "formbuilder_setup", id => "notifyemail", call => \&formbuilder_setup);
hook(type => "formbuilder", id => "notifyemail", call => \&formbuilder);
hook(type => "getsetup", id => "notifyemail", call => \&getsetup);
hook(type => "changes", id => "notifyemail", call => \&notify);
}
sub getsetup () {
@ -27,13 +27,10 @@ sub formbuilder_setup (@) {
my $form=$params{form};
return unless $form->title eq "preferences";
my $session=$params{session};
my $user_name=$session->param("name");
eval q{use IkiWiki::UserInfo};
error $@ if $@;
$form->field(name => "subscriptions", force => 1, size => 50,
$form->field(name => "subscriptions", size => 50,
fieldset => "preferences",
comment => "(".htmllink("", "", "ikiwiki/PageSpec", noimageinline => 1).")",
value => IkiWiki::userinfo_get($user_name, "subscriptions"));
value => getsubscriptions($session->param("name")));
}
sub formbuilder (@) {
@ -45,6 +42,13 @@ sub formbuilder (@) {
setsubscriptions($form->field('name'), $form->field('subscriptions'));
}
sub getsubscriptions ($) {
my $user=shift;
eval q{use IkiWiki::UserInfo};
error $@ if $@;
IkiWiki::userinfo_get($user, "subscriptions");
}
sub setsubscriptions ($$) {
my $user=shift;
my $subscriptions=shift;
@ -53,6 +57,14 @@ sub setsubscriptions ($$) {
IkiWiki::userinfo_set($user, "subscriptions", $subscriptions);
}
# Called by other plugins to subscribe the user to a pagespec.
sub subscribe ($$) {
my $user=shift;
my $addpagespec=shift;
my $pagespec=getsubscriptions($user);
setsubscriptions($user, $pagespec." or ".$addpagespec);
}
sub notify (@) {
my @files=@_;
return unless @files;
@ -63,30 +75,37 @@ sub notify (@) {
error $@ if $@;
# Daemonize, in case the mail sending takes a while.
defined(my $pid = fork) or error("Can't fork: $!");
return if $pid; # parent
chdir '/';
open STDIN, '/dev/null';
open STDOUT, '>/dev/null';
POSIX::setsid() or error("Can't start a new session: $!");
open STDERR, '>&STDOUT' or error("Can't dup stdout: $!");
#defined(my $pid = fork) or error("Can't fork: $!");
#return if $pid; # parent
#chdir '/';
#open STDIN, '/dev/null';
#open STDOUT, '>/dev/null';
#POSIX::setsid() or error("Can't start a new session: $!");
#open STDERR, '>&STDOUT' or error("Can't dup stdout: $!");
# Don't need to keep a lock on the wiki as a daemon.
IkiWiki::unlockwiki();
my $userinfo=IkiWiki::userinfo_retrieve();
exit 0 unless defined $userinfo;
#exit 0 unless defined $userinfo;
foreach my $user (keys %$userinfo) {
my $pagespec=$userinfo->{$user}->{"subscriptions"};
next unless defined $pagespec && length $pagespec;
my $email=$userinfo->{$user}->{email};
next unless defined $email && length $email;
print "!!$user\n";
foreach my $file (@files) {
my $page=pagename($file);
print "file: $file ($page)\n";
next unless pagespec_match($page, $pagespec);
my $ispage=defined pagetype($file);
my $content="";
my $showcontent=defined pagetype($file);
if ($showcontent) {
$content=eval { readfile(srcfile($file)) };
$showcontent=0 if $@;
}
my $url;
if (! IkiWiki::isinternal($page)) {
$url=urlto($page, undef, 1);
@ -98,17 +117,17 @@ sub notify (@) {
else {
$url=$config{wikiurl}; # crummy fallback url
}
my $template=template("changemail.tmpl");
my $template=template("notifyemail.tmpl");
$template->param(
wikiname => $config{wikiname},
url => $url,
prefsurl => IkiWiki::cgiurl(do => "prefs"),
ispage => $ispage,
content => $ispage ? readfile(srcfile($file)) : "",
showcontent => $showcontent,
content => $content,
);
#translators: The two variables are the name of the wiki,
#translators: and a page that was changed.
#translators: This is used as the subject of a commit email.
#translators: This is used as the subject of an email.
my $subject=sprintf(gettext("%s: change notification for %s"),
$config{wikiname}, $page);
sendmail(
@ -120,7 +139,7 @@ sub notify (@) {
}
}
exit 0; # daemon child
#exit 0; # daemon child
}
1

View File

@ -1,10 +1,12 @@
This plugin allows emailing users when pages are created or changed.
This plugin allows uses to subscribe to pages, and emails them when
they pages are created or changed.
It needs the [[!cpan Mail::SendMail]] perl module, and sends mail
using the local MTA.
Each user can configure which pages they are interested in, using an
[[ikiwiki/PageSpec]] on their Preferences page. Any change to a page
matching the pagespec will send an email that includes the new content of
matching the PagSspec will send an email that includes the new content of
the page, and a link to the page on the web.
To make it easy to subscribe to comment threads when posting a comment,

View File

@ -2,8 +2,8 @@ A change has been made to <TMPL_VAR URL>
To stop these notifications, visit <TMPL_VAR PREFSURL>
<TMPL_IF ISPAGE>
<TMPL_IF NAME=SHOWCONTENT>
----
<TMPL_VAR CONTENT>
<TMPL_IF>
</TMPL_IF>