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