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