1<?php
2
3if (IN_serendipity !== true) {
4    die ("Don't hack!");
5}
6
7@serendipity_plugin_api::load_language(dirname(__FILE__));
8
9class serendipity_event_mailer extends serendipity_event
10{
11    var $title = PLUGIN_EVENT_MAILER_NAME;
12    var $data  = array();
13
14    function introspect(&$propbag)
15    {
16        global $serendipity;
17
18        $propbag->add('name',          PLUGIN_EVENT_MAILER_NAME);
19        $propbag->add('description',   PLUGIN_EVENT_MAILER_DESC);
20        $propbag->add('stackable',     false);
21        $propbag->add('author',        'Sebastian Nohn, Kristian Koehntopp, Garvin Hicking');
22        $propbag->add('version',       '1.60');
23        $propbag->add('requirements',  array(
24            'serendipity' => '1.6',
25            'smarty'      => '2.6.7',
26            'php'         => '4.1.0'
27        ));
28        $propbag->add('event_hooks',    array(
29            'backend_publish' => true,
30            'backend_display' => true,
31            'backend_save'    => true,
32        ));
33        $propbag->add('groups', array('FRONTEND_ENTRY_RELATED'));
34
35        $config = array('what', 'mailto', 'sendtoall', 'includelink', 'striptags', 'keepstriptags', 'convertp', 'mailerbody');
36        $propbag->add('configuration', $config);
37    }
38
39    function performConfig(&$bag) {
40        if (is_object($bag)) {
41            $conf = $bag->get('configuration');
42        }
43
44        $this->data['categories'] = serendipity_fetchCategories('all');
45        if (!is_array($this->data['categories'])) {
46            return false;
47        }
48
49        foreach($this->data['categories'] AS $cat) {
50            $conf[] = 'category_' . $cat['categoryid'];
51            $this->data['cat'][$cat['categoryid']] = $cat;
52        }
53
54        if (is_object($bag)) {
55            $bag->add('configuration', $conf);
56        }
57    }
58
59    function introspect_config_item($name, &$propbag)
60    {
61        if (preg_match('@^category_([0-9]+)$@imsU', $name, $catid)) {
62            $parent = '';
63            if ($this->data['cat'][$catid[1]]['parentid'] > 0) {
64                $parent = " '" . $this->data['cat'][$this->data['cat'][$catid[1]]['parentid']]['category_name'] . "' -";
65            }
66            $propbag->add('type',        'string');
67            $propbag->add('name',        CATEGORY . $parent . " '"  . $this->data['cat'][$catid[1]]['category_name'] . "'");
68            $propbag->add('description', PLUGIN_EVENT_MAILER_RECIPIENTDESC);
69            $propbag->add('default', '');
70            return true;
71        }
72
73        switch($name) {
74
75            case 'what':
76                $propbag->add('type',        'select');
77                $propbag->add('name',        CONTENT);
78                $propbag->add('description', '');
79                $propbag->add('select_values',
80                    array(
81                        'all'      => ENTRY_BODY . ' + ' . EXTENDED_BODY,
82                        'body'     => ENTRY_BODY,
83                        'extended' => EXTENDED_BODY,
84                        'none'     => NONE
85                    )
86                );
87                $propbag->add('default',     'all');
88                break;
89
90            case 'mailto':
91                $propbag->add('type',        'string');
92                $propbag->add('name',        PLUGIN_EVENT_MAILER_RECIPIENT);
93                $propbag->add('description', PLUGIN_EVENT_MAILER_RECIPIENTDESC);
94                $propbag->add('default', '');
95                break;
96
97            case 'sendtoall':
98                $propbag->add('type',        'boolean');
99                $propbag->add('name',        PLUGIN_EVENT_MAILER_SENDTOALL);
100                $propbag->add('description', '');
101                $propbag->add('default',     'false');
102                break;
103
104            case 'includelink':
105                $propbag->add('type',        'boolean');
106                $propbag->add('name',        PLUGIN_EVENT_MAILER_LINK);
107                $propbag->add('description', PLUGIN_EVENT_MAILER_LINKDESC);
108                $propbag->add('default',     'false');
109                break;
110
111            case 'striptags':
112                $propbag->add('type',        'boolean');
113                $propbag->add('name',        PLUGIN_EVENT_MAILER_STRIPTAGS);
114                $propbag->add('description', PLUGIN_EVENT_MAILER_STRIPTAGSDESC);
115                $propbag->add('default',     'false');
116                break;
117
118            case 'keepstriptags':
119                $propbag->add('type',        'boolean');
120                $propbag->add('name',        PLUGIN_EVENT_MAILER_KEEPSTRIPTAGS);
121                $propbag->add('description', PLUGIN_EVENT_MAILER_KEEPSTRIPTAGSDESC);
122                $propbag->add('default',     'true');
123                break;
124
125            case 'convertp':
126                $propbag->add('type',        'boolean');
127                $propbag->add('name',        PLUGIN_EVENT_MAILER_CONVERTP);
128                $propbag->add('description', PLUGIN_EVENT_MAILER_CONVERTPDESC);
129                $propbag->add('default',     'false');
130                break;
131
132            case 'mailerbody':
133                $propbag->add('type',        'text');
134                $propbag->add('name',        PLUGIN_EVENT_MAILER_MAILTEXT);
135                $propbag->add('description', '');
136                $propbag->add('default',     '');
137                break;
138
139            default:
140                return false;
141        }
142        return true;
143    }
144
145    function generate_content(&$title)
146    {
147        $title = $this->title;
148    }
149
150    function sendMail($eventData)
151    {
152        global $serendipity;
153
154        $mails = explode(' ', str_replace(',', '', $this->get_config('mailto')));
155        $to = array();
156        foreach($mails AS $mailto) {
157            $mailto = trim($mailto);
158            if (!empty($mailto)) {
159                $to[] = $mailto;
160            }
161        }
162
163        $this->performConfig($to);
164        if (is_array($this->data['cat'])) {
165            $selected = array();
166            if (is_array($eventData['categories'])) {
167                foreach($eventData['categories'] AS $idx => $cid) {
168                    $selected[$cid] = true;
169                }
170            }
171
172            foreach($this->data['cat'] AS $cid => $cat) {
173                $mailto = trim($this->get_config('category_' . $cid));
174
175                if (!empty($mailto) && isset($selected[$cid])) {
176                    $tos = explode(' ', str_replace(',', '', $mailto));
177                    foreach($tos AS $mailtopart) {
178                        $to[] = trim($mailtopart);
179                    }
180                }
181            }
182        }
183
184        if ($serendipity['POST']['properties']['sendentry_all']) {
185            $mails = serendipity_db_query("SELECT DISTINCT email FROM {$serendipity['dbPrefix']}authors");
186            foreach($mails AS $mail) {
187                $to[] = trim($mail['email']);
188            }
189        }
190
191        $mail = array(
192            'subject' => $eventData['title'],
193            'body'    => $eventData['body'] . $eventData['extended'],
194            // 'from' => $serendipity['blogTitle'] . ' - ' . $eventData['author'] . ' <' . $serendipity['serendipityEmail'] . '>'
195            'from'    => $serendipity['serendipityEmail']
196        );
197
198        switch($this->get_config('what')) {
199            case 'all':
200                $mail['body']     = $eventData['body'] . $eventData['extended'];
201                break;
202            case 'body':
203                $mail['body']     = $eventData['body'];
204                break;
205            case 'extended':
206                $mail['body']     = $eventData['extended'];
207                break;
208            case 'none':
209                $mail['body']     = '';
210                break;
211        }
212
213        if (!empty($serendipity['POST']['properties']['mailerbody'])) {
214            $mail['body'] = $serendipity['POST']['properties']['mailerbody'] . "\n" . $mail['body'];
215        }
216
217        if (isset($serendipity['POST']['properties']['mailto'])) {
218            $mails = explode(' ', str_replace(',', '', $serendipity['POST']['properties']['mailto']));
219            foreach($mails as $mailto) {
220                $mailto = trim($mailto);
221                if (!in_array($mailto, $to)) {
222                    $to[] = $mailto;
223                }
224            }
225        }
226
227        if (serendipity_db_bool($this->get_config('convertp', 'false'))) {
228            $mail['body'] = str_replace('</p>', "</p>\n", $mail['body']);
229        }
230
231        if (serendipity_db_bool($this->get_config('striptags', 'false'))) {
232            if (serendipity_db_bool($this->get_config('keepstriptags', 'true'))) {
233                $mail['body'] = preg_replace('@<a[^>]+href=["\']([^"\']*)["\'][^>]*>([^<]*)</a>@i', "$2 [$1]", $mail['body']);
234                $mail['body'] = preg_replace('@<img[^>]+src=["\']([^"\']*)["\'][^>]*>@i', "[" . IMAGE . ": $1]", $mail['body']);
235            } else {
236                $mail['body'] = preg_replace('@<a[^>]+href=["\']([^"\']*)["\'][^>]*>([^<]*)</a>@i', "", $mail['body']);
237                $mail['body'] = preg_replace('@<img[^>]+src=["\']([^"\']*)["\'][^>]*>@i', "", $mail['body']);
238            }
239            $mail['body'] = strip_tags($mail['body']);
240        }
241
242        if (serendipity_db_bool($this->get_config('includelink', 'false'))) {
243            $mail['body'] = serendipity_archiveURL($eventData['id'], $eventData['title'], 'baseURL', true, array('timestamp' => $eventData['timestamp'])) . "\n\n" . $mail['body'];
244        }
245
246        foreach($to AS $mailto) {
247            if (!empty($mailto)) {
248                echo serendipity_specialchars($mailto) . '...<br />';
249                serendipity_sendMail($mailto, $mail['subject'], $mail['body'], $mail['from']);
250            }
251        }
252    }
253
254    function event_hook($event, &$bag, &$eventData, $addData = null)
255    {
256        global $serendipity;
257
258        $hooks = &$bag->get('event_hooks');
259
260        if (isset($hooks[$event])) {
261
262            switch($event) {
263
264                case 'backend_display':
265                    if (isset($serendipity['POST']['properties']['mailto'])) {
266                        $mailto = $serendipity['POST']['properties']['mailto'];
267                    } else {
268                        $mailto = $this->get_config('mailto');
269                    }
270
271                    if (isset($serendipity['POST']['properties']['sendentry_all'])) {
272                        $sendtoall = $serendipity['POST']['properties']['sendentry_all'];
273                    } else {
274                        $sendtoall = serendipity_db_bool($this->get_config('sendtoall'));
275                    }
276
277                    if (isset($serendipity['POST']['properties']['mailerbody'])) {
278                        $mailerbody = $serendipity['POST']['properties']['mailerbody'];
279                    } else {
280                        $mailerbody = $this->get_config('mailerbody');
281                    }
282
283                    ?>
284                    <fieldset class="entryproperties">
285                        <span class="wrap_legend"><legend><?php echo PLUGIN_EVENT_MAILER_NAME; ?></legend></span>
286
287                        <div class="form_check">
288                            <input id="properties_sendentry" type="checkbox" name="serendipity[properties][sendentry]" value="true" checked="checked">
289                            <label title="<?php echo PLUGIN_EVENT_MAILER_SENDING; ?>" for="properties_sendentry"><?php echo PLUGIN_EVENT_MAILER_ISTOSENDIT; ?></label>
290                        </div>
291                        <div class="form_field">
292                            <label title="<?php echo PLUGIN_EVENT_MAILER_RECIPIENT; ?>" for="properties_mailto"><?php echo PLUGIN_EVENT_MAILER_RECIPIENTS; ?></label>
293                            <input id="properties_mailto" type="text" name="serendipity[properties][mailto]" value="<?php echo serendipity_specialchars($mailto); ?>">
294                        </div>
295                        <div class="form_check">
296                            <input id="sendall" type="checkbox" value="true" name="serendipity[properties][sendentry_all]" <?php echo ($sendtoall ? 'checked="checked"': ''); ?>>
297                            <label title="<?php echo PLUGIN_EVENT_MAILER_SENDTOALL; ?>" for="sendall"><?php echo PLUGIN_EVENT_MAILER_SENDTOALL; ?></label>
298                        </div>
299                        <?php if (!serendipity_db_bool($eventData['isdraft'])) { // Only show this for entries that are published ?>
300                        <div class="form_check">
301                            <input id="forcesend" type="checkbox" value="true" name="serendipity[properties][forcesend]">
302                            <label title="<?php echo PLUGIN_EVENT_MAILER_FORCESEND; ?>" for="forcesend"><?php echo PLUGIN_EVENT_MAILER_FORCESEND; ?></label>
303                            <br />
304                            <em><?php echo PLUGIN_EVENT_MAILER_FORCESEND_DESC; ?></em>
305                        </div>
306                        <?php } ?>
307                        <div class="form_check">
308                            <label for="mailerbody"><?= PLUGIN_EVENT_MAILER_MAILTEXT; ?></label>
309                            <textarea id="mailerbody" rows="5" name="serendipity[properties][mailerbody]" ><?php echo serendipity_specialchars($mailerbody); ?></textarea>
310                        </div>
311                    </fieldset>
312<?php
313                    break;
314
315                case 'backend_save':
316                    if (serendipity_db_bool($eventData['isdraft'])) {
317                        // Never send e-mails for drafts.
318                        return true;
319                    }
320
321                    if (isset($serendipity['POST']['properties']['forcesend']) && $serendipity['POST']['properties']['forcesend']) {
322                        $this->sendMail($eventData);
323                    } else {
324                        echo PLUGIN_EVENT_MAILER_NOTSENDDECISION . '<br />';
325                    }
326                    break;
327
328                case 'backend_publish':
329                    if (isset($serendipity['POST']['properties']) && !isset($serendipity['POST']['properties']['sendentry'])) {
330                        echo PLUGIN_EVENT_MAILER_NOTSENDDECISION . '<br />';
331                    } else {
332                        $this->sendMail($eventData);
333                    }
334                    break;
335
336                default:
337                    return false;
338            }
339            return true;
340        } else {
341            return false;
342        }
343    }
344
345}
346
347/* vim: set sts=4 ts=4 expandtab : */
348