online.php
来自「sabreipb 2.1.6 utf-8中文版本!」· PHP 代码 · 共 522 行
PHP
522 行
<?php/*+--------------------------------------------------------------------------| Invision Power Board v2.1.5| =============================================| by Matthew Mecham| (c) 2001 - 2005 Invision Power Services, Inc.| | =============================================| Web: | Time: Wed, 01 Mar 2006 19:11:27 GMT| Release: | Licence Info: +---------------------------------------------------------------------------| > $Date: 2005-10-10 14:08:54 +0100 (Mon, 10 Oct 2005) $| > $Revision: 23 $| > $Author: matt $+---------------------------------------------------------------------------|| > Show online users| > Module written by Matt Mecham| > Date started: 12th March 2002|| > Module Version Number: 1.0.0| > DBA Checked: Thu 20 May 2004| > Quality Checked: Wed 15 Sept. 2004+--------------------------------------------------------------------------*/if ( ! defined( 'IN_IPB' ) ){ print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files."; exit();}class online{ var $output = ""; var $page_title = ""; var $nav = array(); var $html = ""; var $first = 0; var $perpage = 25; var $forums = array(); var $cats = array(); var $sessions = array(); var $where = array(); var $seen_name = array(); /*-------------------------------------------------------------------------*/ // AUTO RUN /*-------------------------------------------------------------------------*/ function auto_run() { //----------------------------------------- // Are we allowed to see the online list? //----------------------------------------- $this->ipsclass->input['st'] = intval($this->ipsclass->input['st']); if ( $this->ipsclass->vars['allow_online_list'] != 1 ) { $this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'no_permission') ); } //----------------------------------------- // Require the HTML and language modules //----------------------------------------- $this->ipsclass->load_language('lang_online'); $this->ipsclass->load_template('skin_online'); $this->base_url = $this->ipsclass->base_url; //----------------------------------------- // Build up our language hash //----------------------------------------- foreach ($this->ipsclass->lang as $k => $v) { if ( preg_match( "/^WHERE_(\w+)$/", $k, $match ) ) { $this->where[ $match[1] ] = $this->ipsclass->lang[$k]; } } unset($match); //----------------------------------------- // What to do? //----------------------------------------- switch($this->ipsclass->input['CODE']) { case 'listall': $this->list_all(); break; default: $this->list_all(); break; } //----------------------------------------- // If we have any HTML to print, do so... //----------------------------------------- $this->ipsclass->print->add_output("$this->output"); $this->ipsclass->print->do_output( array( 'TITLE' => $this->page_title, 'JS' => 0, NAV => $this->nav ) ); } /*-------------------------------------------------------------------------*/ // list_all // ------------------ // List all online users /*-------------------------------------------------------------------------*/ function list_all() { //----------------------------------------- // INIT //----------------------------------------- $this->first = intval($this->ipsclass->input['st']); $show_mem_html = ""; $sort_order_html = ""; $sort_key_html = ""; $final = array(); $tid_array = array(); $topics = array(); $modules = array(); $final_modules = array(); $show_mem = array( 'reg', 'guest', 'all' ); $sort_order = array( 'desc', 'asc' ); $sort_key = array( 'click', 'name' ); $show_mem_value = $this->ipsclass->input['show_mem'] ? $this->ipsclass->input['show_mem'] : 'all'; $sort_order_value = $this->ipsclass->input['sort_order'] ? $this->ipsclass->input['sort_order'] : 'desc'; $sort_key_value = $this->ipsclass->input['sort_key'] ? $this->ipsclass->input['sort_key'] : 'click'; //----------------------------------------- // Build lists //----------------------------------------- $oo = "<option "; $oc = "</option>\n"; foreach( $show_mem as $k ) { $s = ""; if ( $show_mem_value == $k ) { $s = ' selected="selected" '; } $show_mem_html .= $oo.'value="'.$k.'"'.$s.'>'.$this->ipsclass->lang['s_show_mem_'.$k].$oc; } foreach( $sort_order as $k ) { $s = ""; if ( $sort_order_value == $k ) { $s = ' selected="selected" '; } $sort_order_html .= $oo.'value="'.$k.'"'.$s.'>'.$this->ipsclass->lang['s_sort_order_'.$k].$oc; } foreach( $sort_key as $k ) { $s = ""; if ( $sort_key_value == $k ) { $s = ' selected="selected" '; } $sort_key_html .= $oo.'value="'.$k.'"'.$s.'>'.$this->ipsclass->lang['s_sort_key_'.$k].$oc; } if ($this->ipsclass->vars['au_cutoff'] == "") { $this->ipsclass->vars['au_cutoff'] = 15; } $cut_off = $this->ipsclass->vars['au_cutoff'] * 60; $t_time = time() - $cut_off; $db_order = $sort_order_value == 'asc' ? 'asc' : 'desc'; $db_key = $sort_key_value == 'click' ? 'running_time' : 'member_name'; switch ($show_mem_value) { case 'reg': $db_mem = " AND s.member_id != 0 AND s.member_group <> {$this->ipsclass->vars['guest_group']}"; break; case 'guest': $db_mem = " AND s.member_group = {$this->ipsclass->vars['guest_group']} "; break; default: $db_mem = ""; break; } $max = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'COUNT(*) as total_sessions', 'from' => 'sessions s', 'where' => "running_time > $t_time".$db_mem ) ); $links = $this->ipsclass->build_pagelinks( array( 'TOTAL_POSS' => $max['total_sessions'], 'PER_PAGE' => 25, 'CUR_ST_VAL' => $this->first, 'L_SINGLE' => "", 'L_MULTI' => $this->ipsclass->lang['pages'], 'BASE_URL' => $this->base_url."act=Online&CODE=listall&sort_key=$sort_key_value&sort_order=$sort_order_value&show_mem=$show_mem_value" ) ); $this->output = $this->ipsclass->compiled_templates['skin_online']->Page_header($links); //----------------------------------------- // Grab all the current sessions. //----------------------------------------- $this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'sessions s', 'where' => "s.running_time > $t_time $db_mem", 'order' => "$db_key $db_order", 'limit' => array( $this->first, 25 ) ) ); $this->ipsclass->DB->simple_exec(); while( $r = $this->ipsclass->DB->fetch_row() ) { $r['prefix'] = $this->ipsclass->cache['group_cache'][ $r['member_group'] ]['prefix']; $r['suffix'] = $this->ipsclass->cache['group_cache'][ $r['member_group'] ]['suffix']; $final[ $r['id'] ] = $r; //----------------------------------------- // Module? //----------------------------------------- if ( strstr( $r['location'], 'mod:' ) ) { $modules[ str_replace( 'mod:', '', $r['location'] ) ] [ $r['id'] ] = $r; } //----------------------------------------- // IN topic? //----------------------------------------- if ( $r['location_1_id'] AND $r['location_1_type'] == 'topic' ) { $tid_array[ $r['location_1_id'] ] = $r['location_1_id']; } } //----------------------------------------- // Post process modules //----------------------------------------- if ( count( $modules ) ) { foreach( $modules as $module_name => $module_array ) { $filename = ROOT_PATH.'sources/components_location/'.$this->ipsclass->txt_alphanumerical_clean( $module_name ).'.php'; if ( file_exists( $filename ) ) { require_once( $filename ); $toload = 'components_location_'.$module_name; $loader = new $toload; $loader->ipsclass =& $this->ipsclass; $tmp = $loader->parse_online_entries( $module_array ); if ( is_array( $tmp ) and count( $tmp ) ) { foreach( $tmp as $ssid => $arr ) { $final[ $ssid ] = $arr; } } } } } //----------------------------------------- // Do topics //----------------------------------------- if ( count($tid_array) > 0 ) { $tid_string = implode( ",", $tid_array ); $this->ipsclass->DB->simple_construct( array( 'select' => 'tid, title', 'from' => 'topics', 'where' => "tid IN ($tid_string)" ) ); $this->ipsclass->DB->simple_exec(); while ( $t = $this->ipsclass->DB->fetch_row() ) { $topics[ $t['tid'] ] = $t['title']; } } //----------------------------------------- // LOOPY //----------------------------------------- foreach( $final as $idx => $sess ) { //----------------------------------------- // Is this a member, and have we seen them before? // Proxy servers, etc can confuse the session handler, // creating duplicate session IDs for the same user when // their IP address changes. //----------------------------------------- $inv = ''; if ( strstr( $sess['id'], '_session' ) ) { $sess['is_bot'] = 1; if ( $this->ipsclass->vars['spider_anon'] ) { if ( $this->ipsclass->member['mgroup'] == $this->ipsclass->vars['admin_group'] ) { $inv = '*'; } else { $sess['member_id'] = ''; $sess['member_name'] = ''; $sess['in_error'] = 1; } } } else if ($sess['login_type'] == 1) { if ( ($this->ipsclass->member['mgroup'] == $this->ipsclass->vars['admin_group']) and ($this->ipsclass->vars['disable_admin_anon'] != 1) ) { $inv = '*'; } else { $sess['member_id'] = ''; $sess['member_name'] = ''; $sess['in_error'] = 1; $sess['prefix'] = ""; $sess['suffix'] = ""; } } //----------------------------------------- // ICheck for dupes //----------------------------------------- if ( ! empty($sess['member_name']) ) { if (isset($this->seen_name[ $sess['member_name'] ]) ) { continue; } else { $this->seen_name[ $sess['member_name'] ] = 1; } } //----------------------------------------- // Figure out location //----------------------------------------- if ( $sess['in_error'] ) { $line = " {$this->ipsclass->lang['board_index']}"; } else if ( $sess['location'] OR $sess['_parsed'] ) { $line = ""; //----------------------------------------- // PARSED? //----------------------------------------- if ( $sess['_parsed'] ) { $line = "<a href='{$sess['_url']}'>{$sess['_text']}</a>"; } //----------------------------------------- // NOT PARSED //----------------------------------------- else { list($act, $pid) = explode( ",", $sess['location'] ); $fid = ($sess['location_2_type'] == 'forum' AND $sess['location_2_id']) ? $sess['location_2_id'] : 0; $tid = ($sess['location_1_type'] == 'topic' AND $sess['location_1_id']) ? $sess['location_1_id'] : 0; $act = strtolower($act); //----------------------------------------- // Really in a forum? //----------------------------------------- if ( $act == 'sf' && ! $fid ) { $act = ''; } if ( $act == 'st' && ! $tid ) { $act = ''; } if ( $act == 'post' && ! $fid ) { $act = ''; } if ( isset($act) ) { $line = isset($this->where[ $act ]) ? $this->where[ $act ] : $this->ipsclass->lang['board_index']; } if ( $fid != "" and ($act == 'sf' or $act == 'st' or $act == 'post')) { $deny = 1; $deny = $this->ipsclass->forums->forums_quick_check_access( $fid ); if ($deny != 1) { if ( ($tid > 0) and ($act != 'post') ) { $line .= " <a href='{$this->base_url}showtopic=$tid'>{$topics[$tid]}</a>"; } else { $line .= " <a href='{$this->base_url}showforum=$fid'>{$this->ipsclass->forums->forum_by_id[ $fid ]['name']}</a>"; } } else { $line = " {$this->ipsclass->lang['board_index']}"; } } } } else { $line = " {$this->ipsclass->lang['board_index']}"; } $sess['where_line'] = $line; if ( ($this->ipsclass->member['mgroup'] == $this->ipsclass->vars['admin_group']) and ($this->ipsclass->vars['disable_online_ip'] != 1) ) { $sess['ip_address'] = " ( ".$sess['ip_address']." )"; } else { $sess['ip_address'] = ""; } if ( ($sess['member_id']) ) { $sess['member_name'] = "<a href='{$this->base_url}showuser={$sess['member_id']}'>{$sess['prefix']}{$sess['member_name']}{$sess['suffix']}</a>$inv {$sess['ip_address']}"; } $sess['running_time'] = $this->ipsclass->get_date( $sess['running_time'], 'LONG' ); $this->output .= $this->do_html_row($sess); } $this->output .= $this->ipsclass->compiled_templates['skin_online']->Page_end($show_mem_html, $sort_order_html, $sort_key_html, $links); $this->page_title = $this->ipsclass->lang['page_title']; $this->nav = array( $this->ipsclass->lang['page_title']); } /*-------------------------------------------------------------------------*/ // Process row /*-------------------------------------------------------------------------*/ function do_html_row($sess) { if ($sess['member_name'] and $sess['member_id']) { $sess['msg_icon'] = "<a href='{$this->base_url}act=Msg&CODE=04&MID={$sess['member_id']}'><{P_MSG}></a>"; } else { if ( ! $sess['is_bot'] ) { $sess['member_name'] = $sess['prefix'].$this->ipsclass->lang['guest'].$sess['suffix']." ".$sess['ip_address']; $sess['msg_icon'] = ' '; } else { $sess['member_name'] .= ' '.$sess['ip_address']; } } return $this->ipsclass->compiled_templates['skin_online']->show_row($sess); } }?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?