diff options
author | Meik Sievertsen <acydburn@phpbb.com> | 2005-02-10 20:19:48 +0000 |
---|---|---|
committer | Meik Sievertsen <acydburn@phpbb.com> | 2005-02-10 20:19:48 +0000 |
commit | 4269b318a29f3cff9da6bdf2f7cff959dcb0c961 (patch) | |
tree | edd09aa26c4d05d65bec79e31e5e92aa458d4415 /phpBB/viewonline.php | |
parent | 9841f6145c88a30d1d337a4e250ac379ac9b2700 (diff) | |
download | forums-4269b318a29f3cff9da6bdf2f7cff959dcb0c961.tar forums-4269b318a29f3cff9da6bdf2f7cff959dcb0c961.tar.gz forums-4269b318a29f3cff9da6bdf2f7cff959dcb0c961.tar.bz2 forums-4269b318a29f3cff9da6bdf2f7cff959dcb0c961.tar.xz forums-4269b318a29f3cff9da6bdf2f7cff959dcb0c961.zip |
change viewonline page slightly.
Mental Note: Step away from using in_array in conjunction with huge arrays (and within a loop), might get slow. ;)
git-svn-id: file:///svn/phpbb/trunk@5091 89ea8834-ac86-4346-8a33-228a782c2dd0
Diffstat (limited to 'phpBB/viewonline.php')
-rw-r--r-- | phpBB/viewonline.php | 289 |
1 files changed, 162 insertions, 127 deletions
diff --git a/phpBB/viewonline.php b/phpBB/viewonline.php index 98c47157bd..99ba2fa811 100644 --- a/phpBB/viewonline.php +++ b/phpBB/viewonline.php @@ -27,9 +27,10 @@ $session_id = request_var('s', ''); $start = request_var('start', 0); $sort_key = request_var('sk', 'b'); $sort_dir = request_var('sd', 'd'); +$show_guests= ($config['load_online_guests']) ? request_var('sg', 0) : 0; $sort_key_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_LOCATION'], 'c' => $user->lang['SORT_JOINED']); -$sort_key_sql = array('a' => 'username', 'b' => 'session_time', 'c' => 'session_page'); +$sort_key_sql = array('a' => 'u.username', 'b' => 's.session_time', 'c' => 's.session_page'); // Sorting and order $order_by = $sort_key_sql[$sort_key] . ' ' . (($sort_dir == 'a') ? 'ASC' : 'DESC'); @@ -37,12 +38,12 @@ $order_by = $sort_key_sql[$sort_key] . ' ' . (($sort_dir == 'a') ? 'ASC' : 'DESC // Whois requested if ($mode == 'whois') { - include($phpbb_root_path.'includes/functions_user.'.$phpEx); + include($phpbb_root_path . 'includes/functions_user.' . $phpEx); $sql = 'SELECT u.user_id, u.username, u.user_type, s.session_ip - FROM ' . USERS_TABLE . ' u, ' . SESSIONS_TABLE . " s - WHERE s.session_id = '$session_id' - AND u.user_id = s.session_user_id"; + FROM ' . USERS_TABLE . ' u, ' . SESSIONS_TABLE . " s + WHERE s.session_id = '" . $db->sql_escape($session_id) . "' + AND u.user_id = s.session_user_id"; $result = $db->sql_query($sql); if ($row = $db->sql_fetchrow($result)) @@ -81,28 +82,40 @@ while ($row = $db->sql_fetchrow($result)) } $db->sql_freeresult($result); +$guest_counter = 0; + +// Get number of online guests (if we do not display them) +if (!$show_guests) +{ + $sql = 'SELECT COUNT(DISTINCT session_ip) as num_guests FROM ' . SESSIONS_TABLE . ' + WHERE session_user_id = ' . ANONYMOUS . ' + AND session_time >= ' . (time() - ($config['load_online_time'] * 60)); + $result = $db->sql_query($sql); + $guest_counter = (int) $db->sql_fetchfield('num_guests', 0, $result); + $db->sql_freeresult($result); +} // Get user list $sql = 'SELECT u.user_id, u.username, u.user_type, u.user_allow_viewonline, u.user_colour, s.session_id, s.session_time, s.session_page, s.session_ip, s.session_viewonline FROM ' . USERS_TABLE . ' u, ' . SESSIONS_TABLE . ' s WHERE u.user_id = s.session_user_id - AND s.session_time >= ' . (time() - ($config['load_online_time'] * 60)) . ' + AND s.session_time >= ' . (time() - ($config['load_online_time'] * 60)) . + ((!$show_guests) ? ' AND s.session_user_id <> ' . ANONYMOUS : '') . ' ORDER BY ' . $order_by; $result = $db->sql_query($sql); -$prev_ip = $prev_id = array(); -$logged_visible_online = $logged_hidden_online = $guests_online = $reg_counter = $guest_counter = 0; +$prev_id = $prev_ip = $user_list = array(); +$logged_visible_online = $logged_hidden_online = $counter = 0; + while ($row = $db->sql_fetchrow($result)) { - $view_online = false; - - if ($row['user_id'] != ANONYMOUS && !in_array($row['user_id'], $prev_id)) + if ($row['user_id'] != ANONYMOUS && !isset($prev_id[$row['user_id']])) { - $username = $row['username']; - + $view_online = false; + if ($row['user_colour']) { - $username = '<b style="color:#' . $row['user_colour'] . '">' . $username . '</b>'; + $row['username'] = '<b style="color:#' . $row['user_colour'] . '">' . $row['username'] . '</b>'; } if (!$row['user_allow_viewonline'] || !$row['session_viewonline']) @@ -110,7 +123,7 @@ while ($row = $db->sql_fetchrow($result)) $view_online = ($auth->acl_get('u_viewonline')) ? true : false; $logged_hidden_online++; - $username = '<i>' . $username . '</i>'; + $row['username'] = '<i>' . $row['username'] . '</i>'; } else { @@ -118,131 +131,145 @@ while ($row = $db->sql_fetchrow($result)) $logged_visible_online++; } - $which_counter = 'reg_counter'; - $which_row = 'reg_user_row'; - $prev_id[] = $row['user_id']; + $prev_id[$row['user_id']] = 1; + + if ($view_online) + { + $counter++; + } + + if (!$view_online || $counter > $start + $config['topics_per_page'] || $counter <= $start) + { + continue; + } } - else if (!in_array($row['session_ip'], $prev_ip)) + else if ($show_guests && $row['user_id'] == ANONYMOUS && !isset($prev_ip[$row['session_ip']])) { - $username = $user->lang['GUEST']; - $view_online = true; - $guests_online++; + $prev_ip[$row['session_ip']] = 1; + $guest_counter++; + $counter++; - $which_counter = 'guest_counter'; - $which_row = 'guest_user_row'; - } + if ($counter > $start + $config['topics_per_page'] || $counter <= $start) + { + continue; + } - $prev_ip[] = $row['session_ip']; + $row['username'] = $user->lang['GUEST']; + } + else + { + continue; + } - if ($view_online) + preg_match('#^([a-z]+)#i', $row['session_page'], $on_page); + if (!sizeof($on_page)) { - preg_match('#^([a-z]+)#i', $row['session_page'], $on_page); + $on_page[1] = ''; + } - switch ($on_page[1]) - { - case 'index': - $location = $user->lang['INDEX']; - $location_url = "index.$phpEx$SID"; - break; + switch ($on_page[1]) + { + case 'index': + $location = $user->lang['INDEX']; + $location_url = "index.$phpEx$SID"; + break; - case 'posting': - case 'viewforum': - case 'viewtopic': - preg_match('#f=([0-9]+)#', $row['session_page'], $forum_id); - $forum_id = $forum_id[1]; + case 'posting': + case 'viewforum': + case 'viewtopic': + preg_match('#f=([0-9]+)#', $row['session_page'], $forum_id); + $forum_id = (sizeof($forum_id)) ? $forum_id[1] : 0; - if ($auth->acl_get('f_list', $forum_id)) - { - $location = ''; - switch ($on_page[1]) - { - case 'posting': - preg_match('#mode=([a-z]+)#', $row['session_page'], $on_page); - - switch ($on_page[1]) - { - case 'reply': - $location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]); - break; - default: - $location = sprintf($user->lang['POSTING_MESSAGE'], $forum_data[$forum_id]); - break; - } - break; - - case 'viewtopic': - $location = sprintf($user->lang['READING_TOPIC'], $forum_data[$forum_id]); - break; - - case 'viewforum': - $location .= sprintf($user->lang['READING_FORUM'], $forum_data[$forum_id]); - break; - } - - $location_url = "viewforum.$phpEx$SID&f=$forum_id"; - } - else + if ($auth->acl_get('f_list', $forum_id)) + { + $location = ''; + switch ($on_page[1]) { - $location = $user->lang['INDEX']; - $location_url = "index.$phpEx$SID"; + case 'posting': + preg_match('#mode=([a-z]+)#', $row['session_page'], $on_page); + + switch ($on_page[1]) + { + case 'reply': + $location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]); + break; + default: + $location = sprintf($user->lang['POSTING_MESSAGE'], $forum_data[$forum_id]); + break; + } + break; + + case 'viewtopic': + $location = sprintf($user->lang['READING_TOPIC'], $forum_data[$forum_id]); + break; + + case 'viewforum': + $location = sprintf($user->lang['READING_FORUM'], $forum_data[$forum_id]); + break; } - break; - case 'search': - $location = $user->lang['SEARCHING_FORUMS']; - $location_url = "search.$phpEx$SID"; - break; - - case 'faq': - $location = $user->lang['VIEWING_FAQ']; - $location_url = "faq.$phpEx$SID"; - break; - - case 'viewonline': - $location = $user->lang['VIEWING_ONLINE']; - $location_url = "viewonline.$phpEx$SID"; - break; + $location_url = "viewforum.$phpEx$SID&f=$forum_id"; + } + else + { + $location = $user->lang['INDEX']; + $location_url = "index.$phpEx$SID"; + } + break; - case 'memberlist': - $location = $user->lang['VIEWING_MEMBERS']; - $location_url = "memberlist.$phpEx$SID"; - break; + case 'search': + $location = $user->lang['SEARCHING_FORUMS']; + $location_url = "search.$phpEx$SID"; + break; - case 'ucp': - $location = $user->lang['VIEWING_UCP']; - $location_url = ''; + case 'faq': + $location = $user->lang['VIEWING_FAQ']; + $location_url = "faq.$phpEx$SID"; + break; - default: - $location = $user->lang['INDEX']; - $location_url = "index.$phpEx$SID"; - break; - } + case 'viewonline': + $location = $user->lang['VIEWING_ONLINE']; + $location_url = "viewonline.$phpEx$SID"; + break; - $template->assign_block_vars($which_row, array( - 'USERNAME' => $username, - 'LASTUPDATE' => $user->format_date($row['session_time']), - 'FORUM_LOCATION'=> $location, - 'USER_IP' => ($auth->acl_get('a_')) ? (($mode == 'lookup' && $session_id == $row['session_id']) ? gethostbyaddr($row['session_ip']) : $row['session_ip']) : '', + case 'memberlist': + $location = $user->lang['VIEWING_MEMBERS']; + $location_url = "memberlist.$phpEx$SID"; + break; - 'U_USER_PROFILE' => ($row['user_type'] <> USER_IGNORE) ? "memberlist.$phpEx$SID&mode=viewprofile&u=" . $row['user_id'] : '', - 'U_USER_IP' => "viewonline.$phpEx$SID" . (($mode != 'lookup' || $row['session_id'] != $session_id) ? '&mode=lookup&s=' . $row['session_id'] : ''), - 'U_WHOIS' => "viewonline.$phpEx$SID&mode=whois&s=" . $row['session_id'], - 'U_FORUM_LOCATION' => $location_url) - ); + case 'ucp': + $location = $user->lang['VIEWING_UCP']; + $location_url = ''; - $$which_counter++; + default: + $location = $user->lang['INDEX']; + $location_url = "index.$phpEx$SID"; + break; } + + $template->assign_block_vars('user_row', array( + 'USERNAME' => $row['username'], + 'LASTUPDATE' => $user->format_date($row['session_time']), + 'FORUM_LOCATION'=> $location, + 'USER_IP' => ($auth->acl_get('a_')) ? (($mode == 'lookup' && $session_id == $row['session_id']) ? gethostbyaddr($row['session_ip']) : $row['session_ip']) : '', + + 'U_USER_PROFILE' => ($row['user_type'] != USER_IGNORE && $row['user_id'] != ANONYMOUS) ? "{$phpbb_root_path}memberlist.$phpEx$SID&mode=viewprofile&u=" . $row['user_id'] : '', + 'U_USER_IP' => "{$phpbb_root_path}viewonline.$phpEx$SID" . (($mode != 'lookup' || $row['session_id'] != $session_id) ? '&s=' . $row['session_id'] : '') . "&mode=lookup&sg=$show_guests&start=$start&sk=$sort_key&sd=$sort_dir", + 'U_WHOIS' => "{$phpbb_root_path}viewonline.$phpEx$SID&mode=whois&s=" . $row['session_id'], + 'U_FORUM_LOCATION' => $phpbb_root_path . $location_url, + + 'S_GUEST' => ($row['user_id'] == ANONYMOUS) ? true : false, + 'S_USER_TYPE' => $row['user_type']) + ); } $db->sql_freeresult($result); -unset($prev_id); -unset($prev_ip); - +unset($prev_id, $prev_ip); // Generate reg/hidden/guest online text $vars_online = array( 'REG' => array('logged_visible_online', 'l_r_user_s'), 'HIDDEN'=> array('logged_hidden_online', 'l_h_user_s'), - 'GUEST' => array('guests_online', 'l_g_user_s') + 'GUEST' => array('guest_counter', 'l_g_user_s') ); foreach ($vars_online as $l_prefix => $var_ary) @@ -264,34 +291,42 @@ foreach ($vars_online as $l_prefix => $var_ary) } unset($vars_online); +$pagination = generate_pagination("{$phpbb_root_path}viewonline.$phpEx$SID&sg=$show_guests&sk=$sort_key&sd=$sort_dir", $counter, $config['topics_per_page'], $start); // Grab group details for legend display -$sql = 'SELECT group_name, group_colour, group_type - FROM ' . GROUPS_TABLE . " - WHERE group_colour <> '' - AND group_type NOT IN (" . GROUP_HIDDEN . ', ' . GROUP_SPECIAL . ')'; +$sql = 'SELECT group_id, group_name, group_colour, group_type + FROM ' . GROUPS_TABLE . ' + WHERE group_legend = 1'; $result = $db->sql_query($sql); $legend = ''; while ($row = $db->sql_fetchrow($result)) { - $legend .= (($legend != '') ? ', ' : '') . '<span style="color:#' . $row['group_colour'] . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</span>'; + $legend .= (($legend != '') ? ', ' : '') . '<a style="color:#' . $row['group_colour'] . '" href="memberlist.' . $phpEx . $SID . '&mode=group&g=' . $row['group_id'] . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</a>'; } $db->sql_freeresult($result); - // Send data to template $template->assign_vars(array( 'TOTAL_REGISTERED_USERS_ONLINE' => sprintf($l_r_user_s, $logged_visible_online) . sprintf($l_h_user_s, $logged_hidden_online), - 'TOTAL_GUEST_USERS_ONLINE' => sprintf($l_g_user_s, $guests_online), - 'LEGEND' => $legend, - 'META' => '<meta http-equiv="refresh" content="60; url=viewonline.' . $phpEx . $SID . '">', - - 'U_SORT_USERNAME' => "viewonline.$phpEx$SID&sk=a&sd=" . (($sort_key == 'a' && $sort_dir == 'a') ? 'd' : 'a'), - 'U_SORT_UPDATED' => "viewonline.$phpEx$SID&sk=b&sd=" . (($sort_key == 'b' && $sort_dir == 'a') ? 'd' : 'a'), - 'U_SORT_LOCATION' => "viewonline.$phpEx$SID&sk=c&sd=" . (($sort_key == 'c' && $sort_dir == 'a') ? 'd' : 'a')) + 'TOTAL_GUEST_USERS_ONLINE' => sprintf($l_g_user_s, $guest_counter), + 'LEGEND' => $legend, + 'META' => '<meta http-equiv="refresh" content="60; url=viewonline.' . $phpEx . $SID . '">', + 'PAGINATION' => $pagination, + 'PAGE_NUMBER' => on_page($counter, $config['topics_per_page'], $start), + + 'U_SORT_USERNAME' => "{$phpbb_root_path}viewonline.$phpEx$SID&sk=a&sd=" . (($sort_key == 'a' && $sort_dir == 'a') ? 'd' : 'a'), + 'U_SORT_UPDATED' => "{$phpbb_root_path}viewonline.$phpEx$SID&sk=b&sd=" . (($sort_key == 'b' && $sort_dir == 'a') ? 'd' : 'a'), + 'U_SORT_LOCATION' => "{$phpbb_root_path}viewonline.$phpEx$SID&sk=c&sd=" . (($sort_key == 'c' && $sort_dir == 'a') ? 'd' : 'a'), + + 'U_SWITCH_GUEST_DISPLAY' => "{$phpbb_root_path}viewonline.$phpEx$SID&sg=" . ((int) !$show_guests), + 'L_SWITCH_GUEST_DISPLAY' => ($show_guests) ? $user->lang['HIDE_GUESTS'] : $user->lang['DISPLAY_GUESTS'], + 'S_SWITCH_GUEST_DISPLAY' => ($config['load_online_guests']) ? true : false) ); +// We do not need to load the who is online box here. ;) +$config['load_online'] = false; + // Output the page page_header($user->lang['WHO_IS_ONLINE']); |