xref: /plugin/notification/helper/cron.php (revision 6cdebc539ff0654a6c1d30517990fc9fc0a7a4d7)
1fca8ba9fSAnna Dabrowska<?php
2*6cdebc53SAnna Dabrowska
3*6cdebc53SAnna Dabrowskause dokuwiki\Extension\Plugin;
4*6cdebc53SAnna Dabrowskause dokuwiki\Extension\Event;
5*6cdebc53SAnna Dabrowska
6fca8ba9fSAnna Dabrowska/**
7*6cdebc53SAnna Dabrowska * DokuWiki Plugin notification (Helper Component)
8fca8ba9fSAnna Dabrowska *
9fca8ba9fSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
10fca8ba9fSAnna Dabrowska */
11*6cdebc53SAnna Dabrowskaclass helper_plugin_notification_cron extends Plugin
12fca8ba9fSAnna Dabrowska{
13fca8ba9fSAnna Dabrowska    /** @var helper_plugin_sqlite */
14fca8ba9fSAnna Dabrowska    protected $sqlite;
15fca8ba9fSAnna Dabrowska
16fca8ba9fSAnna Dabrowska    public function __construct()
17fca8ba9fSAnna Dabrowska    {
18fca8ba9fSAnna Dabrowska        /** @var \helper_plugin_notification_db $db_helper */
19fca8ba9fSAnna Dabrowska        $db_helper = plugin_load('helper', 'notification_db');
20fca8ba9fSAnna Dabrowska        $this->sqlite = $db_helper->getDB();
21fca8ba9fSAnna Dabrowska    }
22fca8ba9fSAnna Dabrowska
23fca8ba9fSAnna Dabrowska    public function addUsersToCron()
24fca8ba9fSAnna Dabrowska    {
25fca8ba9fSAnna Dabrowska        /** @var DokuWiki_Auth_Plugin $auth */
26fca8ba9fSAnna Dabrowska        global $auth;
27fca8ba9fSAnna Dabrowska
28fca8ba9fSAnna Dabrowska        $res = $this->sqlite->query('SELECT user from cron_check');
29fca8ba9fSAnna Dabrowska        $ourUsers = $this->sqlite->res2arr($res);
30fca8ba9fSAnna Dabrowska
31fca8ba9fSAnna Dabrowska        $ourUsers = array_map(function ($item) {
32fca8ba9fSAnna Dabrowska            return $item['user'];
33fca8ba9fSAnna Dabrowska        }, $ourUsers);
34fca8ba9fSAnna Dabrowska
35fca8ba9fSAnna Dabrowska        $allUsers = array_keys($auth->retrieveUsers());
36fca8ba9fSAnna Dabrowska
37fca8ba9fSAnna Dabrowska        $newUsers = array_diff($allUsers, $ourUsers);
38fca8ba9fSAnna Dabrowska
39*6cdebc53SAnna Dabrowska        if (!is_array($newUsers) || $newUsers === []) return;
40fca8ba9fSAnna Dabrowska
41fca8ba9fSAnna Dabrowska        foreach ($newUsers as $user) {
42*6cdebc53SAnna Dabrowska            $this->sqlite->storeEntry(
43*6cdebc53SAnna Dabrowska                'cron_check',
44*6cdebc53SAnna Dabrowska                ['user' => $user, 'timestamp' => date('c', 0)]
45*6cdebc53SAnna Dabrowska            );
46fca8ba9fSAnna Dabrowska        }
47fca8ba9fSAnna Dabrowska    }
4851157a53SAnna Dabrowska
4951157a53SAnna Dabrowska    /**
5051157a53SAnna Dabrowska     * Gather notification data from plugins
5151157a53SAnna Dabrowska     *
5251157a53SAnna Dabrowska     * @param string $user
5351157a53SAnna Dabrowska     * @return array
5451157a53SAnna Dabrowska     */
5551157a53SAnna Dabrowska    public function getNotificationData($user)
5651157a53SAnna Dabrowska    {
5751157a53SAnna Dabrowska        $plugins = [];
58*6cdebc53SAnna Dabrowska        $event = new Event('PLUGIN_NOTIFICATION_REGISTER_SOURCE', $plugins);
5951157a53SAnna Dabrowska        $event->trigger();
60*6cdebc53SAnna Dabrowska
6151157a53SAnna Dabrowska        $notifications_data = [
6251157a53SAnna Dabrowska            'plugins' => $plugins,
6351157a53SAnna Dabrowska            'user' => $user,
6451157a53SAnna Dabrowska            'notifications' => []
6551157a53SAnna Dabrowska        ];
66*6cdebc53SAnna Dabrowska        $event = new Event('PLUGIN_NOTIFICATION_GATHER', $notifications_data);
6751157a53SAnna Dabrowska        $event->trigger();
6851157a53SAnna Dabrowska
6951157a53SAnna Dabrowska        if (!empty($notifications_data['notifications'])) {
7051157a53SAnna Dabrowska            $notifications = $notifications_data['notifications'];
7151157a53SAnna Dabrowska
7251157a53SAnna Dabrowska            // get only notifications that have ids
7351157a53SAnna Dabrowska            $notifications_data['notifications'] = array_filter($notifications, function ($notification) {
7451157a53SAnna Dabrowska                return array_key_exists('id', $notification);
7551157a53SAnna Dabrowska            });
7651157a53SAnna Dabrowska        }
7751157a53SAnna Dabrowska
7851157a53SAnna Dabrowska        return $notifications_data;
7951157a53SAnna Dabrowska    }
8051157a53SAnna Dabrowska
8151157a53SAnna Dabrowska    /**
8251157a53SAnna Dabrowska     * Prune old (already sent) notifications and return only new ones
8351157a53SAnna Dabrowska     *
8451157a53SAnna Dabrowska     * @param string $user
8551157a53SAnna Dabrowska     * @param array $notification_data
8651157a53SAnna Dabrowska     * @return array
8751157a53SAnna Dabrowska     */
8851157a53SAnna Dabrowska    public function getNewNotifications($user, $notification_data)
8951157a53SAnna Dabrowska    {
9051157a53SAnna Dabrowska        /** @var \helper_plugin_notification_db $db_helper */
9151157a53SAnna Dabrowska        $db_helper = plugin_load('helper', 'notification_db');
9251157a53SAnna Dabrowska        $sqlite = $db_helper->getDB();
9351157a53SAnna Dabrowska
9451157a53SAnna Dabrowska        $notifications = $notification_data['notifications'];
9551157a53SAnna Dabrowska        $plugins = $notification_data['plugins'];
9651157a53SAnna Dabrowska
9751157a53SAnna Dabrowska        //get the notifications that have been sent already
9851157a53SAnna Dabrowska        $res = $sqlite->query('SELECT plugin, notification_id FROM notification WHERE user=?', $user);
9951157a53SAnna Dabrowska        $sent_notifications = $sqlite->res2arr($res);
10051157a53SAnna Dabrowska        $sent_notifications_by_plugin = [];
10151157a53SAnna Dabrowska        foreach ($plugins as $plugin) {
10251157a53SAnna Dabrowska            $sent_notifications_by_plugin[$plugin] = [];
10351157a53SAnna Dabrowska        }
10451157a53SAnna Dabrowska        foreach ($sent_notifications as $sent_notification) {
10551157a53SAnna Dabrowska            $plugin = $sent_notification['plugin'];
10651157a53SAnna Dabrowska            $id = $sent_notification['notification_id'];
10751157a53SAnna Dabrowska            $sent_notifications_by_plugin[$plugin][$id] = true;
10851157a53SAnna Dabrowska        }
10951157a53SAnna Dabrowska
11051157a53SAnna Dabrowska        // keep only notifications not yet sent
11151157a53SAnna Dabrowska        $new_notifications = [];
11251157a53SAnna Dabrowska        foreach ($notifications as $notification) {
11351157a53SAnna Dabrowska            $plugin = $notification['plugin'];
11451157a53SAnna Dabrowska            $id = $notification['id'];
11551157a53SAnna Dabrowska            if (!isset($sent_notifications_by_plugin[$plugin][$id])) {
11651157a53SAnna Dabrowska                $new_notifications[] = $notification;
11751157a53SAnna Dabrowska            }
11851157a53SAnna Dabrowska        }
11951157a53SAnna Dabrowska
12051157a53SAnna Dabrowska        return $new_notifications;
12151157a53SAnna Dabrowska    }
12251157a53SAnna Dabrowska
12351157a53SAnna Dabrowska    /**
12451157a53SAnna Dabrowska     * Create text and HTML components of email message
12551157a53SAnna Dabrowska     *
12651157a53SAnna Dabrowska     * @param array $new_notifications
12751157a53SAnna Dabrowska     * @return string[]
12851157a53SAnna Dabrowska     */
12951157a53SAnna Dabrowska    public function composeEmail($new_notifications)
13051157a53SAnna Dabrowska    {
13151157a53SAnna Dabrowska        $html = '<p>' . $this->getLang('mail content') . '</p>';
13251157a53SAnna Dabrowska        $html .= '<ul>';
13351157a53SAnna Dabrowska        $text = $this->getLang('mail content') . "\n\n";
13451157a53SAnna Dabrowska
13551157a53SAnna Dabrowska        usort($new_notifications, function ($a, $b) {
13651157a53SAnna Dabrowska            if ($a['timestamp'] == $b['timestamp']) {
13751157a53SAnna Dabrowska                return 0;
13851157a53SAnna Dabrowska            }
13951157a53SAnna Dabrowska            return ($a['timestamp'] > $b['timestamp']) ? -1 : 1;
14051157a53SAnna Dabrowska        });
14151157a53SAnna Dabrowska
14251157a53SAnna Dabrowska        foreach ($new_notifications as $notification) {
14351157a53SAnna Dabrowska            $content = $notification['full'];
14451157a53SAnna Dabrowska            $timestamp = $notification['timestamp'];
14551157a53SAnna Dabrowska
14651157a53SAnna Dabrowska            $date = strftime('%d.%m %H:%M', $timestamp);
14751157a53SAnna Dabrowska
14851157a53SAnna Dabrowska            $html .= "<li class=\"level1\"><div class=\"li\">$date $content</div></li>";
14951157a53SAnna Dabrowska            $text .= $date . ' ' . strip_tags($content) . "\n";
15051157a53SAnna Dabrowska        }
15151157a53SAnna Dabrowska        $html .= '</ul>';
15251157a53SAnna Dabrowska
15351157a53SAnna Dabrowska        return [$text, $html];
15451157a53SAnna Dabrowska    }
15551157a53SAnna Dabrowska
15651157a53SAnna Dabrowska    /**
15751157a53SAnna Dabrowska     * Send notification email to the given user
15851157a53SAnna Dabrowska     *
15951157a53SAnna Dabrowska     * @param string $user
16051157a53SAnna Dabrowska     * @param string $text
16151157a53SAnna Dabrowska     * @param string $html
16251157a53SAnna Dabrowska     * @return bool true if email was sent successfully
16351157a53SAnna Dabrowska     */
16451157a53SAnna Dabrowska    public function sendMail($user, $text, $html)
16551157a53SAnna Dabrowska    {
16651157a53SAnna Dabrowska        /** @var DokuWiki_Auth_Plugin $auth */
16751157a53SAnna Dabrowska        global $auth;
16851157a53SAnna Dabrowska
16951157a53SAnna Dabrowska        $mail = new Mailer();
17051157a53SAnna Dabrowska        $userinfo = $auth->getUserData($user, false);
17151157a53SAnna Dabrowska        $mail->to($userinfo['name'] . ' <' . $userinfo['mail'] . '>');
17251157a53SAnna Dabrowska        $mail->subject($this->getLang('mail subject'));
17351157a53SAnna Dabrowska        $mail->setBody($text, null, null, $html);
17451157a53SAnna Dabrowska        return $mail->send();
17551157a53SAnna Dabrowska    }
17651157a53SAnna Dabrowska
17751157a53SAnna Dabrowska    /**
17851157a53SAnna Dabrowska     * Store info about sent notifications
17951157a53SAnna Dabrowska     *
18051157a53SAnna Dabrowska     * @param string $user
18151157a53SAnna Dabrowska     * @param array $notifications
18251157a53SAnna Dabrowska     */
18351157a53SAnna Dabrowska    public function storeSentNotifications($user, $notifications)
18451157a53SAnna Dabrowska    {
18551157a53SAnna Dabrowska        /** @var \helper_plugin_notification_db $db_helper */
18651157a53SAnna Dabrowska        $db_helper = plugin_load('helper', 'notification_db');
18751157a53SAnna Dabrowska        $sqlite = $db_helper->getDB();
18851157a53SAnna Dabrowska
18951157a53SAnna Dabrowska        foreach ($notifications as $notification) {
19051157a53SAnna Dabrowska            $plugin = $notification['plugin'];
19151157a53SAnna Dabrowska            $id = $notification['id'];
192*6cdebc53SAnna Dabrowska            $sqlite->storeEntry(
193*6cdebc53SAnna Dabrowska                'notification',
194*6cdebc53SAnna Dabrowska                ['plugin' => $plugin, 'notification_id' => $id, 'user' => $user, 'sent' => date('c')]
195*6cdebc53SAnna Dabrowska            );
19651157a53SAnna Dabrowska        }
19751157a53SAnna Dabrowska    }
198fca8ba9fSAnna Dabrowska}
199