]> git.donarmstrong.com Git - infobot.git/blob - src/Modules/pager.pl
* Msg user with "not found" status instead of reporting nil to the channel
[infobot.git] / src / Modules / pager.pl
1 # Pager
2 #
3 # modified from pager.pm in flooterbuck changes are:
4 #
5 # Copyright (c) 2004 Tim Riker <Tim@Rikers.org>
6 #
7 # This package is free software;  you can redistribute it and/or
8 # modify it under the terms of the license found in the file
9 # named LICENSE that should have accompanied this file.
10 #
11 # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
12 # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
13 # WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
14
15 package pager;
16 use strict;
17
18 my $no_page;
19
20 BEGIN {
21     eval qq{
22                 use Mail::Mailer qw(sendmail);
23         };
24     $no_page++ if ($@);
25 }
26
27 sub pager::page {
28     my ($message) = @_;
29     my ($retval);
30
31     # TODO only allow registered users?
32
33     if ($no_page) {
34         &::status('page module requires Mail::Mailer.');
35         return 'page module not active';
36     }
37
38     unless ( $message =~ /^(\S+)\s+(.*)$/ ) {
39         return undef;
40     }
41
42     my $from = $::who;
43     my $to   = $1;
44     my $msg  = $2;
45
46     # allow optional trailing : ie: page foo[:] hello
47     $to =~ s/:$//;
48
49     my $tofactoid = &::getFactoid( lc "${to}'s pager" );
50     if ( $tofactoid =~ /(\S+@\S+)/ ) {
51         my $toaddr = $1;
52         $toaddr =~ s/^mailto://;
53
54         # TODO require sender-locked factoid?
55
56         my $fromfactoid = &::getFactoid( lc "${from}'s pager" );
57
58         my $fromaddr;
59         if ( $fromfactoid =~ /(\S+@\S+)/ ) {
60             $fromaddr = $1;
61             $fromaddr =~ s/^mailto://;
62         }
63         else {
64
65             # TODO require sender to have valid self-locked pager factoid?
66             $fromaddr = 'infobot@example.com';
67         }
68
69         my $channel = $::chan || 'infobot';
70
71         # TODO disallow use from private message? $chan='_default'
72
73         &::status(
74             "pager: from $from <$fromaddr>, to $to <$toaddr>, msg \"$msg\"");
75         my %headers = (
76             To         => "$to <$toaddr>",
77             From       => "$from <$fromaddr>",
78             Subject    => "Message from $channel!",
79             'X-Mailer' => 'infobot',
80         );
81
82         #               my $logmsg;
83         #               for (keys %headers) {
84         #                       $logmsg .= "$_: $headers{$_}\n";
85         #               }
86         #               $logmsg .= "\n$msg\n";
87         #               &::status("pager:\n$logmsg");
88
89         my $failed;
90         my $mailer = new Mail::Mailer 'sendmail';
91         $failed++ unless $mailer->open( \%headers );
92         $failed++ unless print $mailer "$msg\n";
93         $failed++ unless $mailer->close;
94
95         if ($failed) {
96             $retval = 'Sorry, an error occurred while sending mail.';
97         }
98         else {
99             $retval = "$from: I sent mail to $toaddr from $fromaddr.";
100         }
101     }
102     else {
103         $retval = "Sorry, I don't know ${to}'s email address.";
104     }
105     &::performStrictReply($retval);
106 }
107
108 'pager';
109
110 # vim:ts=4:sw=4:expandtab:tw=80