xref: /plugin/notification/action/cron.php (revision fca8ba9f117c37048eed918b64bd11e705248fbd)
194db1f40SSzymon Olewniczak<?php
294db1f40SSzymon Olewniczak
394db1f40SSzymon Olewniczak/**
494db1f40SSzymon Olewniczak * DokuWiki Plugin notification (Action Component)
594db1f40SSzymon Olewniczak *
694db1f40SSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
794db1f40SSzymon Olewniczak * @author  Szymon Olewniczak <it@rid.pl>
894db1f40SSzymon Olewniczak */
994db1f40SSzymon Olewniczak
1094db1f40SSzymon Olewniczak// must be run within Dokuwiki
1194db1f40SSzymon Olewniczakif (!defined('DOKU_INC')) {
1294db1f40SSzymon Olewniczak    die();
1394db1f40SSzymon Olewniczak}
1494db1f40SSzymon Olewniczak
1594db1f40SSzymon Olewniczakclass action_plugin_notification_cron extends DokuWiki_Action_Plugin
1694db1f40SSzymon Olewniczak{
1794db1f40SSzymon Olewniczak
1894db1f40SSzymon Olewniczak    /**
1994db1f40SSzymon Olewniczak     * Registers a callback function for a given event
2094db1f40SSzymon Olewniczak     *
2194db1f40SSzymon Olewniczak     * @param Doku_Event_Handler $controller DokuWiki's event controller object
2294db1f40SSzymon Olewniczak     *
2394db1f40SSzymon Olewniczak     * @return void
2494db1f40SSzymon Olewniczak     */
2594db1f40SSzymon Olewniczak    public function register(Doku_Event_Handler $controller)
2694db1f40SSzymon Olewniczak    {
2794db1f40SSzymon Olewniczak        $controller->register_hook('INDEXER_TASKS_RUN', 'AFTER', $this, 'handle_indexer_tasks_run');
2894db1f40SSzymon Olewniczak    }
2994db1f40SSzymon Olewniczak
3094db1f40SSzymon Olewniczak    /**
3194db1f40SSzymon Olewniczak     *
3294db1f40SSzymon Olewniczak     * @param Doku_Event $event  event object by reference
3394db1f40SSzymon Olewniczak     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
3494db1f40SSzymon Olewniczak     *                           handler was registered]
3594db1f40SSzymon Olewniczak     *
3694db1f40SSzymon Olewniczak     * @return void
3794db1f40SSzymon Olewniczak     */
3894db1f40SSzymon Olewniczak    public function handle_indexer_tasks_run(Doku_Event $event, $param)
3994db1f40SSzymon Olewniczak    {
4094db1f40SSzymon Olewniczak        /** @var DokuWiki_Auth_Plugin $auth */
4194db1f40SSzymon Olewniczak        global $auth;
4294db1f40SSzymon Olewniczak
4394db1f40SSzymon Olewniczak        /** @var \helper_plugin_notification_db $db_helper */
4494db1f40SSzymon Olewniczak        $db_helper = plugin_load('helper', 'notification_db');
4594db1f40SSzymon Olewniczak        $sqlite = $db_helper->getDB();
4694db1f40SSzymon Olewniczak
47*fca8ba9fSAnna Dabrowska        // insert new users first
48*fca8ba9fSAnna Dabrowska        /** @var \helper_plugin_notification_cron $cron_helper */
49*fca8ba9fSAnna Dabrowska        $cron_helper = plugin_load('helper', 'notification_cron');
50*fca8ba9fSAnna Dabrowska        $cron_helper->addUsersToCron();
51*fca8ba9fSAnna Dabrowska
5294db1f40SSzymon Olewniczak
5394db1f40SSzymon Olewniczak        //get the oldest check
5494db1f40SSzymon Olewniczak        $res = $sqlite->query('SELECT user, MIN(timestamp) FROM cron_check');
5594db1f40SSzymon Olewniczak        $user = $sqlite->res2single($res);
5694db1f40SSzymon Olewniczak        //no user to sent notifications
5794db1f40SSzymon Olewniczak        if (!$user) return;
5894db1f40SSzymon Olewniczak
5994db1f40SSzymon Olewniczak        //update user last check
6094db1f40SSzymon Olewniczak        $sqlite->query('UPDATE cron_check SET timestamp=? WHERE user=?',  date('c'), $user);
6194db1f40SSzymon Olewniczak
6294db1f40SSzymon Olewniczak        $plugins = [];
6394db1f40SSzymon Olewniczak        trigger_event('PLUGIN_NOTIFICATION_REGISTER_SOURCE', $plugins);
6494db1f40SSzymon Olewniczak        $notifications_data = [
6594db1f40SSzymon Olewniczak            'plugins' => $plugins,
6694db1f40SSzymon Olewniczak            'user' => $user,
6794db1f40SSzymon Olewniczak            'notifications' => []
6894db1f40SSzymon Olewniczak        ];
6994db1f40SSzymon Olewniczak        trigger_event('PLUGIN_NOTIFICATION_GATHER', $notifications_data);
7094db1f40SSzymon Olewniczak
7194db1f40SSzymon Olewniczak        $notifications = $notifications_data['notifications'];
7294db1f40SSzymon Olewniczak        //no notifications - nothing to sent
7394db1f40SSzymon Olewniczak        if (!$notifications) return;
7494db1f40SSzymon Olewniczak
7594db1f40SSzymon Olewniczak        //get only notifications that has id
7694db1f40SSzymon Olewniczak        $notifications = array_filter($notifications, function ($notification) {
7794db1f40SSzymon Olewniczak            return array_key_exists('id', $notification);
7894db1f40SSzymon Olewniczak        });
7994db1f40SSzymon Olewniczak        //no notifications - nothing to sent
8094db1f40SSzymon Olewniczak        if (!$notifications) return;
8194db1f40SSzymon Olewniczak
8294db1f40SSzymon Olewniczak        //get the notifications that has been sent already
8394db1f40SSzymon Olewniczak        $res = $sqlite->query('SELECT plugin, notification_id FROM notification WHERE user=?', $user);
8494db1f40SSzymon Olewniczak        $sent_notifications = $sqlite->res2arr($res);
8594db1f40SSzymon Olewniczak        $sent_notifications_by_plugin = [];
8694db1f40SSzymon Olewniczak        foreach ($plugins as $plugin) {
8794db1f40SSzymon Olewniczak            $sent_notifications_by_plugin[$plugin] = [];
8894db1f40SSzymon Olewniczak        }
8994db1f40SSzymon Olewniczak        foreach ($sent_notifications as $sent_notification) {
9094db1f40SSzymon Olewniczak            $plugin = $sent_notification['plugin'];
9194db1f40SSzymon Olewniczak            $id = $sent_notification['notification_id'];
9294db1f40SSzymon Olewniczak            $sent_notifications_by_plugin[$plugin][$id] = true;
9394db1f40SSzymon Olewniczak        }
9494db1f40SSzymon Olewniczak
9594db1f40SSzymon Olewniczak        $new_notifications = [];
9694db1f40SSzymon Olewniczak        foreach ($notifications as $notification) {
9794db1f40SSzymon Olewniczak            $plugin = $notification['plugin'];
9894db1f40SSzymon Olewniczak            $id = $notification['id'];
9994db1f40SSzymon Olewniczak            if (!isset($sent_notifications_by_plugin[$plugin][$id])) {
10094db1f40SSzymon Olewniczak                $new_notifications[] = $notification;
10194db1f40SSzymon Olewniczak            }
10294db1f40SSzymon Olewniczak        }
10394db1f40SSzymon Olewniczak
10494db1f40SSzymon Olewniczak        //no notifications - nothing to sent
10594db1f40SSzymon Olewniczak        if (!$new_notifications) return;
10694db1f40SSzymon Olewniczak
10794db1f40SSzymon Olewniczak        $html = '<p>' . $this->getLang('mail content');
10894db1f40SSzymon Olewniczak        $html .= '<ul>';
10994db1f40SSzymon Olewniczak        $text = $this->getLang('mail content') . "\n\n";
11094db1f40SSzymon Olewniczak
11194db1f40SSzymon Olewniczak        usort($new_notifications, function($a, $b) {
11294db1f40SSzymon Olewniczak            if ($a['timestamp'] == $b['timestamp']) {
11394db1f40SSzymon Olewniczak                return 0;
11494db1f40SSzymon Olewniczak            }
11594db1f40SSzymon Olewniczak            return ($a['timestamp'] > $b['timestamp']) ? -1 : 1;
11694db1f40SSzymon Olewniczak        });
11794db1f40SSzymon Olewniczak
11894db1f40SSzymon Olewniczak        foreach ($new_notifications as $notification) {
11994db1f40SSzymon Olewniczak            $content = $notification['full'];
12094db1f40SSzymon Olewniczak            $timestamp = $notification['timestamp'];
12194db1f40SSzymon Olewniczak
12294db1f40SSzymon Olewniczak            $date = strftime('%d.%m %H:%M', $timestamp);
12394db1f40SSzymon Olewniczak
12494db1f40SSzymon Olewniczak            $html .= "<li class=\"level1\"><div class=\"li\">$date $content</div></li>";
12594db1f40SSzymon Olewniczak            $text .= $date . ' ' . strip_tags($content). "\n";
12694db1f40SSzymon Olewniczak        }
12794db1f40SSzymon Olewniczak        $html .= '</ul></p>';
12894db1f40SSzymon Olewniczak
12994db1f40SSzymon Olewniczak        $mail = new Mailer();
13094db1f40SSzymon Olewniczak        $userinfo = $auth->getUserData($user, $requireGroups = false);
13194db1f40SSzymon Olewniczak        $mail->to($userinfo['name'].' <'.$userinfo['mail'].'>');
13294db1f40SSzymon Olewniczak        $mail->subject($this->getLang('mail subject'));
13394db1f40SSzymon Olewniczak        $mail->setBody($text, null, null, $html);
13494db1f40SSzymon Olewniczak        $mail->send();
13594db1f40SSzymon Olewniczak
13694db1f40SSzymon Olewniczak        //mark notifications as sent
13794db1f40SSzymon Olewniczak        foreach ($new_notifications as $notification) {
13894db1f40SSzymon Olewniczak            $plugin = $notification['plugin'];
13994db1f40SSzymon Olewniczak            $id = $notification['id'];
14094db1f40SSzymon Olewniczak            $sqlite->storeEntry('notification',
14194db1f40SSzymon Olewniczak                ['plugin' => $plugin, 'notification_id' => $id, 'user' => $user, 'sent' => date('c')]);
14294db1f40SSzymon Olewniczak        }
14394db1f40SSzymon Olewniczak
14494db1f40SSzymon Olewniczak        $event->stopPropagation();
14594db1f40SSzymon Olewniczak        $event->preventDefault();
14694db1f40SSzymon Olewniczak    }
14794db1f40SSzymon Olewniczak}
148