2 package IkiWiki::Plugin::notifyemail;
9 hook(type => "formbuilder_setup", id => "notifyemail", call => \&formbuilder_setup);
10 hook(type => "formbuilder", id => "notifyemail", call => \&formbuilder);
11 hook(type => "getsetup", id => "notifyemail", call => \&getsetup);
12 hook(type => "changes", id => "notifyemail", call => \¬ify);
24 sub formbuilder_setup (@) {
27 my $form=$params{form};
28 return unless $form->title eq "preferences";
29 my $session=$params{session};
30 $form->field(name => "subscriptions", size => 50,
31 fieldset => "preferences",
32 comment => "(".htmllink("", "", "ikiwiki/PageSpec", noimageinline => 1).")",
33 value => getsubscriptions($session->param("name")));
38 my $form=$params{form};
39 return unless $form->title eq "preferences" &&
40 $form->submitted eq "Save Preferences" && $form->validate &&
41 defined $form->field("subscriptions");
42 setsubscriptions($form->field('name'), $form->field('subscriptions'));
45 sub getsubscriptions ($) {
47 eval q{use IkiWiki::UserInfo};
49 IkiWiki::userinfo_get($user, "subscriptions");
52 sub setsubscriptions ($$) {
54 my $subscriptions=shift;
55 eval q{use IkiWiki::UserInfo};
57 IkiWiki::userinfo_set($user, "subscriptions", $subscriptions);
60 # Called by other plugins to subscribe the user to a pagespec.
63 my $addpagespec=shift;
64 my $pagespec=getsubscriptions($user);
65 setsubscriptions($user, $pagespec." or ".$addpagespec);
72 eval q{use Mail::Sendmail};
74 eval q{use IkiWiki::UserInfo};
77 # Daemonize, in case the mail sending takes a while.
78 #defined(my $pid = fork) or error("Can't fork: $!");
79 #return if $pid; # parent
81 #open STDIN, '/dev/null';
82 #open STDOUT, '>/dev/null';
83 #POSIX::setsid() or error("Can't start a new session: $!");
84 #open STDERR, '>&STDOUT' or error("Can't dup stdout: $!");
86 # Don't need to keep a lock on the wiki as a daemon.
87 IkiWiki::unlockwiki();
89 my $userinfo=IkiWiki::userinfo_retrieve();
90 #exit 0 unless defined $userinfo;
92 foreach my $user (keys %$userinfo) {
93 my $pagespec=$userinfo->{$user}->{"subscriptions"};
94 next unless defined $pagespec && length $pagespec;
95 my $email=$userinfo->{$user}->{email};
96 next unless defined $email && length $email;
99 foreach my $file (@files) {
100 my $page=pagename($file);
101 print "file: $file ($page)\n";
102 next unless pagespec_match($page, $pagespec);
104 my $showcontent=defined pagetype($file);
106 $content=eval { readfile(srcfile($file)) };
107 $showcontent=0 if $@;
110 if (! IkiWiki::isinternal($page)) {
111 $url=urlto($page, undef, 1);
113 elsif (defined $pagestate{$page}{meta}{permalink}) {
114 # need to use permalink for an internal page
115 $url=$pagestate{$page}{meta}{permalink};
118 $url=$config{wikiurl}; # crummy fallback url
120 my $template=template("notifyemail.tmpl");
122 wikiname => $config{wikiname},
124 prefsurl => IkiWiki::cgiurl(do => "prefs"),
125 showcontent => $showcontent,
128 #translators: The two variables are the name of the wiki,
129 #translators: and a page that was changed.
130 #translators: This is used as the subject of an email.
131 my $subject=sprintf(gettext("%s: change notification for %s"),
132 $config{wikiname}, $page);
135 From => "$config{wikiname} <$config{adminemail}>",
137 Message => $template->output,
142 #exit 0; # daemon child