311 lines
9.4 KiB
PHP
311 lines
9.4 KiB
PHP
<?php
|
|
/**
|
|
* <pre>
|
|
* Invision Power Services
|
|
* IP.Board v3.4.9
|
|
* Online list
|
|
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
|
|
* </pre>
|
|
*
|
|
* @author $Author: bfarber $
|
|
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
|
|
* @license http://www.invisionpower.com/company/standards.php#license
|
|
* @package IP.Board
|
|
* @subpackage Members
|
|
* @link http://www.invisionpower.com
|
|
* @since 12th March 2002
|
|
* @version $Revision: 10721 $
|
|
*/
|
|
|
|
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 public_members_online_online extends ipsCommand
|
|
{
|
|
/**
|
|
* Temporary stored output HTML
|
|
*
|
|
* @var string
|
|
*/
|
|
public $output;
|
|
|
|
/**
|
|
* DB result start point
|
|
*
|
|
* @var integer
|
|
*/
|
|
public $first = 0;
|
|
|
|
/**
|
|
* DB number of rows to pull
|
|
*
|
|
* @var integer
|
|
*/
|
|
public $perpage = 25;
|
|
|
|
/**
|
|
* Class entry point
|
|
*
|
|
* @param object Registry reference
|
|
* @return @e void [Outputs to screen/redirects]
|
|
*/
|
|
public function doExecute( ipsRegistry $registry )
|
|
{
|
|
//-----------------------------------------
|
|
// Are we allowed to see the online list?
|
|
//-----------------------------------------
|
|
|
|
if ( !$this->settings['allow_online_list'] )
|
|
{
|
|
$this->registry->output->showError( 'onlinelist_disabled', 10230 );
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Init, lang, html
|
|
//-----------------------------------------
|
|
|
|
$this->request['st'] = intval( $this->request['st'] >= 0 ? intval($this->request['st']) : 0 );
|
|
$this->registry->class_localization->loadLanguageFile( array( 'public_online' ), 'members' );
|
|
|
|
//-----------------------------------------
|
|
// What to do?
|
|
//-----------------------------------------
|
|
|
|
switch( $this->request['do'] )
|
|
{
|
|
case 'listall':
|
|
default:
|
|
$this->_listAll();
|
|
break;
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// If we have any HTML to print, do so...
|
|
//-----------------------------------------
|
|
|
|
$this->registry->output->addContent( $this->output );
|
|
$this->registry->output->setTitle( $this->lang->words['online_page_title'] . ' - ' . ipsRegistry::$settings['board_name']);
|
|
$this->registry->output->addNavigation( $this->lang->words['online_page_title'], '' );
|
|
$this->registry->output->sendOutput();
|
|
}
|
|
|
|
|
|
/**
|
|
* Show the online list
|
|
*
|
|
* @return @e void [Stores HTML in $this->output]
|
|
*/
|
|
protected function _listAll()
|
|
{
|
|
//-----------------------------------------
|
|
// INIT
|
|
//-----------------------------------------
|
|
|
|
$this->first = intval($this->request['st']) > 0 ? intval($this->request['st']) : 0;
|
|
$final = array();
|
|
$modules = array();
|
|
$memberIDs = array();
|
|
|
|
if ( !$this->settings['au_cutoff'] )
|
|
{
|
|
$this->settings[ 'au_cutoff'] = 15 ;
|
|
}
|
|
|
|
$defaults = array(
|
|
'show_mem' => ( $this->request['show_mem'] AND in_array( $this->request['show_mem'], array( 'reg', 'guest', 'all' ) ) ) ? $this->request['show_mem'] : 'all',
|
|
'sort_order' => ( $this->request['sort_order'] AND in_array( $this->request['sort_order'], array( 'desc', 'asc' ) ) ) ? $this->request['sort_order'] : 'asc',
|
|
'sort_key' => ( $this->request['sort_key'] AND in_array( $this->request['sort_key'], array( 'click', 'name' ) ) ) ? $this->request['sort_key'] : 'click',
|
|
);
|
|
|
|
//-----------------------------------------
|
|
// Sort the db query
|
|
//-----------------------------------------
|
|
|
|
$cut_off = $this->settings['au_cutoff'] * 60;
|
|
$t_time = time() - $cut_off;
|
|
|
|
$db_order = $defaults['sort_order'] == 'asc' ? 'asc' : 'desc';
|
|
$db_key = $defaults['sort_key'] == 'click' ? 'running_time' : 'member_name';
|
|
$wheres = array( 'running_time > ' . $t_time );
|
|
|
|
switch ( $defaults['show_mem'] )
|
|
{
|
|
case 'reg':
|
|
$wheres[] = "member_id > 0";
|
|
$wheres[] = "member_group != " . $this->settings['guest_group'];
|
|
break;
|
|
case 'guest':
|
|
$wheres[] = "member_group = " . $this->settings['guest_group'];
|
|
break;
|
|
}
|
|
|
|
if ( ! $this->settings['spider_active'] AND ! $this->memberData['g_access_cp'] )
|
|
{
|
|
$wheres[] = $this->DB->buildRight( 'id', 8 ) . " != '_session'";
|
|
}
|
|
|
|
if ( !$this->memberData['g_access_cp'] )
|
|
{
|
|
$wheres[] = "login_type != 1";
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Grab all the current sessions.
|
|
//-----------------------------------------
|
|
|
|
$this->DB->build( array( 'select' => '*',
|
|
'from' => 'sessions',
|
|
'where' => implode( ' AND ', $wheres ),
|
|
'calcRows' => TRUE,
|
|
'order' => $db_key . ' ' . $db_order,
|
|
'limit' => array( $this->first, $this->perpage ) ) );
|
|
|
|
$outer = $this->DB->execute();
|
|
|
|
$max = $this->DB->fetchCalculatedRows();
|
|
|
|
if ( ! $this->DB->getTotalRows($outer) && $this->first > 0 )
|
|
{
|
|
// We are request page 2 - but there is no page 2 now...
|
|
$this->registry->output->silentRedirect( $this->settings['base_url']."app=members&section=online&module=online&sortkey={$defaults['sort_key']}&show_mem={$defaults['show_mem']}&sort_order={$defaults['sort_order']}" );
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Put results into array
|
|
//-----------------------------------------
|
|
|
|
while( $r = $this->DB->fetch($outer) )
|
|
{
|
|
if ( strstr( $r['id'], '_session' ) )
|
|
{
|
|
$r['is_bot'] = 1;
|
|
}
|
|
|
|
$r['where_line'] = '';
|
|
$r['where_link'] = '';
|
|
|
|
//-----------------------------------------
|
|
// Sessions aren't updated until shutdown
|
|
// so reset our session now
|
|
//-----------------------------------------
|
|
|
|
if( $this->memberData['member_id'] AND $r['member_id'] == $this->memberData['member_id'] )
|
|
{
|
|
$r['current_appcomponent'] = 'members';
|
|
$r['current_module'] = 'online';
|
|
$r['current_section'] = 'online';
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Is this a member?
|
|
//-----------------------------------------
|
|
|
|
if ( $r['member_id'] )
|
|
{
|
|
$memberIDs[] = $r['member_id'];
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Don't parse if in an error
|
|
//-----------------------------------------
|
|
|
|
if ( $r['in_error'] )
|
|
{
|
|
$r['current_appcomponent'] = 'core';
|
|
}
|
|
|
|
$final[ $r['id'] ] = $r;
|
|
|
|
//-----------------------------------------
|
|
// Module?
|
|
//-----------------------------------------
|
|
|
|
$modules[ $r['current_section'] ] = array( 'app' => $r['current_appcomponent'] );
|
|
}
|
|
|
|
$links = $this->registry->output->generatePagination( array( 'totalItems' => $max,
|
|
'itemsPerPage' => $this->perpage,
|
|
'currentStartValue' => $this->first,
|
|
'baseUrl' => "app=members&section=online&module=online&sort_key={$defaults['sort_key']}&sort_order={$defaults['sort_order']}&show_mem={$defaults['show_mem']}"
|
|
) );
|
|
|
|
//-----------------------------------------
|
|
// Pass off entries to modules..
|
|
//-----------------------------------------
|
|
|
|
if ( count( $modules ) )
|
|
{
|
|
foreach( $modules as $module_array )
|
|
{
|
|
if( IPSLib::appIsInstalled( $module_array['app'] ) )
|
|
{
|
|
$module_array['app'] = IPSText::alphanumericalClean($module_array['app']);
|
|
|
|
$filename = IPSLib::getAppDir( $module_array['app'] ) . '/extensions/coreExtensions.php';
|
|
|
|
if ( is_file( $filename ) )
|
|
{
|
|
$classToLoad = IPSLib::loadLibrary( $filename, 'publicSessions__' . $module_array['app'], $module_array['app'] );
|
|
$loader = new $classToLoad();
|
|
|
|
if ( method_exists( $loader, 'parseOnlineEntries' ) )
|
|
{
|
|
$final = $loader->parseOnlineEntries( $final );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Finally, members...
|
|
//-----------------------------------------
|
|
|
|
if ( count( $memberIDs ) )
|
|
{
|
|
$members = IPSMember::load( $memberIDs, 'all' );
|
|
}
|
|
|
|
$newFinal = array();
|
|
|
|
if( is_array($final) AND count($final) )
|
|
{
|
|
foreach( $final as $id => $data )
|
|
{
|
|
if ( $data['member_id'] )
|
|
{
|
|
$newFinal[ 'member-' . $data['member_id'] ] = $data;
|
|
$newFinal[ 'member-' . $data['member_id'] ]['memberData'] = $members[ $data['member_id'] ];
|
|
$newFinal[ 'member-' . $data['member_id'] ]['_memberData'] = IPSMember::buildProfilePhoto( $members[ $data['member_id'] ] );
|
|
}
|
|
else
|
|
{
|
|
$newFinal[ $data['id'] ] = $data;
|
|
$newFinal[ $data['id'] ]['memberData'] = array();
|
|
$newFinal[ $data['id'] ]['_memberData'] = IPSMember::buildProfilePhoto( 0 );
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Set defaults
|
|
//-----------------------------------------
|
|
|
|
foreach ( array( 'sort_key', 'sort_order', 'show_mem' ) as $k )
|
|
{
|
|
if ( !$this->request[ $k ] )
|
|
{
|
|
$this->request[ $k ] = $defaults[ $k ];
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Output
|
|
//-----------------------------------------
|
|
|
|
$this->output .= $this->registry->getClass('output')->getTemplate('online')->showOnlineList( $newFinal, $links, $defaults );
|
|
}
|
|
} |