annotate forum/Sources/Subs-MembersOnline.php @ 88:4ff5a6ad1b2b website

Split out RDF to a subrepository (in the Vamp Known Plugins RDF project)
author Chris Cannam
date Tue, 25 Mar 2014 13:24:36 +0000
parents e3e11437ecea
children
rev   line source
Chris@76 1 <?php
Chris@76 2
Chris@76 3 /**
Chris@76 4 * Simple Machines Forum (SMF)
Chris@76 5 *
Chris@76 6 * @package SMF
Chris@76 7 * @author Simple Machines http://www.simplemachines.org
Chris@76 8 * @copyright 2011 Simple Machines
Chris@76 9 * @license http://www.simplemachines.org/about/smf/license.php BSD
Chris@76 10 *
Chris@76 11 * @version 2.0
Chris@76 12 */
Chris@76 13
Chris@76 14 if (!defined('SMF'))
Chris@76 15 die('Hacking attempt...');
Chris@76 16
Chris@76 17 /* This file currently only holds the function for showing a list of online
Chris@76 18 users used by the board index and SSI. In the future it'll also contain
Chris@76 19 functions used by the Who's online page.
Chris@76 20
Chris@76 21 array getMembersOnlineStats(array membersOnlineOptions)
Chris@76 22 - retrieve a list and several other statistics of the users currently
Chris@76 23 online on the forum.
Chris@76 24 - used by the board index and SSI.
Chris@76 25 - also returns the membergroups of the users that are currently online.
Chris@76 26 - (optionally) hides members that chose to hide their online presense.
Chris@76 27 */
Chris@76 28
Chris@76 29 // Retrieve a list and several other statistics of the users currently online.
Chris@76 30 function getMembersOnlineStats($membersOnlineOptions)
Chris@76 31 {
Chris@76 32 global $smcFunc, $context, $scripturl, $user_info, $modSettings, $txt;
Chris@76 33
Chris@76 34 // The list can be sorted in several ways.
Chris@76 35 $allowed_sort_options = array(
Chris@76 36 'log_time',
Chris@76 37 'real_name',
Chris@76 38 'show_online',
Chris@76 39 'online_color',
Chris@76 40 'group_name',
Chris@76 41 );
Chris@76 42 // Default the sorting method to 'most recent online members first'.
Chris@76 43 if (!isset($membersOnlineOptions['sort']))
Chris@76 44 {
Chris@76 45 $membersOnlineOptions['sort'] = 'log_time';
Chris@76 46 $membersOnlineOptions['reverse_sort'] = true;
Chris@76 47 }
Chris@76 48
Chris@76 49 // Not allowed sort method? Bang! Error!
Chris@76 50 elseif (!in_array($membersOnlineOptions['sort'], $allowed_sort_options))
Chris@76 51 trigger_error('Sort method for getMembersOnlineStats() function is not allowed', E_USER_NOTICE);
Chris@76 52
Chris@76 53 // Initialize the array that'll be returned later on.
Chris@76 54 $membersOnlineStats = array(
Chris@76 55 'users_online' => array(),
Chris@76 56 'list_users_online' => array(),
Chris@76 57 'online_groups' => array(),
Chris@76 58 'num_guests' => 0,
Chris@76 59 'num_spiders' => 0,
Chris@76 60 'num_buddies' => 0,
Chris@76 61 'num_users_hidden' => 0,
Chris@76 62 'num_users_online' => 0,
Chris@76 63 );
Chris@76 64
Chris@76 65 // Get any spiders if enabled.
Chris@76 66 $spiders = array();
Chris@76 67 $spider_finds = array();
Chris@76 68 if (!empty($modSettings['show_spider_online']) && ($modSettings['show_spider_online'] < 3 || allowedTo('admin_forum')) && !empty($modSettings['spider_name_cache']))
Chris@76 69 $spiders = unserialize($modSettings['spider_name_cache']);
Chris@76 70
Chris@76 71 // Load the users online right now.
Chris@76 72 $request = $smcFunc['db_query']('', '
Chris@76 73 SELECT
Chris@76 74 lo.id_member, lo.log_time, lo.id_spider, mem.real_name, mem.member_name, mem.show_online,
Chris@76 75 mg.online_color, mg.id_group, mg.group_name
Chris@76 76 FROM {db_prefix}log_online AS lo
Chris@76 77 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lo.id_member)
Chris@76 78 LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:reg_mem_group} THEN mem.id_post_group ELSE mem.id_group END)',
Chris@76 79 array(
Chris@76 80 'reg_mem_group' => 0,
Chris@76 81 )
Chris@76 82 );
Chris@76 83 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 84 {
Chris@76 85 if (empty($row['real_name']))
Chris@76 86 {
Chris@76 87 // Do we think it's a spider?
Chris@76 88 if ($row['id_spider'] && isset($spiders[$row['id_spider']]))
Chris@76 89 {
Chris@76 90 $spider_finds[$row['id_spider']] = isset($spider_finds[$row['id_spider']]) ? $spider_finds[$row['id_spider']] + 1 : 1;
Chris@76 91 $membersOnlineStats['num_spiders']++;
Chris@76 92 }
Chris@76 93 // Guests are only nice for statistics.
Chris@76 94 $membersOnlineStats['num_guests']++;
Chris@76 95
Chris@76 96 continue;
Chris@76 97 }
Chris@76 98
Chris@76 99 elseif (empty($row['show_online']) && empty($membersOnlineOptions['show_hidden']))
Chris@76 100 {
Chris@76 101 // Just increase the stats and don't add this hidden user to any list.
Chris@76 102 $membersOnlineStats['num_users_hidden']++;
Chris@76 103 continue;
Chris@76 104 }
Chris@76 105
Chris@76 106 // Some basic color coding...
Chris@76 107 if (!empty($row['online_color']))
Chris@76 108 $link = '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '" style="color: ' . $row['online_color'] . ';">' . $row['real_name'] . '</a>';
Chris@76 109 else
Chris@76 110 $link = '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>';
Chris@76 111
Chris@76 112 // Buddies get counted and highlighted.
Chris@76 113 $is_buddy = in_array($row['id_member'], $user_info['buddies']);
Chris@76 114 if ($is_buddy)
Chris@76 115 {
Chris@76 116 $membersOnlineStats['num_buddies']++;
Chris@76 117 $link = '<strong>' . $link . '</strong>';
Chris@76 118 }
Chris@76 119
Chris@76 120 // A lot of useful information for each member.
Chris@76 121 $membersOnlineStats['users_online'][$row[$membersOnlineOptions['sort']] . $row['member_name']] = array(
Chris@76 122 'id' => $row['id_member'],
Chris@76 123 'username' => $row['member_name'],
Chris@76 124 'name' => $row['real_name'],
Chris@76 125 'group' => $row['id_group'],
Chris@76 126 'href' => $scripturl . '?action=profile;u=' . $row['id_member'],
Chris@76 127 'link' => $link,
Chris@76 128 'is_buddy' => $is_buddy,
Chris@76 129 'hidden' => empty($row['show_online']),
Chris@76 130 'is_last' => false,
Chris@76 131 );
Chris@76 132
Chris@76 133 // This is the compact version, simply implode it to show.
Chris@76 134 $membersOnlineStats['list_users_online'][$row[$membersOnlineOptions['sort']] . $row['member_name']] = empty($row['show_online']) ? '<em>' . $link . '</em>' : $link;
Chris@76 135
Chris@76 136 // Store all distinct (primary) membergroups that are shown.
Chris@76 137 if (!isset($membersOnlineStats['online_groups'][$row['id_group']]))
Chris@76 138 $membersOnlineStats['online_groups'][$row['id_group']] = array(
Chris@76 139 'id' => $row['id_group'],
Chris@76 140 'name' => $row['group_name'],
Chris@76 141 'color' => $row['online_color']
Chris@76 142 );
Chris@76 143 }
Chris@76 144 $smcFunc['db_free_result']($request);
Chris@76 145
Chris@76 146 // If there are spiders only and we're showing the detail, add them to the online list - at the bottom.
Chris@76 147 if (!empty($spider_finds) && $modSettings['show_spider_online'] > 1)
Chris@76 148 foreach ($spider_finds as $id => $count)
Chris@76 149 {
Chris@76 150 $link = $spiders[$id] . ($count > 1 ? ' (' . $count . ')' : '');
Chris@76 151 $sort = $membersOnlineOptions['sort'] = 'log_time' && $membersOnlineOptions['reverse_sort'] ? 0 : 'zzz_';
Chris@76 152 $membersOnlineStats['users_online'][$sort . $spiders[$id]] = array(
Chris@76 153 'id' => 0,
Chris@76 154 'username' => $spiders[$id],
Chris@76 155 'name' => $link,
Chris@76 156 'group' => $txt['spiders'],
Chris@76 157 'href' => '',
Chris@76 158 'link' => $link,
Chris@76 159 'is_buddy' => false,
Chris@76 160 'hidden' => false,
Chris@76 161 'is_last' => false,
Chris@76 162 );
Chris@76 163 $membersOnlineStats['list_users_online'][$sort . $spiders[$id]] = $link;
Chris@76 164 }
Chris@76 165
Chris@76 166 // Time to sort the list a bit.
Chris@76 167 if (!empty($membersOnlineStats['users_online']))
Chris@76 168 {
Chris@76 169 // Determine the sort direction.
Chris@76 170 $sortFunction = empty($membersOnlineOptions['reverse_sort']) ? 'ksort' : 'krsort';
Chris@76 171
Chris@76 172 // Sort the two lists.
Chris@76 173 $sortFunction($membersOnlineStats['users_online']);
Chris@76 174 $sortFunction($membersOnlineStats['list_users_online']);
Chris@76 175
Chris@76 176 // Mark the last list item as 'is_last'.
Chris@76 177 $userKeys = array_keys($membersOnlineStats['users_online']);
Chris@76 178 $membersOnlineStats['users_online'][end($userKeys)]['is_last'] = true;
Chris@76 179 }
Chris@76 180
Chris@76 181 // Also sort the membergroups.
Chris@76 182 ksort($membersOnlineStats['online_groups']);
Chris@76 183
Chris@76 184 // Hidden and non-hidden members make up all online members.
Chris@76 185 $membersOnlineStats['num_users_online'] = count($membersOnlineStats['users_online']) + $membersOnlineStats['num_users_hidden'] - (isset($modSettings['show_spider_online']) && $modSettings['show_spider_online'] > 1 ? count($spider_finds) : 0);
Chris@76 186
Chris@76 187 return $membersOnlineStats;
Chris@76 188 }
Chris@76 189
Chris@76 190 // Check if the number of users online is a record and store it.
Chris@76 191 function trackStatsUsersOnline($total_users_online)
Chris@76 192 {
Chris@76 193 global $modSettings, $smcFunc;
Chris@76 194
Chris@76 195 $settingsToUpdate = array();
Chris@76 196
Chris@76 197 // More members on now than ever were? Update it!
Chris@76 198 if (!isset($modSettings['mostOnline']) || $total_users_online >= $modSettings['mostOnline'])
Chris@76 199 $settingsToUpdate = array(
Chris@76 200 'mostOnline' => $total_users_online,
Chris@76 201 'mostDate' => time()
Chris@76 202 );
Chris@76 203
Chris@76 204 $date = strftime('%Y-%m-%d', forum_time(false));
Chris@76 205
Chris@76 206 // No entry exists for today yet?
Chris@76 207 if (!isset($modSettings['mostOnlineUpdated']) || $modSettings['mostOnlineUpdated'] != $date)
Chris@76 208 {
Chris@76 209 $request = $smcFunc['db_query']('', '
Chris@76 210 SELECT most_on
Chris@76 211 FROM {db_prefix}log_activity
Chris@76 212 WHERE date = {date:date}
Chris@76 213 LIMIT 1',
Chris@76 214 array(
Chris@76 215 'date' => $date,
Chris@76 216 )
Chris@76 217 );
Chris@76 218
Chris@76 219 // The log_activity hasn't got an entry for today?
Chris@76 220 if ($smcFunc['db_num_rows']($request) === 0)
Chris@76 221 {
Chris@76 222 $smcFunc['db_insert']('ignore',
Chris@76 223 '{db_prefix}log_activity',
Chris@76 224 array('date' => 'date', 'most_on' => 'int'),
Chris@76 225 array($date, $total_users_online),
Chris@76 226 array('date')
Chris@76 227 );
Chris@76 228 }
Chris@76 229 // There's an entry in log_activity on today...
Chris@76 230 else
Chris@76 231 {
Chris@76 232 list ($modSettings['mostOnlineToday']) = $smcFunc['db_fetch_row']($request);
Chris@76 233
Chris@76 234 if ($total_users_online > $modSettings['mostOnlineToday'])
Chris@76 235 trackStats(array('most_on' => $total_users_online));
Chris@76 236
Chris@76 237 $total_users_online = max($total_users_online, $modSettings['mostOnlineToday']);
Chris@76 238 }
Chris@76 239 $smcFunc['db_free_result']($request);
Chris@76 240
Chris@76 241 $settingsToUpdate['mostOnlineUpdated'] = $date;
Chris@76 242 $settingsToUpdate['mostOnlineToday'] = $total_users_online;
Chris@76 243 }
Chris@76 244
Chris@76 245 // Highest number of users online today?
Chris@76 246 elseif ($total_users_online > $modSettings['mostOnlineToday'])
Chris@76 247 {
Chris@76 248 trackStats(array('most_on' => $total_users_online));
Chris@76 249 $settingsToUpdate['mostOnlineToday'] = $total_users_online;
Chris@76 250 }
Chris@76 251
Chris@76 252 if (!empty($settingsToUpdate))
Chris@76 253 updateSettings($settingsToUpdate);
Chris@76 254 }
Chris@76 255
Chris@76 256 ?>