1*4bf952c9SAnna Dabrowska<?php 2*4bf952c9SAnna Dabrowska 3*4bf952c9SAnna Dabrowska/** 4*4bf952c9SAnna Dabrowska * DokuWiki Plugin acknowledge (Notification Action Component) 5*4bf952c9SAnna Dabrowska * 6*4bf952c9SAnna Dabrowska * Integration with the notification plugin. 7*4bf952c9SAnna Dabrowska * 8*4bf952c9SAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 9*4bf952c9SAnna Dabrowska * @author Anna Dabrowska <dokuwiki@cosmocode.de> 10*4bf952c9SAnna Dabrowska */ 11*4bf952c9SAnna Dabrowska 12*4bf952c9SAnna Dabrowskause dokuwiki\Extension\ActionPlugin; 13*4bf952c9SAnna Dabrowskause dokuwiki\Extension\EventHandler; 14*4bf952c9SAnna Dabrowskause dokuwiki\Extension\Event; 15*4bf952c9SAnna Dabrowskause dokuwiki\Extension\AuthPlugin; 16*4bf952c9SAnna Dabrowska 17*4bf952c9SAnna Dabrowskaclass action_plugin_acknowledge_notification extends ActionPlugin 18*4bf952c9SAnna Dabrowska{ 19*4bf952c9SAnna Dabrowska /** @inheritDoc */ 20*4bf952c9SAnna Dabrowska public function register(EventHandler $controller) 21*4bf952c9SAnna Dabrowska { 22*4bf952c9SAnna Dabrowska $controller->register_hook('PLUGIN_NOTIFICATION_REGISTER_SOURCE', 'AFTER', $this, 'registerSource'); 23*4bf952c9SAnna Dabrowska $controller->register_hook('PLUGIN_NOTIFICATION_GATHER', 'AFTER', $this, 'gatherNotifications'); 24*4bf952c9SAnna Dabrowska $controller->register_hook('PLUGIN_NOTIFICATION_CACHE_DEPENDENCIES', 'AFTER', $this, 'cacheDependencies'); 25*4bf952c9SAnna Dabrowska } 26*4bf952c9SAnna Dabrowska 27*4bf952c9SAnna Dabrowska /** 28*4bf952c9SAnna Dabrowska * Announce acknowledge as a notification source. 29*4bf952c9SAnna Dabrowska * 30*4bf952c9SAnna Dabrowska * @param Event $event PLUGIN_NOTIFICATION_REGISTER_SOURCE 31*4bf952c9SAnna Dabrowska * @return void 32*4bf952c9SAnna Dabrowska */ 33*4bf952c9SAnna Dabrowska public function registerSource(Event $event) 34*4bf952c9SAnna Dabrowska { 35*4bf952c9SAnna Dabrowska if (!$this->getConf('notification_integration')) return; 36*4bf952c9SAnna Dabrowska $event->data[] = 'acknowledge'; 37*4bf952c9SAnna Dabrowska } 38*4bf952c9SAnna Dabrowska 39*4bf952c9SAnna Dabrowska /** 40*4bf952c9SAnna Dabrowska * Gather pending acknowledgements for the given user. 41*4bf952c9SAnna Dabrowska * 42*4bf952c9SAnna Dabrowska * @param Event $event PLUGIN_NOTIFICATION_GATHER 43*4bf952c9SAnna Dabrowska * @return void 44*4bf952c9SAnna Dabrowska */ 45*4bf952c9SAnna Dabrowska public function gatherNotifications(Event $event) 46*4bf952c9SAnna Dabrowska { 47*4bf952c9SAnna Dabrowska if (!$this->getConf('notification_integration')) return; 48*4bf952c9SAnna Dabrowska if (!in_array('acknowledge', $event->data['plugins'])) return; 49*4bf952c9SAnna Dabrowska 50*4bf952c9SAnna Dabrowska /** @var AuthPlugin $auth */ 51*4bf952c9SAnna Dabrowska global $auth; 52*4bf952c9SAnna Dabrowska 53*4bf952c9SAnna Dabrowska // resolve the target user's groups from auth (cron runs need this) 54*4bf952c9SAnna Dabrowska $user = $event->data['user']; 55*4bf952c9SAnna Dabrowska $userData = $auth->getUserData($user); 56*4bf952c9SAnna Dabrowska if ($userData === false) return; 57*4bf952c9SAnna Dabrowska $groups = $userData['grps'] ?? []; 58*4bf952c9SAnna Dabrowska 59*4bf952c9SAnna Dabrowska /** @var helper_plugin_acknowledge $helper */ 60*4bf952c9SAnna Dabrowska $helper = plugin_load('helper', 'acknowledge'); 61*4bf952c9SAnna Dabrowska 62*4bf952c9SAnna Dabrowska $rows = $helper->getUserAcknowledgements($user, $groups, 'due'); 63*4bf952c9SAnna Dabrowska if (!$rows) return; 64*4bf952c9SAnna Dabrowska 65*4bf952c9SAnna Dabrowska foreach ($rows as $row) { 66*4bf952c9SAnna Dabrowska $page = $row['page']; 67*4bf952c9SAnna Dabrowska 68*4bf952c9SAnna Dabrowska // don't notify about pages that cannot be acknowledged yet (approve check) 69*4bf952c9SAnna Dabrowska if ($helper->isBlockedByApprove($page)) continue; 70*4bf952c9SAnna Dabrowska 71*4bf952c9SAnna Dabrowska $event->data['notifications'][] = [ 72*4bf952c9SAnna Dabrowska 'plugin' => 'acknowledge', 73*4bf952c9SAnna Dabrowska 'id' => $page . ':' . $row['lastmod'], // notification is bound to id and rev 74*4bf952c9SAnna Dabrowska 'full' => sprintf($this->getLang('notification'), $this->buildPageLink($page)), 75*4bf952c9SAnna Dabrowska 'brief' => $this->buildPageLink($page), 76*4bf952c9SAnna Dabrowska 'timestamp' => (int) $row['lastmod'], 77*4bf952c9SAnna Dabrowska ]; 78*4bf952c9SAnna Dabrowska } 79*4bf952c9SAnna Dabrowska } 80*4bf952c9SAnna Dabrowska 81*4bf952c9SAnna Dabrowska /** 82*4bf952c9SAnna Dabrowska * @param Event $event PLUGIN_NOTIFICATION_CACHE_DEPENDENCIES 83*4bf952c9SAnna Dabrowska * @return void 84*4bf952c9SAnna Dabrowska */ 85*4bf952c9SAnna Dabrowska public function cacheDependencies(Event $event) 86*4bf952c9SAnna Dabrowska { 87*4bf952c9SAnna Dabrowska if (!$this->getConf('notification_integration')) return; 88*4bf952c9SAnna Dabrowska if (!in_array('acknowledge', $event->data['plugins'])) return; 89*4bf952c9SAnna Dabrowska $event->data['_nocache'] = true; 90*4bf952c9SAnna Dabrowska } 91*4bf952c9SAnna Dabrowska 92*4bf952c9SAnna Dabrowska /** 93*4bf952c9SAnna Dabrowska * Build the wiki link 94*4bf952c9SAnna Dabrowska * 95*4bf952c9SAnna Dabrowska * @param string $page Page ID 96*4bf952c9SAnna Dabrowska * @return string HTML anchor 97*4bf952c9SAnna Dabrowska */ 98*4bf952c9SAnna Dabrowska protected function buildPageLink($page) 99*4bf952c9SAnna Dabrowska { 100*4bf952c9SAnna Dabrowska if (useHeading('content')) { 101*4bf952c9SAnna Dabrowska $heading = p_get_first_heading($page); 102*4bf952c9SAnna Dabrowska $title = blank($heading) ? noNSorNS($page) : $heading; 103*4bf952c9SAnna Dabrowska } else { 104*4bf952c9SAnna Dabrowska $title = noNSorNS($page); 105*4bf952c9SAnna Dabrowska } 106*4bf952c9SAnna Dabrowska 107*4bf952c9SAnna Dabrowska return '<a class="wikilink1" href="' . wl($page, '', true) . '">' . hsc($title) . '</a>'; 108*4bf952c9SAnna Dabrowska } 109*4bf952c9SAnna Dabrowska} 110