1a1f4c7baSSzymon Olewniczak<?php 2a1f4c7baSSzymon Olewniczak/** 3a1f4c7baSSzymon Olewniczak * DokuWiki Plugin structnotification (Action Component) 4a1f4c7baSSzymon Olewniczak * 5a1f4c7baSSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6a1f4c7baSSzymon Olewniczak * @author Szymon Olewniczak <it@rid.pl> 7a1f4c7baSSzymon Olewniczak */ 8a1f4c7baSSzymon Olewniczak 9a1f4c7baSSzymon Olewniczak// must be run within Dokuwiki 10*922aade7SSzymon Olewniczakuse dokuwiki\plugin\struct\meta\Search; 11*922aade7SSzymon Olewniczakuse dokuwiki\plugin\struct\meta\Value; 12*922aade7SSzymon Olewniczak 13a1f4c7baSSzymon Olewniczakif (!defined('DOKU_INC')) { 14a1f4c7baSSzymon Olewniczak die(); 15a1f4c7baSSzymon Olewniczak} 16a1f4c7baSSzymon Olewniczak 17a1f4c7baSSzymon Olewniczakclass action_plugin_structnotification_notification extends DokuWiki_Action_Plugin 18a1f4c7baSSzymon Olewniczak{ 19a1f4c7baSSzymon Olewniczak 20a1f4c7baSSzymon Olewniczak /** 21a1f4c7baSSzymon Olewniczak * Registers a callback function for a given event 22a1f4c7baSSzymon Olewniczak * 23a1f4c7baSSzymon Olewniczak * @param Doku_Event_Handler $controller DokuWiki's event controller object 24a1f4c7baSSzymon Olewniczak * 25a1f4c7baSSzymon Olewniczak * @return void 26a1f4c7baSSzymon Olewniczak */ 27a1f4c7baSSzymon Olewniczak public function register(Doku_Event_Handler $controller) 28a1f4c7baSSzymon Olewniczak { 29*922aade7SSzymon Olewniczak $controller->register_hook('PLUGIN_NOTIFICATION_REGISTER_SOURCE', 'AFTER', $this, 'add_notifications_source'); 30*922aade7SSzymon Olewniczak $controller->register_hook('PLUGIN_NOTIFICATION_GATHER', 'AFTER', $this, 'add_notifications'); 31*922aade7SSzymon Olewniczak $controller->register_hook('PLUGIN_NOTIFICATION_CACHE_DEPENDENCIES', 'AFTER', $this, 'add_notification_cache_dependencies'); 32a1f4c7baSSzymon Olewniczak 33*922aade7SSzymon Olewniczak 34*922aade7SSzymon Olewniczak } 35*922aade7SSzymon Olewniczak 36*922aade7SSzymon Olewniczak public function add_notifications_source(Doku_Event $event) 37*922aade7SSzymon Olewniczak { 38*922aade7SSzymon Olewniczak $event->data[] = 'structnotification'; 39*922aade7SSzymon Olewniczak } 40*922aade7SSzymon Olewniczak 41*922aade7SSzymon Olewniczak public function add_notification_cache_dependencies(Doku_Event $event) 42*922aade7SSzymon Olewniczak { 43*922aade7SSzymon Olewniczak if (!in_array('structnotification', $event->data['plugins'])) return; 44*922aade7SSzymon Olewniczak 45*922aade7SSzymon Olewniczak try { 46*922aade7SSzymon Olewniczak /** @var \helper_plugin_structnotification_db $db_helper */ 47*922aade7SSzymon Olewniczak $db_helper = plugin_load('helper', 'structnotification_db'); 48*922aade7SSzymon Olewniczak $sqlite = $db_helper->getDB(); 49*922aade7SSzymon Olewniczak $event->data['dependencies'][] = $sqlite->getAdapter()->getDbFile(); 50*922aade7SSzymon Olewniczak } catch (Exception $e) { 51*922aade7SSzymon Olewniczak msg($e->getMessage(), -1); 52*922aade7SSzymon Olewniczak return; 53*922aade7SSzymon Olewniczak } 54*922aade7SSzymon Olewniczak } 55*922aade7SSzymon Olewniczak 56*922aade7SSzymon Olewniczak protected function getValueByLabel($values, $label) 57*922aade7SSzymon Olewniczak { 58*922aade7SSzymon Olewniczak /* @var Value $value */ 59*922aade7SSzymon Olewniczak foreach ($values as $value) { 60*922aade7SSzymon Olewniczak $colLabel = $value->getColumn()->getLabel(); 61*922aade7SSzymon Olewniczak if ($colLabel == $label) { 62*922aade7SSzymon Olewniczak return $value->getRawValue(); 63*922aade7SSzymon Olewniczak } 64*922aade7SSzymon Olewniczak } 65*922aade7SSzymon Olewniczak //nothing found 66*922aade7SSzymon Olewniczak throw new Exception("column: $label not found in values"); 67*922aade7SSzymon Olewniczak } 68*922aade7SSzymon Olewniczak 69*922aade7SSzymon Olewniczak 70*922aade7SSzymon Olewniczak public function add_notifications(Doku_Event $event) 71*922aade7SSzymon Olewniczak { 72*922aade7SSzymon Olewniczak if (!in_array('structnotification', $event->data['plugins'])) return; 73*922aade7SSzymon Olewniczak 74*922aade7SSzymon Olewniczak try { 75*922aade7SSzymon Olewniczak /** @var \helper_plugin_structnotification_db$db_helper */ 76*922aade7SSzymon Olewniczak $db_helper = plugin_load('helper', 'structnotification_db'); 77*922aade7SSzymon Olewniczak $sqlite = $db_helper->getDB(); 78*922aade7SSzymon Olewniczak } catch (Exception $e) { 79*922aade7SSzymon Olewniczak msg($e->getMessage(), -1); 80*922aade7SSzymon Olewniczak return; 81*922aade7SSzymon Olewniczak } 82*922aade7SSzymon Olewniczak 83*922aade7SSzymon Olewniczak $user = $event->data['user']; 84*922aade7SSzymon Olewniczak 85*922aade7SSzymon Olewniczak $q = 'SELECT * FROM predicate'; 86*922aade7SSzymon Olewniczak $res = $sqlite->query($q); 87*922aade7SSzymon Olewniczak 88*922aade7SSzymon Olewniczak $predicates = $sqlite->res2arr($res); 89*922aade7SSzymon Olewniczak 90*922aade7SSzymon Olewniczak foreach ($predicates as $predicate) { 91*922aade7SSzymon Olewniczak $schema = $predicate['schema']; 92*922aade7SSzymon Olewniczak $field = $predicate['field']; 93*922aade7SSzymon Olewniczak $operator = $predicate['operator']; 94*922aade7SSzymon Olewniczak $days = $predicate['days']; 95*922aade7SSzymon Olewniczak $users_and_groups = $predicate['users_and_groups']; 96*922aade7SSzymon Olewniczak $message = $predicate['message']; 97*922aade7SSzymon Olewniczak 98*922aade7SSzymon Olewniczak $users_set = $this->users_set($users_and_groups); 99*922aade7SSzymon Olewniczak if (!isset($users_set[$user])) continue; 100*922aade7SSzymon Olewniczak 101*922aade7SSzymon Olewniczak try { 102*922aade7SSzymon Olewniczak $search = new Search(); 103*922aade7SSzymon Olewniczak $search->addSchema($schema); 104*922aade7SSzymon Olewniczak $search->addColumn('*'); 105*922aade7SSzymon Olewniczak $result = $search->execute(); 106*922aade7SSzymon Olewniczak $result_pids = $search->getPids(); 107*922aade7SSzymon Olewniczak 108*922aade7SSzymon Olewniczak /* @var Value[] $row */ 109*922aade7SSzymon Olewniczak for ($i=0; $i<count($result); $i++) { 110*922aade7SSzymon Olewniczak $values = $result[$i]; 111*922aade7SSzymon Olewniczak $pid = $result_pids[$i]; 112*922aade7SSzymon Olewniczak $rawDate = $this->getValueByLabel($values, $field); 113*922aade7SSzymon Olewniczak if ($this->predicateTrue($rawDate, $operator, $days)) { 114*922aade7SSzymon Olewniczak $message_html = p_render('xhtml',p_get_instructions($message), $info); 115*922aade7SSzymon Olewniczak $event->data['notifications'][] = [ 116*922aade7SSzymon Olewniczak 'plugin' => 'structnotification', 117*922aade7SSzymon Olewniczak 'id' => $predicate['id'] . ':'. $schema . ':' . $pid . ':' . $rawDate, 118*922aade7SSzymon Olewniczak 'full' => $message_html, 119*922aade7SSzymon Olewniczak 'brief' => $message_html, 120*922aade7SSzymon Olewniczak 'timestamp' => (int) strtotime($rawDate) 121*922aade7SSzymon Olewniczak ]; 122*922aade7SSzymon Olewniczak } 123*922aade7SSzymon Olewniczak } 124*922aade7SSzymon Olewniczak } catch (Exception $e) { 125*922aade7SSzymon Olewniczak msg($e->getMessage(), -1); 126*922aade7SSzymon Olewniczak return; 127*922aade7SSzymon Olewniczak } 128*922aade7SSzymon Olewniczak } 129a1f4c7baSSzymon Olewniczak } 130a1f4c7baSSzymon Olewniczak 131a1f4c7baSSzymon Olewniczak /** 132*922aade7SSzymon Olewniczak * @param array $users 133*922aade7SSzymon Olewniczak * @param array $groups 134*922aade7SSzymon Olewniczak * @return array 135a1f4c7baSSzymon Olewniczak */ 136*922aade7SSzymon Olewniczak protected function users_set($user_and_groups) { 137*922aade7SSzymon Olewniczak /** @var DokuWiki_Auth_Plugin $auth */ 138*922aade7SSzymon Olewniczak global $auth; 139*922aade7SSzymon Olewniczak 140*922aade7SSzymon Olewniczak $user_and_groups_set = array_map('trim', explode(',', $user_and_groups)); 141*922aade7SSzymon Olewniczak $users = []; 142*922aade7SSzymon Olewniczak $groups = []; 143*922aade7SSzymon Olewniczak foreach ($user_and_groups_set as $user_or_group) { 144*922aade7SSzymon Olewniczak if ($user_or_group[0] == '@') { 145*922aade7SSzymon Olewniczak $groups[] = substr($user_or_group, 1); 146*922aade7SSzymon Olewniczak } else { 147*922aade7SSzymon Olewniczak $users[] = $user_or_group; 148a1f4c7baSSzymon Olewniczak } 149a1f4c7baSSzymon Olewniczak } 150*922aade7SSzymon Olewniczak $set = []; 151*922aade7SSzymon Olewniczak 152*922aade7SSzymon Olewniczak $all_users = $auth->retrieveUsers(); 153*922aade7SSzymon Olewniczak foreach ($all_users as $user => $info) { 154*922aade7SSzymon Olewniczak if (in_array($user, $users)) { 155*922aade7SSzymon Olewniczak $set[$user] = $info; 156*922aade7SSzymon Olewniczak } elseif (array_intersect($groups, $info['grps'])) { 157*922aade7SSzymon Olewniczak $set[$user] = $info; 158*922aade7SSzymon Olewniczak } 159*922aade7SSzymon Olewniczak } 160*922aade7SSzymon Olewniczak 161*922aade7SSzymon Olewniczak return $set; 162*922aade7SSzymon Olewniczak } 163*922aade7SSzymon Olewniczak 164*922aade7SSzymon Olewniczak protected function predicateTrue($date, $operator, $days) { 165*922aade7SSzymon Olewniczak $date = date('Y-m-d', strtotime($date)); 166*922aade7SSzymon Olewniczak 167*922aade7SSzymon Olewniczak switch ($operator) { 168*922aade7SSzymon Olewniczak case 'before': 169*922aade7SSzymon Olewniczak $days = date('Y-m-d', strtotime("+$days days")); 170*922aade7SSzymon Olewniczak return $days >= $date; 171*922aade7SSzymon Olewniczak case 'after': 172*922aade7SSzymon Olewniczak $days = date('Y-m-d', strtotime("-$days days")); 173*922aade7SSzymon Olewniczak return $date <= $days; 174*922aade7SSzymon Olewniczak default: 175*922aade7SSzymon Olewniczak return false; 176*922aade7SSzymon Olewniczak } 177a1f4c7baSSzymon Olewniczak } 178a1f4c7baSSzymon Olewniczak 179a1f4c7baSSzymon Olewniczak} 180a1f4c7baSSzymon Olewniczak 181