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