xref: /plugin/notification/helper/cron.php (revision 51157a531472d6d2a6f7e37d218dcffecfc1ac35)
1fca8ba9fSAnna Dabrowska<?php
2fca8ba9fSAnna Dabrowska/**
3fca8ba9fSAnna Dabrowska * DokuWiki Plugin watchcycle (Helper Component)
4fca8ba9fSAnna Dabrowska *
5fca8ba9fSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6fca8ba9fSAnna Dabrowska */
7fca8ba9fSAnna Dabrowska
8fca8ba9fSAnna Dabrowskaclass helper_plugin_notification_cron extends DokuWiki_Plugin
9fca8ba9fSAnna Dabrowska{
10fca8ba9fSAnna Dabrowska    /** @var helper_plugin_sqlite */
11fca8ba9fSAnna Dabrowska    protected $sqlite;
12fca8ba9fSAnna Dabrowska
13fca8ba9fSAnna Dabrowska    public function __construct()
14fca8ba9fSAnna Dabrowska    {
15fca8ba9fSAnna Dabrowska        /** @var \helper_plugin_notification_db $db_helper */
16fca8ba9fSAnna Dabrowska        $db_helper = plugin_load('helper', 'notification_db');
17fca8ba9fSAnna Dabrowska        $this->sqlite = $db_helper->getDB();
18fca8ba9fSAnna Dabrowska    }
19fca8ba9fSAnna Dabrowska
20fca8ba9fSAnna Dabrowska    public function addUsersToCron()
21fca8ba9fSAnna Dabrowska    {
22fca8ba9fSAnna Dabrowska        /** @var DokuWiki_Auth_Plugin $auth */
23fca8ba9fSAnna Dabrowska        global $auth;
24fca8ba9fSAnna Dabrowska
25fca8ba9fSAnna Dabrowska        $res = $this->sqlite->query('SELECT user from cron_check');
26fca8ba9fSAnna Dabrowska        $ourUsers = $this->sqlite->res2arr($res);
27fca8ba9fSAnna Dabrowska
28fca8ba9fSAnna Dabrowska        $ourUsers = array_map(function ($item) {
29fca8ba9fSAnna Dabrowska            return $item['user'];
30fca8ba9fSAnna Dabrowska        }, $ourUsers);
31fca8ba9fSAnna Dabrowska
32fca8ba9fSAnna Dabrowska        $allUsers = array_keys($auth->retrieveUsers());
33fca8ba9fSAnna Dabrowska
34fca8ba9fSAnna Dabrowska        $newUsers = array_diff($allUsers, $ourUsers);
35fca8ba9fSAnna Dabrowska
36fca8ba9fSAnna Dabrowska        if (!is_array($newUsers) || empty($newUsers)) return;
37fca8ba9fSAnna Dabrowska
38fca8ba9fSAnna Dabrowska        foreach ($newUsers as $user) {
39fca8ba9fSAnna Dabrowska            $this->sqlite->storeEntry('cron_check',
40fca8ba9fSAnna Dabrowska                ['user' => $user, 'timestamp' => date('c', 0)]);
41fca8ba9fSAnna Dabrowska        }
42fca8ba9fSAnna Dabrowska    }
43*51157a53SAnna Dabrowska
44*51157a53SAnna Dabrowska    /**
45*51157a53SAnna Dabrowska     * Gather notification data from plugins
46*51157a53SAnna Dabrowska     *
47*51157a53SAnna Dabrowska     * @param string $user
48*51157a53SAnna Dabrowska     * @return array
49*51157a53SAnna Dabrowska     */
50*51157a53SAnna Dabrowska    public function getNotificationData($user)
51*51157a53SAnna Dabrowska    {
52*51157a53SAnna Dabrowska        $plugins = [];
53*51157a53SAnna Dabrowska        $event = new Doku_Event('PLUGIN_NOTIFICATION_REGISTER_SOURCE', $plugins);
54*51157a53SAnna Dabrowska        $event->trigger();
55*51157a53SAnna Dabrowska        $notifications_data = [
56*51157a53SAnna Dabrowska            'plugins' => $plugins,
57*51157a53SAnna Dabrowska            'user' => $user,
58*51157a53SAnna Dabrowska            'notifications' => []
59*51157a53SAnna Dabrowska        ];
60*51157a53SAnna Dabrowska        $event = new Doku_Event('PLUGIN_NOTIFICATION_GATHER', $notifications_data);
61*51157a53SAnna Dabrowska        $event->trigger();
62*51157a53SAnna Dabrowska
63*51157a53SAnna Dabrowska        if (!empty($notifications_data['notifications'])) {
64*51157a53SAnna Dabrowska            $notifications = $notifications_data['notifications'];
65*51157a53SAnna Dabrowska
66*51157a53SAnna Dabrowska            // get only notifications that have ids
67*51157a53SAnna Dabrowska            $notifications_data['notifications'] = array_filter($notifications, function ($notification) {
68*51157a53SAnna Dabrowska                return array_key_exists('id', $notification);
69*51157a53SAnna Dabrowska            });
70*51157a53SAnna Dabrowska        }
71*51157a53SAnna Dabrowska
72*51157a53SAnna Dabrowska        return $notifications_data;
73*51157a53SAnna Dabrowska    }
74*51157a53SAnna Dabrowska
75*51157a53SAnna Dabrowska    /**
76*51157a53SAnna Dabrowska     * Prune old (already sent) notifications and return only new ones
77*51157a53SAnna Dabrowska     *
78*51157a53SAnna Dabrowska     * @param string $user
79*51157a53SAnna Dabrowska     * @param array $notification_data
80*51157a53SAnna Dabrowska     * @return array
81*51157a53SAnna Dabrowska     */
82*51157a53SAnna Dabrowska    public function getNewNotifications($user, $notification_data)
83*51157a53SAnna Dabrowska    {
84*51157a53SAnna Dabrowska        /** @var \helper_plugin_notification_db $db_helper */
85*51157a53SAnna Dabrowska        $db_helper = plugin_load('helper', 'notification_db');
86*51157a53SAnna Dabrowska        $sqlite = $db_helper->getDB();
87*51157a53SAnna Dabrowska
88*51157a53SAnna Dabrowska        $notifications = $notification_data['notifications'];
89*51157a53SAnna Dabrowska        $plugins = $notification_data['plugins'];
90*51157a53SAnna Dabrowska
91*51157a53SAnna Dabrowska        //get the notifications that have been sent already
92*51157a53SAnna Dabrowska        $res = $sqlite->query('SELECT plugin, notification_id FROM notification WHERE user=?', $user);
93*51157a53SAnna Dabrowska        $sent_notifications = $sqlite->res2arr($res);
94*51157a53SAnna Dabrowska        $sent_notifications_by_plugin = [];
95*51157a53SAnna Dabrowska        foreach ($plugins as $plugin) {
96*51157a53SAnna Dabrowska            $sent_notifications_by_plugin[$plugin] = [];
97*51157a53SAnna Dabrowska        }
98*51157a53SAnna Dabrowska        foreach ($sent_notifications as $sent_notification) {
99*51157a53SAnna Dabrowska            $plugin = $sent_notification['plugin'];
100*51157a53SAnna Dabrowska            $id = $sent_notification['notification_id'];
101*51157a53SAnna Dabrowska            $sent_notifications_by_plugin[$plugin][$id] = true;
102*51157a53SAnna Dabrowska        }
103*51157a53SAnna Dabrowska
104*51157a53SAnna Dabrowska        // keep only notifications not yet sent
105*51157a53SAnna Dabrowska        $new_notifications = [];
106*51157a53SAnna Dabrowska        foreach ($notifications as $notification) {
107*51157a53SAnna Dabrowska            $plugin = $notification['plugin'];
108*51157a53SAnna Dabrowska            $id = $notification['id'];
109*51157a53SAnna Dabrowska            if (!isset($sent_notifications_by_plugin[$plugin][$id])) {
110*51157a53SAnna Dabrowska                $new_notifications[] = $notification;
111*51157a53SAnna Dabrowska            }
112*51157a53SAnna Dabrowska        }
113*51157a53SAnna Dabrowska
114*51157a53SAnna Dabrowska        return $new_notifications;
115*51157a53SAnna Dabrowska    }
116*51157a53SAnna Dabrowska
117*51157a53SAnna Dabrowska    /**
118*51157a53SAnna Dabrowska     * Create text and HTML components of email message
119*51157a53SAnna Dabrowska     *
120*51157a53SAnna Dabrowska     * @param array $new_notifications
121*51157a53SAnna Dabrowska     * @return string[]
122*51157a53SAnna Dabrowska     */
123*51157a53SAnna Dabrowska    public function composeEmail($new_notifications)
124*51157a53SAnna Dabrowska    {
125*51157a53SAnna Dabrowska        $html = '<p>' . $this->getLang('mail content') . '</p>';
126*51157a53SAnna Dabrowska        $html .= '<ul>';
127*51157a53SAnna Dabrowska        $text = $this->getLang('mail content') . "\n\n";
128*51157a53SAnna Dabrowska
129*51157a53SAnna Dabrowska        usort($new_notifications, function($a, $b) {
130*51157a53SAnna Dabrowska            if ($a['timestamp'] == $b['timestamp']) {
131*51157a53SAnna Dabrowska                return 0;
132*51157a53SAnna Dabrowska            }
133*51157a53SAnna Dabrowska            return ($a['timestamp'] > $b['timestamp']) ? -1 : 1;
134*51157a53SAnna Dabrowska        });
135*51157a53SAnna Dabrowska
136*51157a53SAnna Dabrowska        foreach ($new_notifications as $notification) {
137*51157a53SAnna Dabrowska            $content = $notification['full'];
138*51157a53SAnna Dabrowska            $timestamp = $notification['timestamp'];
139*51157a53SAnna Dabrowska
140*51157a53SAnna Dabrowska            $date = strftime('%d.%m %H:%M', $timestamp);
141*51157a53SAnna Dabrowska
142*51157a53SAnna Dabrowska            $html .= "<li class=\"level1\"><div class=\"li\">$date $content</div></li>";
143*51157a53SAnna Dabrowska            $text .= $date . ' ' . strip_tags($content). "\n";
144*51157a53SAnna Dabrowska        }
145*51157a53SAnna Dabrowska        $html .= '</ul>';
146*51157a53SAnna Dabrowska
147*51157a53SAnna Dabrowska        return [$text, $html];
148*51157a53SAnna Dabrowska    }
149*51157a53SAnna Dabrowska
150*51157a53SAnna Dabrowska    /**
151*51157a53SAnna Dabrowska     * Send notification email to the given user
152*51157a53SAnna Dabrowska     *
153*51157a53SAnna Dabrowska     * @param string $user
154*51157a53SAnna Dabrowska     * @param string $text
155*51157a53SAnna Dabrowska     * @param string $html
156*51157a53SAnna Dabrowska     * @return bool true if email was sent successfully
157*51157a53SAnna Dabrowska     */
158*51157a53SAnna Dabrowska    public function sendMail($user, $text, $html)
159*51157a53SAnna Dabrowska    {
160*51157a53SAnna Dabrowska        /** @var DokuWiki_Auth_Plugin $auth */
161*51157a53SAnna Dabrowska        global $auth;
162*51157a53SAnna Dabrowska
163*51157a53SAnna Dabrowska        $mail = new Mailer();
164*51157a53SAnna Dabrowska        $userinfo = $auth->getUserData($user, false);
165*51157a53SAnna Dabrowska        $mail->to($userinfo['name'].' <'.$userinfo['mail'].'>');
166*51157a53SAnna Dabrowska        $mail->subject($this->getLang('mail subject'));
167*51157a53SAnna Dabrowska        $mail->setBody($text, null, null, $html);
168*51157a53SAnna Dabrowska        return $mail->send();
169*51157a53SAnna Dabrowska    }
170*51157a53SAnna Dabrowska
171*51157a53SAnna Dabrowska    /**
172*51157a53SAnna Dabrowska     * Store info about sent notifications
173*51157a53SAnna Dabrowska     *
174*51157a53SAnna Dabrowska     * @param string $user
175*51157a53SAnna Dabrowska     * @param array $notifications
176*51157a53SAnna Dabrowska     */
177*51157a53SAnna Dabrowska    public function storeSentNotifications($user, $notifications)
178*51157a53SAnna Dabrowska    {
179*51157a53SAnna Dabrowska        // FIXME refactor
180*51157a53SAnna Dabrowska        /** @var \helper_plugin_notification_db $db_helper */
181*51157a53SAnna Dabrowska        $db_helper = plugin_load('helper', 'notification_db');
182*51157a53SAnna Dabrowska        $sqlite = $db_helper->getDB();
183*51157a53SAnna Dabrowska
184*51157a53SAnna Dabrowska        foreach ($notifications as $notification) {
185*51157a53SAnna Dabrowska            $plugin = $notification['plugin'];
186*51157a53SAnna Dabrowska            $id = $notification['id'];
187*51157a53SAnna Dabrowska            $sqlite->storeEntry('notification',
188*51157a53SAnna Dabrowska                ['plugin' => $plugin, 'notification_id' => $id, 'user' => $user, 'sent' => date('c')]);
189*51157a53SAnna Dabrowska        }
190*51157a53SAnna Dabrowska    }
191fca8ba9fSAnna Dabrowska}
192