[ Index ]

PHP Cross Reference of MyBB 1.6.5

title

Body

[close]

/inc/ -> functions_indicators.php (source)

   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  ?>


Generated: Sun Dec 11 14:16:27 2011 Cross-referenced by PHPXref 0.7.1