News:

Bored?  Looking to kill some time?  Want to chat with other SMF users?  Join us in IRC chat or Discord

Main Menu

How to count the number of members currently viewing an action of your choice

Started by Biology Forums, September 05, 2014, 12:19:51 AM

Previous topic - Next topic

Biology Forums

I'm sharing this script upon request from this thread.

The script was developed with SMFHacks - respect goes to him for helping me put this idea together.



Note: This has only been tested on SMF 1.x, it will not work on 2.x, so feel free to alter it and share it below.



I placed this script inside load.php, specifically  inside the function loadUserSettings(), just before the }.



if (($context['gal_users'] = cache_get_data('gal_users', 15)) == null)
{
$context['view_members2'] = array();
$context['view_num_hidden'] = 0;

// Search for members who are in the gallery
   $request = db_query("
  SELECT lo.ID_MEMBER, lo.logTime, mem.showOnline
  FROM {$db_prefix}log_online AS lo
  LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = lo.ID_MEMBER)
  WHERE lo.url like '%s:7:\"gallery\"%'", __FILE__, __LINE__);

while ($row = mysql_fetch_assoc($request))
   {
  if (empty($row['ID_MEMBER']))
continue;

  $context['view_members2'][$row['logTime']] = array(
'id' => $row['ID_MEMBER'],
'hidden' => empty($row['showOnline']),
  );
 
  if (empty($row['showOnline']))
$context['view_num_hidden']++;
   }
// Sort the list.
krsort($context['view_members2']);

// The number of guests is equal to the rows minus the ones we actually used.
$context['view_num_guests2'] = mysql_num_rows($request) - count($context['view_members2']);
mysql_free_result($request);
$context['gal_users'] = $context['view_num_guests2'] + count($context['view_members2']);
cache_put_data('gal_users', $context['gal_users'], 15);
}



If you want another action besides action=gallery, change:

%s:7:\"gallery\"%

to something else, like stats:

%s:5:\"stats\"%

Notice how s:7 became s:5 and gallery became stats.

Enjoy!

Hj Ahmad Rasyid Hj Ismail


Biology Forums

Quote from: ahrasis on October 03, 2014, 09:44:13 AM
Thank you for sharing this Shuban. Can't wait to test it.

You're welcome. This will also work best if a caching system has been put in place.

Arantor

Yeah because this is going to suck in performance terms :( There's no way the query can be optimised at all, so it ends up being a complete table scan of the log_online table, which is also full-blocking unless you're using InnoDB (which means if you have a large online list, it blocks everything else updating it while it fetches the data)

Hj Ahmad Rasyid Hj Ismail

Hah... That is a nice catch. Will bear it in mind while attempting this idea.

Advertisement: