| [ Index ] |
PHP Cross Reference of MyBB 1.6.5 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * MyBB 1.6 4 * Copyright 2010 MyBB Group, All Rights Reserved 5 * 6 * Website: http://mybb.com 7 * License: http://mybb.com/about/license 8 * 9 * $Id: functions_indicators.php 5606 2011-09-19 13:38:50Z Tomm $ 10 */ 11 12 /** 13 * Mark a particular thread as read for the current user. 14 * 15 * @param int The thread ID 16 * @param int The forum ID of the thread 17 */ 18 function mark_thread_read($tid, $fid) 19 { 20 global $mybb, $db; 21 22 // Can only do "true" tracking for registered users 23 if($mybb->settings['threadreadcut'] > 0 && $mybb->user['uid']) 24 { 25 // For registered users, store the information in the database. 26 switch($db->type) 27 { 28 case "pgsql": 29 case "sqlite": 30 $db->replace_query("threadsread", array('tid' => $tid, 'uid' => $mybb->user['uid'], 'dateline' => TIME_NOW), array("tid", "uid")); 31 break; 32 default: 33 $db->write_query(" 34 REPLACE INTO ".TABLE_PREFIX."threadsread (tid, uid, dateline) 35 VALUES('$tid', '{$mybb->user['uid']}', '".TIME_NOW."') 36 "); 37 } 38 } 39 // Default back to cookie marking 40 else 41 { 42 my_set_array_cookie("threadread", $tid, TIME_NOW); 43 } 44 45 $unread_count = fetch_unread_count($fid); 46 if($unread_count == 0) 47 { 48 mark_forum_read($fid); 49 } 50 } 51 52 /** 53 * Fetches the number of unread threads for the current user in a particular forum. 54 * 55 * @param string The forums (CSV list) 56 * @return int The number of unread threads 57 */ 58 function fetch_unread_count($fid) 59 { 60 global $db, $mybb; 61 62 $cutoff = TIME_NOW-$mybb->settings['threadreadcut']*60*60*24; 63 64 if($mybb->user['uid'] == 0) 65 { 66 $comma = ''; 67 $tids = ''; 68 $threadsread = unserialize($mybb->cookies['mybb']['threadread']); 69 $forumsread = unserialize($mybb->cookies['mybb']['forumread']); 70 if(is_array($threadsread)) 71 { 72 foreach($threadsread as $key => $value) 73 { 74 $tids .= $comma.intval($key); 75 $comma = ','; 76 } 77 } 78 79 if(!empty($tids)) 80 { 81 $count = 0; 82 83 // We've read at least some threads, are they here? 84 $query = $db->simple_select("threads", "lastpost, tid, fid", "visible=1 AND closed NOT LIKE 'moved|%' AND fid IN ($fid) AND lastpost > '{$cutoff}'", array("limit" => 100)); 85 86 while($thread = $db->fetch_array($query)) 87 { 88 if($thread['lastpost'] > intval($threadsread[$thread['tid']]) && $thread['lastpost'] > intval($forumsread[$thread['fid']])) 89 { 90 ++$count; 91 } 92 } 93 94 return $count; 95 } 96 97 // Not read any threads? 98 return false; 99 } 100 else 101 { 102 switch($db->type) 103 { 104 case "pgsql": 105 $query = $db->query(" 106 SELECT COUNT(t.tid) AS unread_count 107 FROM ".TABLE_PREFIX."threads t 108 LEFT JOIN ".TABLE_PREFIX."threadsread tr ON (tr.tid=t.tid AND tr.uid='{$mybb->user['uid']}') 109 LEFT JOIN ".TABLE_PREFIX."forumsread fr ON (fr.fid=t.fid AND fr.uid='{$mybb->user['uid']}') 110 WHERE t.visible=1 AND t.closed NOT LIKE 'moved|%' AND t.fid IN ($fid) AND t.lastpost > COALESCE(tr.dateline,$cutoff) AND t.lastpost > COALESCE(fr.dateline,$cutoff) AND t.lastpost>$cutoff 111 "); 112 break; 113 default: 114 $query = $db->query(" 115 SELECT COUNT(t.tid) AS unread_count 116 FROM ".TABLE_PREFIX."threads t 117 LEFT JOIN ".TABLE_PREFIX."threadsread tr ON (tr.tid=t.tid AND tr.uid='{$mybb->user['uid']}') 118 LEFT JOIN ".TABLE_PREFIX."forumsread fr ON (fr.fid=t.fid AND fr.uid='{$mybb->user['uid']}') 119 WHERE t.visible=1 AND t.closed NOT LIKE 'moved|%' AND t.fid IN ($fid) AND t.lastpost > IFNULL(tr.dateline,$cutoff) AND t.lastpost > IFNULL(fr.dateline,$cutoff) AND t.lastpost>$cutoff 120 "); 121 } 122 return $db->fetch_field($query, "unread_count"); 123 } 124 } 125 126 /** 127 * Mark a particular forum as read. 128 * 129 * @param int The forum ID 130 */ 131 function mark_forum_read($fid) 132 { 133 global $mybb, $db; 134 135 // Can only do "true" tracking for registered users 136 if($mybb->settings['threadreadcut'] > 0 && $mybb->user['uid']) 137 { 138 // Experimental setting to mark parent forums as read 139 $forums_to_read = array(); 140 141 if($mybb->settings['readparentforums']) 142 { 143 $ignored_forums = array(); 144 $forums = array_reverse(explode(",", get_parent_list($fid))); 145 146 unset($forums[0]); 147 if(!empty($forums)) 148 { 149 $ignored_forums[] = $fid; 150 151 foreach($forums as $forum) 152 { 153 $fids = array($forum); 154 $ignored_forums[] = $forum; 155 156 $children = explode(",", get_parent_list($forum)); 157 foreach($children as $child) 158 { 159 if(in_array($child, $ignored_forums)) 160 { 161 continue; 162 } 163 164 $fids[] = $child; 165 $ignored_forums[] = $child; 166 } 167 168 if(fetch_unread_count(implode(",", $fids)) == 0) 169 { 170 $forums_to_read[] = $forum; 171 } 172 } 173 } 174 } 175 176 switch($db->type) 177 { 178 case "pgsql": 179 case "sqlite": 180 add_shutdown(array($db, "replace_query"), array("forumsread", array('fid' => $fid, 'uid' => $mybb->user['uid'], 'dateline' => TIME_NOW), array("fid", "uid"))); 181 182 if(!empty($forums_to_read)) 183 { 184 foreach($forums_to_read as $forum) 185 { 186 add_shutdown(array($db, "replace_query"), array("forumsread", array('fid' => $forum, 'uid' => $mybb->user['uid'], 'dateline' => TIME_NOW), array('fid', 'uid'))); 187 } 188 } 189 break; 190 default: 191 $child_sql = ''; 192 if(!empty($forums_to_read)) 193 { 194 foreach($forums_to_read as $forum) 195 { 196 $child_sql .= ", ('{$forum}', '{$mybb->user['uid']}', '".TIME_NOW."')"; 197 } 198 } 199 200 $db->shutdown_query(" 201 REPLACE INTO ".TABLE_PREFIX."forumsread (fid, uid, dateline) 202 VALUES('{$fid}', '{$mybb->user['uid']}', '".TIME_NOW."'){$child_sql} 203 "); 204 } 205 } 206 // Mark in a cookie 207 else 208 { 209 my_set_array_cookie("forumread", $fid, TIME_NOW); 210 } 211 } 212 213 /** 214 * Marks all forums as read. 215 * 216 */ 217 function mark_all_forums_read() 218 { 219 global $mybb, $db, $cache; 220 221 // Can only do "true" tracking for registered users 222 if($mybb->user['uid'] > 0) 223 { 224 $db->update_query("users", array('lastvisit' => TIME_NOW), "uid='".$mybb->user['uid']."'"); 225 require_once MYBB_ROOT."inc/functions_user.php"; 226 update_pm_count('', 2); 227 228 if($mybb->settings['threadreadcut'] > 0) 229 { 230 // Need to loop through all forums and mark them as read 231 $forums = $cache->read('forums'); 232 233 $update_count = ceil(count($forums)/20); 234 235 if($update_count < 15) 236 { 237 $update_count = 15; 238 } 239 240 $mark_query = ''; 241 $done = 0; 242 foreach(array_keys($forums) as $fid) 243 { 244 switch($db->type) 245 { 246 case "pgsql": 247 case "sqlite": 248 $mark_query[] = array('fid' => $fid, 'uid' => $mybb->user['uid'], 'dateline' => TIME_NOW); 249 break; 250 default: 251 if($mark_query != '') 252 { 253 $mark_query .= ','; 254 } 255 $mark_query .= "('{$fid}', '{$mybb->user['uid']}', '".TIME_NOW."')"; 256 } 257 ++$done; 258 259 // Only do this in loops of $update_count, save query time 260 if($done % $update_count) 261 { 262 switch($db->type) 263 { 264 case "pgsql": 265 case "sqlite": 266 foreach($mark_query as $replace_query) 267 { 268 add_shutdown(array($db, "replace_query"), array("forumsread", $replace_query, array("fid", "uid"))); 269 } 270 $mark_query = array(); 271 break; 272 default: 273 $db->shutdown_query(" 274 REPLACE INTO ".TABLE_PREFIX."forumsread (fid, uid, dateline) 275 VALUES {$mark_query} 276 "); 277 $mark_query = ''; 278 } 279 } 280 } 281 282 if($mark_query != '') 283 { 284 switch($db->type) 285 { 286 case "pgsql": 287 case "sqlite": 288 foreach($mark_query as $replace_query) 289 { 290 add_shutdown(array($db, "replace_query"), array("forumsread", $replace_query, array("fid", "uid"))); 291 } 292 break; 293 default: 294 $db->shutdown_query(" 295 REPLACE INTO ".TABLE_PREFIX."forumsread (fid, uid, dateline) 296 VALUES {$mark_query} 297 "); 298 } 299 } 300 } 301 } 302 else 303 { 304 my_setcookie("mybb[readallforums]", 1); 305 my_setcookie("mybb[lastvisit]", TIME_NOW); 306 307 my_unsetcookie("mybb[threadread]"); 308 my_unsetcookie("mybb[forumread]"); 309 } 310 } 311 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Sun Dec 11 14:16:27 2011 | Cross-referenced by PHPXref 0.7.1 |