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