Mercurial > hg > vamp-website
diff forum/Sources/Subs-MembersOnline.php @ 76:e3e11437ecea website
Add forum code
author | Chris Cannam |
---|---|
date | Sun, 07 Jul 2013 11:25:48 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/forum/Sources/Subs-MembersOnline.php Sun Jul 07 11:25:48 2013 +0200 @@ -0,0 +1,256 @@ +<?php + +/** + * Simple Machines Forum (SMF) + * + * @package SMF + * @author Simple Machines http://www.simplemachines.org + * @copyright 2011 Simple Machines + * @license http://www.simplemachines.org/about/smf/license.php BSD + * + * @version 2.0 + */ + +if (!defined('SMF')) + die('Hacking attempt...'); + +/* This file currently only holds the function for showing a list of online + users used by the board index and SSI. In the future it'll also contain + functions used by the Who's online page. + + array getMembersOnlineStats(array membersOnlineOptions) + - retrieve a list and several other statistics of the users currently + online on the forum. + - used by the board index and SSI. + - also returns the membergroups of the users that are currently online. + - (optionally) hides members that chose to hide their online presense. +*/ + +// Retrieve a list and several other statistics of the users currently online. +function getMembersOnlineStats($membersOnlineOptions) +{ + global $smcFunc, $context, $scripturl, $user_info, $modSettings, $txt; + + // The list can be sorted in several ways. + $allowed_sort_options = array( + 'log_time', + 'real_name', + 'show_online', + 'online_color', + 'group_name', + ); + // Default the sorting method to 'most recent online members first'. + if (!isset($membersOnlineOptions['sort'])) + { + $membersOnlineOptions['sort'] = 'log_time'; + $membersOnlineOptions['reverse_sort'] = true; + } + + // Not allowed sort method? Bang! Error! + elseif (!in_array($membersOnlineOptions['sort'], $allowed_sort_options)) + trigger_error('Sort method for getMembersOnlineStats() function is not allowed', E_USER_NOTICE); + + // Initialize the array that'll be returned later on. + $membersOnlineStats = array( + 'users_online' => array(), + 'list_users_online' => array(), + 'online_groups' => array(), + 'num_guests' => 0, + 'num_spiders' => 0, + 'num_buddies' => 0, + 'num_users_hidden' => 0, + 'num_users_online' => 0, + ); + + // Get any spiders if enabled. + $spiders = array(); + $spider_finds = array(); + if (!empty($modSettings['show_spider_online']) && ($modSettings['show_spider_online'] < 3 || allowedTo('admin_forum')) && !empty($modSettings['spider_name_cache'])) + $spiders = unserialize($modSettings['spider_name_cache']); + + // Load the users online right now. + $request = $smcFunc['db_query']('', ' + SELECT + lo.id_member, lo.log_time, lo.id_spider, mem.real_name, mem.member_name, mem.show_online, + mg.online_color, mg.id_group, mg.group_name + FROM {db_prefix}log_online AS lo + LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lo.id_member) + 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)', + array( + 'reg_mem_group' => 0, + ) + ); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (empty($row['real_name'])) + { + // Do we think it's a spider? + if ($row['id_spider'] && isset($spiders[$row['id_spider']])) + { + $spider_finds[$row['id_spider']] = isset($spider_finds[$row['id_spider']]) ? $spider_finds[$row['id_spider']] + 1 : 1; + $membersOnlineStats['num_spiders']++; + } + // Guests are only nice for statistics. + $membersOnlineStats['num_guests']++; + + continue; + } + + elseif (empty($row['show_online']) && empty($membersOnlineOptions['show_hidden'])) + { + // Just increase the stats and don't add this hidden user to any list. + $membersOnlineStats['num_users_hidden']++; + continue; + } + + // Some basic color coding... + if (!empty($row['online_color'])) + $link = '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '" style="color: ' . $row['online_color'] . ';">' . $row['real_name'] . '</a>'; + else + $link = '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>'; + + // Buddies get counted and highlighted. + $is_buddy = in_array($row['id_member'], $user_info['buddies']); + if ($is_buddy) + { + $membersOnlineStats['num_buddies']++; + $link = '<strong>' . $link . '</strong>'; + } + + // A lot of useful information for each member. + $membersOnlineStats['users_online'][$row[$membersOnlineOptions['sort']] . $row['member_name']] = array( + 'id' => $row['id_member'], + 'username' => $row['member_name'], + 'name' => $row['real_name'], + 'group' => $row['id_group'], + 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], + 'link' => $link, + 'is_buddy' => $is_buddy, + 'hidden' => empty($row['show_online']), + 'is_last' => false, + ); + + // This is the compact version, simply implode it to show. + $membersOnlineStats['list_users_online'][$row[$membersOnlineOptions['sort']] . $row['member_name']] = empty($row['show_online']) ? '<em>' . $link . '</em>' : $link; + + // Store all distinct (primary) membergroups that are shown. + if (!isset($membersOnlineStats['online_groups'][$row['id_group']])) + $membersOnlineStats['online_groups'][$row['id_group']] = array( + 'id' => $row['id_group'], + 'name' => $row['group_name'], + 'color' => $row['online_color'] + ); + } + $smcFunc['db_free_result']($request); + + // If there are spiders only and we're showing the detail, add them to the online list - at the bottom. + if (!empty($spider_finds) && $modSettings['show_spider_online'] > 1) + foreach ($spider_finds as $id => $count) + { + $link = $spiders[$id] . ($count > 1 ? ' (' . $count . ')' : ''); + $sort = $membersOnlineOptions['sort'] = 'log_time' && $membersOnlineOptions['reverse_sort'] ? 0 : 'zzz_'; + $membersOnlineStats['users_online'][$sort . $spiders[$id]] = array( + 'id' => 0, + 'username' => $spiders[$id], + 'name' => $link, + 'group' => $txt['spiders'], + 'href' => '', + 'link' => $link, + 'is_buddy' => false, + 'hidden' => false, + 'is_last' => false, + ); + $membersOnlineStats['list_users_online'][$sort . $spiders[$id]] = $link; + } + + // Time to sort the list a bit. + if (!empty($membersOnlineStats['users_online'])) + { + // Determine the sort direction. + $sortFunction = empty($membersOnlineOptions['reverse_sort']) ? 'ksort' : 'krsort'; + + // Sort the two lists. + $sortFunction($membersOnlineStats['users_online']); + $sortFunction($membersOnlineStats['list_users_online']); + + // Mark the last list item as 'is_last'. + $userKeys = array_keys($membersOnlineStats['users_online']); + $membersOnlineStats['users_online'][end($userKeys)]['is_last'] = true; + } + + // Also sort the membergroups. + ksort($membersOnlineStats['online_groups']); + + // Hidden and non-hidden members make up all online members. + $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); + + return $membersOnlineStats; +} + +// Check if the number of users online is a record and store it. +function trackStatsUsersOnline($total_users_online) +{ + global $modSettings, $smcFunc; + + $settingsToUpdate = array(); + + // More members on now than ever were? Update it! + if (!isset($modSettings['mostOnline']) || $total_users_online >= $modSettings['mostOnline']) + $settingsToUpdate = array( + 'mostOnline' => $total_users_online, + 'mostDate' => time() + ); + + $date = strftime('%Y-%m-%d', forum_time(false)); + + // No entry exists for today yet? + if (!isset($modSettings['mostOnlineUpdated']) || $modSettings['mostOnlineUpdated'] != $date) + { + $request = $smcFunc['db_query']('', ' + SELECT most_on + FROM {db_prefix}log_activity + WHERE date = {date:date} + LIMIT 1', + array( + 'date' => $date, + ) + ); + + // The log_activity hasn't got an entry for today? + if ($smcFunc['db_num_rows']($request) === 0) + { + $smcFunc['db_insert']('ignore', + '{db_prefix}log_activity', + array('date' => 'date', 'most_on' => 'int'), + array($date, $total_users_online), + array('date') + ); + } + // There's an entry in log_activity on today... + else + { + list ($modSettings['mostOnlineToday']) = $smcFunc['db_fetch_row']($request); + + if ($total_users_online > $modSettings['mostOnlineToday']) + trackStats(array('most_on' => $total_users_online)); + + $total_users_online = max($total_users_online, $modSettings['mostOnlineToday']); + } + $smcFunc['db_free_result']($request); + + $settingsToUpdate['mostOnlineUpdated'] = $date; + $settingsToUpdate['mostOnlineToday'] = $total_users_online; + } + + // Highest number of users online today? + elseif ($total_users_online > $modSettings['mostOnlineToday']) + { + trackStats(array('most_on' => $total_users_online)); + $settingsToUpdate['mostOnlineToday'] = $total_users_online; + } + + if (!empty($settingsToUpdate)) + updateSettings($settingsToUpdate); +} + +?> \ No newline at end of file