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