xref: /plugin/notification/action/cron.php (revision 94db1f407199fbe5341fc03c87c134af7da06d1f)
1*94db1f40SSzymon Olewniczak<?php
2*94db1f40SSzymon Olewniczak
3*94db1f40SSzymon Olewniczak/**
4*94db1f40SSzymon Olewniczak * DokuWiki Plugin notification (Action Component)
5*94db1f40SSzymon Olewniczak *
6*94db1f40SSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7*94db1f40SSzymon Olewniczak * @author  Szymon Olewniczak <it@rid.pl>
8*94db1f40SSzymon Olewniczak */
9*94db1f40SSzymon Olewniczak
10*94db1f40SSzymon Olewniczak// must be run within Dokuwiki
11*94db1f40SSzymon Olewniczakif (!defined('DOKU_INC')) {
12*94db1f40SSzymon Olewniczak    die();
13*94db1f40SSzymon Olewniczak}
14*94db1f40SSzymon Olewniczak
15*94db1f40SSzymon Olewniczakclass action_plugin_notification_cron extends DokuWiki_Action_Plugin
16*94db1f40SSzymon Olewniczak{
17*94db1f40SSzymon Olewniczak
18*94db1f40SSzymon Olewniczak    /**
19*94db1f40SSzymon Olewniczak     * Registers a callback function for a given event
20*94db1f40SSzymon Olewniczak     *
21*94db1f40SSzymon Olewniczak     * @param Doku_Event_Handler $controller DokuWiki's event controller object
22*94db1f40SSzymon Olewniczak     *
23*94db1f40SSzymon Olewniczak     * @return void
24*94db1f40SSzymon Olewniczak     */
25*94db1f40SSzymon Olewniczak    public function register(Doku_Event_Handler $controller)
26*94db1f40SSzymon Olewniczak    {
27*94db1f40SSzymon Olewniczak        $controller->register_hook('INDEXER_TASKS_RUN', 'AFTER', $this, 'handle_indexer_tasks_run');
28*94db1f40SSzymon Olewniczak    }
29*94db1f40SSzymon Olewniczak
30*94db1f40SSzymon Olewniczak    /**
31*94db1f40SSzymon Olewniczak     *
32*94db1f40SSzymon Olewniczak     * @param Doku_Event $event  event object by reference
33*94db1f40SSzymon Olewniczak     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
34*94db1f40SSzymon Olewniczak     *                           handler was registered]
35*94db1f40SSzymon Olewniczak     *
36*94db1f40SSzymon Olewniczak     * @return void
37*94db1f40SSzymon Olewniczak     */
38*94db1f40SSzymon Olewniczak    public function handle_indexer_tasks_run(Doku_Event $event, $param)
39*94db1f40SSzymon Olewniczak    {
40*94db1f40SSzymon Olewniczak        /** @var DokuWiki_Auth_Plugin $auth */
41*94db1f40SSzymon Olewniczak        global $auth;
42*94db1f40SSzymon Olewniczak
43*94db1f40SSzymon Olewniczak        /** @var \helper_plugin_notification_db $db_helper */
44*94db1f40SSzymon Olewniczak        $db_helper = plugin_load('helper', 'notification_db');
45*94db1f40SSzymon Olewniczak        $sqlite = $db_helper->getDB();
46*94db1f40SSzymon Olewniczak
47*94db1f40SSzymon Olewniczak
48*94db1f40SSzymon Olewniczak        //get the oldest check
49*94db1f40SSzymon Olewniczak        $res = $sqlite->query('SELECT user, MIN(timestamp) FROM cron_check');
50*94db1f40SSzymon Olewniczak        $user = $sqlite->res2single($res);
51*94db1f40SSzymon Olewniczak        //no user to sent notifications
52*94db1f40SSzymon Olewniczak        if (!$user) return;
53*94db1f40SSzymon Olewniczak
54*94db1f40SSzymon Olewniczak        //update user last check
55*94db1f40SSzymon Olewniczak        $sqlite->query('UPDATE cron_check SET timestamp=? WHERE user=?',  date('c'), $user);
56*94db1f40SSzymon Olewniczak
57*94db1f40SSzymon Olewniczak        $plugins = [];
58*94db1f40SSzymon Olewniczak        trigger_event('PLUGIN_NOTIFICATION_REGISTER_SOURCE', $plugins);
59*94db1f40SSzymon Olewniczak        $notifications_data = [
60*94db1f40SSzymon Olewniczak            'plugins' => $plugins,
61*94db1f40SSzymon Olewniczak            'user' => $user,
62*94db1f40SSzymon Olewniczak            'notifications' => []
63*94db1f40SSzymon Olewniczak        ];
64*94db1f40SSzymon Olewniczak        trigger_event('PLUGIN_NOTIFICATION_GATHER', $notifications_data);
65*94db1f40SSzymon Olewniczak
66*94db1f40SSzymon Olewniczak        $notifications = $notifications_data['notifications'];
67*94db1f40SSzymon Olewniczak        //no notifications - nothing to sent
68*94db1f40SSzymon Olewniczak        if (!$notifications) return;
69*94db1f40SSzymon Olewniczak
70*94db1f40SSzymon Olewniczak        //get only notifications that has id
71*94db1f40SSzymon Olewniczak        $notifications = array_filter($notifications, function ($notification) {
72*94db1f40SSzymon Olewniczak            return array_key_exists('id', $notification);
73*94db1f40SSzymon Olewniczak        });
74*94db1f40SSzymon Olewniczak        //no notifications - nothing to sent
75*94db1f40SSzymon Olewniczak        if (!$notifications) return;
76*94db1f40SSzymon Olewniczak
77*94db1f40SSzymon Olewniczak        //get the notifications that has been sent already
78*94db1f40SSzymon Olewniczak        $res = $sqlite->query('SELECT plugin, notification_id FROM notification WHERE user=?', $user);
79*94db1f40SSzymon Olewniczak        $sent_notifications = $sqlite->res2arr($res);
80*94db1f40SSzymon Olewniczak        $sent_notifications_by_plugin = [];
81*94db1f40SSzymon Olewniczak        foreach ($plugins as $plugin) {
82*94db1f40SSzymon Olewniczak            $sent_notifications_by_plugin[$plugin] = [];
83*94db1f40SSzymon Olewniczak        }
84*94db1f40SSzymon Olewniczak        foreach ($sent_notifications as $sent_notification) {
85*94db1f40SSzymon Olewniczak            $plugin = $sent_notification['plugin'];
86*94db1f40SSzymon Olewniczak            $id = $sent_notification['notification_id'];
87*94db1f40SSzymon Olewniczak            $sent_notifications_by_plugin[$plugin][$id] = true;
88*94db1f40SSzymon Olewniczak        }
89*94db1f40SSzymon Olewniczak
90*94db1f40SSzymon Olewniczak        $new_notifications = [];
91*94db1f40SSzymon Olewniczak        foreach ($notifications as $notification) {
92*94db1f40SSzymon Olewniczak            $plugin = $notification['plugin'];
93*94db1f40SSzymon Olewniczak            $id = $notification['id'];
94*94db1f40SSzymon Olewniczak            if (!isset($sent_notifications_by_plugin[$plugin][$id])) {
95*94db1f40SSzymon Olewniczak                $new_notifications[] = $notification;
96*94db1f40SSzymon Olewniczak            }
97*94db1f40SSzymon Olewniczak        }
98*94db1f40SSzymon Olewniczak
99*94db1f40SSzymon Olewniczak        //no notifications - nothing to sent
100*94db1f40SSzymon Olewniczak        if (!$new_notifications) return;
101*94db1f40SSzymon Olewniczak
102*94db1f40SSzymon Olewniczak        $html = '<p>' . $this->getLang('mail content');
103*94db1f40SSzymon Olewniczak        $html .= '<ul>';
104*94db1f40SSzymon Olewniczak        $text = $this->getLang('mail content') . "\n\n";
105*94db1f40SSzymon Olewniczak
106*94db1f40SSzymon Olewniczak        usort($new_notifications, function($a, $b) {
107*94db1f40SSzymon Olewniczak            if ($a['timestamp'] == $b['timestamp']) {
108*94db1f40SSzymon Olewniczak                return 0;
109*94db1f40SSzymon Olewniczak            }
110*94db1f40SSzymon Olewniczak            return ($a['timestamp'] > $b['timestamp']) ? -1 : 1;
111*94db1f40SSzymon Olewniczak        });
112*94db1f40SSzymon Olewniczak
113*94db1f40SSzymon Olewniczak        foreach ($new_notifications as $notification) {
114*94db1f40SSzymon Olewniczak            $content = $notification['full'];
115*94db1f40SSzymon Olewniczak            $timestamp = $notification['timestamp'];
116*94db1f40SSzymon Olewniczak
117*94db1f40SSzymon Olewniczak            $date = strftime('%d.%m %H:%M', $timestamp);
118*94db1f40SSzymon Olewniczak
119*94db1f40SSzymon Olewniczak            $html .= "<li class=\"level1\"><div class=\"li\">$date $content</div></li>";
120*94db1f40SSzymon Olewniczak            $text .= $date . ' ' . strip_tags($content). "\n";
121*94db1f40SSzymon Olewniczak        }
122*94db1f40SSzymon Olewniczak        $html .= '</ul></p>';
123*94db1f40SSzymon Olewniczak
124*94db1f40SSzymon Olewniczak        $mail = new Mailer();
125*94db1f40SSzymon Olewniczak        $userinfo = $auth->getUserData($user, $requireGroups = false);
126*94db1f40SSzymon Olewniczak        $mail->to($userinfo['name'].' <'.$userinfo['mail'].'>');
127*94db1f40SSzymon Olewniczak        $mail->subject($this->getLang('mail subject'));
128*94db1f40SSzymon Olewniczak        $mail->setBody($text, null, null, $html);
129*94db1f40SSzymon Olewniczak        $mail->send();
130*94db1f40SSzymon Olewniczak
131*94db1f40SSzymon Olewniczak        //mark notifications as sent
132*94db1f40SSzymon Olewniczak        foreach ($new_notifications as $notification) {
133*94db1f40SSzymon Olewniczak            $plugin = $notification['plugin'];
134*94db1f40SSzymon Olewniczak            $id = $notification['id'];
135*94db1f40SSzymon Olewniczak            $sqlite->storeEntry('notification',
136*94db1f40SSzymon Olewniczak                ['plugin' => $plugin, 'notification_id' => $id, 'user' => $user, 'sent' => date('c')]);
137*94db1f40SSzymon Olewniczak        }
138*94db1f40SSzymon Olewniczak
139*94db1f40SSzymon Olewniczak        $event->stopPropagation();
140*94db1f40SSzymon Olewniczak        $event->preventDefault();
141*94db1f40SSzymon Olewniczak    }
142*94db1f40SSzymon Olewniczak}
143