17b5bedfeSSzymon Olewniczak<?php 27b5bedfeSSzymon Olewniczak/** 37b5bedfeSSzymon Olewniczak * DokuWiki Plugin struct (Helper Component) 47b5bedfeSSzymon Olewniczak * 57b5bedfeSSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 67b5bedfeSSzymon Olewniczak * @author Szymon Olewniczak <dokuwiki@cosmocode.de> 77b5bedfeSSzymon Olewniczak */ 87b5bedfeSSzymon Olewniczak 97b5bedfeSSzymon Olewniczak// must be run within Dokuwiki 107b5bedfeSSzymon Olewniczakif (!defined('DOKU_INC')) { 117b5bedfeSSzymon Olewniczak die(); 127b5bedfeSSzymon Olewniczak} 137b5bedfeSSzymon Olewniczak 147b5bedfeSSzymon Olewniczakclass helper_plugin_ireadit extends DokuWiki_Plugin 157b5bedfeSSzymon Olewniczak{ 16d0cab33cSSzymon Olewniczak /** 17d0cab33cSSzymon Olewniczak * @param array $users 18d0cab33cSSzymon Olewniczak * @param array $groups 19d0cab33cSSzymon Olewniczak * @return array 20d0cab33cSSzymon Olewniczak */ 21*d2cf7c78SSzymon Olewniczak public function users_set($ireadit_data) { 227b5bedfeSSzymon Olewniczak global $auth; 237b5bedfeSSzymon Olewniczak 24*d2cf7c78SSzymon Olewniczak $users = $ireadit_data['users']; 25*d2cf7c78SSzymon Olewniczak $groups = $ireadit_data['groups']; 265d3fb867SSzymon Olewniczak $set = []; 277b5bedfeSSzymon Olewniczak if (empty($users) && empty($groups)) { 287b5bedfeSSzymon Olewniczak $set = $auth->retrieveUsers(); 297b5bedfeSSzymon Olewniczak } else { 307b5bedfeSSzymon Olewniczak $all_users = $auth->retrieveUsers(); 317b5bedfeSSzymon Olewniczak foreach ($all_users as $user => $info) { 327b5bedfeSSzymon Olewniczak if (in_array($user, $users)) { 33*d2cf7c78SSzymon Olewniczak $set[$user] = true; 347b5bedfeSSzymon Olewniczak } elseif (array_intersect($groups, $info['grps'])) { 35*d2cf7c78SSzymon Olewniczak $set[$user] = true; 367b5bedfeSSzymon Olewniczak } 377b5bedfeSSzymon Olewniczak } 387b5bedfeSSzymon Olewniczak } 39*d2cf7c78SSzymon Olewniczak return array_keys($set); 40*d2cf7c78SSzymon Olewniczak } 41*d2cf7c78SSzymon Olewniczak 42*d2cf7c78SSzymon Olewniczak public function user_can_read_page($ireadit_data, $id, $rev, $user, &$readers=array()) { 43*d2cf7c78SSzymon Olewniczak try { 44*d2cf7c78SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 45*d2cf7c78SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 46*d2cf7c78SSzymon Olewniczak $sqlite = $db_helper->getDB(); 47*d2cf7c78SSzymon Olewniczak } catch (Exception $e) { 48*d2cf7c78SSzymon Olewniczak msg($e->getMessage(), -1); 49*d2cf7c78SSzymon Olewniczak return; 50*d2cf7c78SSzymon Olewniczak } 51*d2cf7c78SSzymon Olewniczak 52*d2cf7c78SSzymon Olewniczak $res = $sqlite->query('SELECT user, timestamp FROM ireadit 53*d2cf7c78SSzymon Olewniczak WHERE page = ? 54*d2cf7c78SSzymon Olewniczak AND rev = ? 55*d2cf7c78SSzymon Olewniczak ORDER BY timestamp', $id, $rev); 56*d2cf7c78SSzymon Olewniczak $readers = $sqlite->res2arr($res); 57*d2cf7c78SSzymon Olewniczak $users_set = $this->users_set($ireadit_data); 58*d2cf7c78SSzymon Olewniczak return in_array($user, $users_set) && !in_array($user, array_column($readers, 'user')); 597b5bedfeSSzymon Olewniczak } 60d0cab33cSSzymon Olewniczak 61d0cab33cSSzymon Olewniczak /** 62*d2cf7c78SSzymon Olewniczak * @param $user NULL means overview mode 63*d2cf7c78SSzymon Olewniczak * @return array|false 64d0cab33cSSzymon Olewniczak */ 65*d2cf7c78SSzymon Olewniczak public function get_list($user=NULL) { 66*d2cf7c78SSzymon Olewniczak try { 67*d2cf7c78SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 68*d2cf7c78SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 69*d2cf7c78SSzymon Olewniczak $sqlite = $db_helper->getDB(); 70*d2cf7c78SSzymon Olewniczak } catch (Exception $e) { 71*d2cf7c78SSzymon Olewniczak msg($e->getMessage(), -1); 72d0cab33cSSzymon Olewniczak return false; 73d0cab33cSSzymon Olewniczak } 74*d2cf7c78SSzymon Olewniczak 75*d2cf7c78SSzymon Olewniczak $indexer = idx_get_indexer(); 76*d2cf7c78SSzymon Olewniczak if ($user) { 77*d2cf7c78SSzymon Olewniczak $current_user_pages = $indexer->lookupKey('ireadit', $user); 78*d2cf7c78SSzymon Olewniczak } else { 79*d2cf7c78SSzymon Olewniczak $current_user_pages = $indexer->getPages('ireadit'); 80*d2cf7c78SSzymon Olewniczak } 81*d2cf7c78SSzymon Olewniczak 82*d2cf7c78SSzymon Olewniczak $pages = []; 83*d2cf7c78SSzymon Olewniczak foreach ($current_user_pages as $page) { 84*d2cf7c78SSzymon Olewniczak $last_change_date = p_get_metadata($page, 'last_change date'); 85*d2cf7c78SSzymon Olewniczak $pages[$page] = [ 86*d2cf7c78SSzymon Olewniczak 'current_rev' => $last_change_date, 87*d2cf7c78SSzymon Olewniczak 'last_read_rev' => NULL, 88*d2cf7c78SSzymon Olewniczak 'timestamp' => NULL 89*d2cf7c78SSzymon Olewniczak ]; 90*d2cf7c78SSzymon Olewniczak } 91*d2cf7c78SSzymon Olewniczak if ($user) { 92*d2cf7c78SSzymon Olewniczak $res = $sqlite->query('SELECT page, MAX(rev) as "rev", timestamp FROM ireadit WHERE user=? GROUP BY page', 93*d2cf7c78SSzymon Olewniczak $user); 94*d2cf7c78SSzymon Olewniczak } else { 95*d2cf7c78SSzymon Olewniczak $res = $sqlite->query('SELECT page, MAX(rev) as "rev", timestamp FROM ireadit GROUP BY page'); 96*d2cf7c78SSzymon Olewniczak } 97*d2cf7c78SSzymon Olewniczak 98*d2cf7c78SSzymon Olewniczak while ($row = $sqlite->res_fetch_assoc($res)) { 99*d2cf7c78SSzymon Olewniczak $page = $row['page']; 100*d2cf7c78SSzymon Olewniczak $rev = (int) $row['rev']; 101*d2cf7c78SSzymon Olewniczak $timestamp = $row['timestamp']; 102*d2cf7c78SSzymon Olewniczak if (isset($pages[$page])) { 103*d2cf7c78SSzymon Olewniczak $pages[$page]['last_read_rev'] = $rev; 104*d2cf7c78SSzymon Olewniczak $pages[$page]['timestamp'] = $timestamp; 105*d2cf7c78SSzymon Olewniczak } 106*d2cf7c78SSzymon Olewniczak } 107*d2cf7c78SSzymon Olewniczak 108*d2cf7c78SSzymon Olewniczak // apply states to pages 109*d2cf7c78SSzymon Olewniczak foreach ($pages as &$page) { 110*d2cf7c78SSzymon Olewniczak if ($page['current_rev'] == $page['last_read_rev']) { 111*d2cf7c78SSzymon Olewniczak $page['state'] = 'read'; 112*d2cf7c78SSzymon Olewniczak } elseif ($page['last_read_rev'] == NULL) { 113*d2cf7c78SSzymon Olewniczak $page['state'] = 'unread'; 114*d2cf7c78SSzymon Olewniczak } else { 115*d2cf7c78SSzymon Olewniczak $page['state'] = 'outdated'; 116*d2cf7c78SSzymon Olewniczak } 117*d2cf7c78SSzymon Olewniczak } 118*d2cf7c78SSzymon Olewniczak return $pages; 119*d2cf7c78SSzymon Olewniczak } 1207b5bedfeSSzymon Olewniczak} 121