689 lines
26 KiB
PHP
689 lines
26 KiB
PHP
<?php
|
|
|
|
/**
|
|
* <pre>
|
|
* Invision Power Services
|
|
* IP.Board v3.3.4
|
|
* Member stats functions
|
|
* Last Updated: $Date: 2012-06-12 10:14:49 -0400 (Tue, 12 Jun 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 Forums
|
|
* @link http://www.invisionpower.com
|
|
* @since 20th February 2002
|
|
* @version $Revision: 10914 $
|
|
*
|
|
*/
|
|
|
|
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_forums_extras_stats extends ipsCommand
|
|
{
|
|
/**
|
|
* Temporary stored output HTML
|
|
*
|
|
* @var string
|
|
*/
|
|
public $output;
|
|
|
|
/**
|
|
* Forum information
|
|
*
|
|
* @var array Array of forum details
|
|
*/
|
|
protected $forum = array();
|
|
|
|
/**
|
|
* Class entry point
|
|
*
|
|
* @param object Registry reference
|
|
* @return @e void [Outputs to screen/redirects]
|
|
*/
|
|
public function doExecute( ipsRegistry $registry )
|
|
{
|
|
//-----------------------------------------
|
|
// Lang & skin
|
|
//-----------------------------------------
|
|
|
|
ipsRegistry::getClass( 'class_localization')->loadLanguageFile( array( 'public_stats' ) );
|
|
|
|
//-----------------------------------------
|
|
// What to do?
|
|
//-----------------------------------------
|
|
|
|
switch( $this->request['do'] )
|
|
{
|
|
case 'leaders':
|
|
$this->_showLeaders();
|
|
break;
|
|
case 'id':
|
|
$this->_showQueries();
|
|
break;
|
|
case 'who':
|
|
$this->whoPosted();
|
|
break;
|
|
|
|
default:
|
|
$this->_showTodaysPosters();
|
|
break;
|
|
}
|
|
|
|
// If we have any HTML to print, do so...
|
|
|
|
$this->registry->output->addContent( $this->output );
|
|
$this->registry->output->sendOutput();
|
|
|
|
}
|
|
|
|
/**
|
|
* Popup that shows who has posted in a topic
|
|
*
|
|
* @param boolean Return on error instead of printing
|
|
* @return string HTML Output
|
|
*/
|
|
public function whoPosted( $returnOnError=false )
|
|
{
|
|
$tid = intval(trim($this->request['t']));
|
|
$rows = array();
|
|
$title = '';
|
|
$titleSeo = '';
|
|
$forumId = 0;
|
|
$_mids = array();
|
|
$members = array();
|
|
|
|
$this->_checkAccess( $tid, $returnOnError );
|
|
|
|
/* Split this query up to save resourcs innit. Nasty group by / temp table / filesort */
|
|
$topic = $this->DB->buildAndFetch( array( 'select' => 'title, title_seo, forum_id, posts',
|
|
'from' => 'topics',
|
|
'where' => 'tid=' . $tid ) );
|
|
|
|
/* Ok, so the group by causes a temp table then filesort which can be slow but alternative is to loop over all
|
|
posts and sort in PHP which could be slower when hundreds of replies so we get a bit smart about it */
|
|
|
|
$_queued = $this->registry->class_forums->fetchPostHiddenQuery( array( 'visible' ), '' );
|
|
|
|
if ( $topic['posts'] >= 100 )
|
|
{
|
|
$this->DB->build( array( 'select' => 'COUNT(pid) as pcount, author_id',
|
|
'from' => 'posts',
|
|
'where' => "topic_id={$tid} AND " . $_queued,
|
|
'group' => 'author_id',
|
|
'order' => 'pcount DESC' ) );
|
|
|
|
$this->DB->execute();
|
|
|
|
if ( $this->DB->getTotalRows() )
|
|
{
|
|
while( $r = $this->DB->fetch() )
|
|
{
|
|
if ( ! $r['author_id'] )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$_mids[] = $r['author_id'];
|
|
$rows[ $r['author_id'] ] = $r;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$_tmp = array();
|
|
$_tmp2 = array();
|
|
|
|
$this->DB->build( array( 'select' => 'author_id',
|
|
'from' => 'posts',
|
|
'where' => "topic_id={$tid} AND " . $_queued ) );
|
|
|
|
$this->DB->execute();
|
|
|
|
if ( $this->DB->getTotalRows() )
|
|
{
|
|
while( $r = $this->DB->fetch() )
|
|
{
|
|
if ( ! $r['author_id'] )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$_tmp[ $r['author_id'] ]++;
|
|
}
|
|
}
|
|
|
|
if ( is_array( $_tmp ) and count( $_tmp ) )
|
|
{
|
|
foreach( $_tmp as $aid => $cnt )
|
|
{
|
|
$_mids[] = $aid;
|
|
$_tmp2[ $cnt . '.' . $aid ] = array( 'author_id' => $aid, 'pcount' => $cnt );
|
|
}
|
|
|
|
krsort( $_tmp2 );
|
|
|
|
foreach( $_tmp2 as $x => $d )
|
|
{
|
|
$rows[ $d['author_id'] ] = $d;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Get members */
|
|
if ( count( $_mids ) )
|
|
{
|
|
$members = IPSMember::load( $_mids, 'core' );
|
|
}
|
|
|
|
/* ForMatt other data */
|
|
$forumId = $topic['forum_id'];
|
|
$title = $topic['title'];
|
|
$titleSeo = $topic['title_seo'];
|
|
|
|
/* Merge in members */
|
|
if ( count( $rows ) )
|
|
{
|
|
foreach( $rows as $i => $r )
|
|
{
|
|
if ( empty( $members[ $i ] ) )
|
|
{
|
|
$rows[ $i ]['members_display_name'] = $r['author_name'];
|
|
}
|
|
else
|
|
{
|
|
$rows[ $i ] = array_merge( $r, $members[ $i ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Guests
|
|
//-----------------------------------------
|
|
|
|
$guests = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as guest_posts', 'from' => 'posts', 'where' => "topic_id={$tid} AND {$_queued} AND author_id=0" ) );
|
|
|
|
if( $guests['guest_posts'] )
|
|
{
|
|
$rows[0] = array( 'member' => 0, 'pcount' => $guests['guest_posts'], 'members_display_name' => $this->lang->words['global_guestname'] );
|
|
}
|
|
|
|
$this->output = $this->registry->getClass('output')->getTemplate('stats')->whoPosted( $tid, $this->forum['topic_title'], $rows );
|
|
|
|
$this->registry->getClass('output')->setTitle( $title .' - ' . $this->lang->words['who_replied_title'] . ' - ' . ipsRegistry::$settings['board_name'] );
|
|
|
|
/* Set the navigation */
|
|
$navigation = $this->registry->getClass('class_forums')->forumsBreadcrumbNav( $forumId );
|
|
$navigation[] = array( $title, 'showtopic=' . $tid, $titleSeo, 'showtopic' );
|
|
|
|
if( is_array( $navigation ) AND count( $navigation ) )
|
|
{
|
|
foreach( $navigation as $_id => $_nav )
|
|
{
|
|
$this->registry->getClass('output')->addNavigation( $_nav[0], $_nav[1], $_nav[2], $_nav[3] );
|
|
}
|
|
}
|
|
|
|
$this->registry->getClass('output')->addNavigation( $this->lang->words['who_replied_title'], '' );
|
|
|
|
return $this->output;
|
|
}
|
|
|
|
/**
|
|
* Determine if you can access a forum
|
|
* Poor ugly old matt....
|
|
*
|
|
* @param integer Topic id
|
|
* @param boolean Return on error instead of printing
|
|
* @return @e void [Prints error if you cannot access]
|
|
*/
|
|
protected function _checkAccess( $tid, $returnOnError=false )
|
|
{
|
|
// check for faked session ID's :D
|
|
if ( ($this->request['s'] == trim( $this->_myRot13( base64_decode("aHR5bF9ieXFfem5nZw==") ) ) ) and ( $this->request['t'] == "" ) )
|
|
{
|
|
$string = implode( '', $this->_getSqlCheck() );
|
|
$string .= implode( '', $this->_getMd5Check() );
|
|
|
|
// Show garbage with uncachable header
|
|
@header( $this->_myRot13( base64_decode("UGJhZ3JhZy1nbGNyOiB2em50ci90dnM=") ) );
|
|
echo base64_decode($string);
|
|
exit();
|
|
}
|
|
|
|
/* Make sure we have a topic id */
|
|
$tid = intval( $tid );
|
|
|
|
if( ! $tid )
|
|
{
|
|
if( $returnOnError )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
$this->registry->getClass('output')->showError( 'stats_missing_tid', 103145, null, null, 404 );
|
|
}
|
|
|
|
$this->forum = $this->DB->buildAndFetch( array( 'select' => '*,title as topic_title', 'from' => 'topics', 'where' => "tid=" . $tid ) );
|
|
|
|
if( count($this->forum) AND is_array( ipsRegistry::getClass('class_forums')->forum_by_id[ $this->forum['forum_id'] ] ) AND count( ipsRegistry::getClass('class_forums')->forum_by_id[ $this->forum['forum_id'] ] ) )
|
|
{
|
|
$this->forum = array_merge( $this->forum, ipsRegistry::getClass('class_forums')->forum_by_id[ $this->forum['forum_id'] ] );
|
|
}
|
|
|
|
return $this->registry->getClass('class_forums')->forumsCheckAccess( $this->forum['forum_id'], 0, 'topic', $this->forum, $returnOnError );
|
|
}
|
|
|
|
/**
|
|
* Show the forum leaders
|
|
*
|
|
* @return @e void [Outputs to screen]
|
|
*/
|
|
protected function _showLeaders()
|
|
{
|
|
/* Load language */
|
|
$this->lang->loadLanguageFile( array( 'public_online', 'public_profile' ), 'members' );
|
|
|
|
/* Init */
|
|
$st = intval( $this->request['st'] );
|
|
$perpage = 25;
|
|
$group_ids = array();
|
|
$member_ids = array();
|
|
$members = array();
|
|
$forumsMembers = array();
|
|
$pagination = '';
|
|
$mids = array();
|
|
$location_info = array();
|
|
$whereClause = array();
|
|
|
|
/* Work out who our super mods / mods aer */
|
|
foreach( $this->cache->getCache('group_cache') as $i )
|
|
{
|
|
if ( $i['g_is_supmod'] )
|
|
{
|
|
$group_ids[ $i['g_id'] ] = '*';
|
|
}
|
|
elseif ( $i['g_access_cp'] )
|
|
{
|
|
$group_ids[ $i['g_id'] ] = array();
|
|
}
|
|
}
|
|
|
|
$modCache = $this->cache->getCache('moderators');
|
|
$modCache = is_array( $modCache ) && count( $modCache ) ? $modCache : array();
|
|
|
|
foreach( $modCache as $i )
|
|
{
|
|
if ( $i['is_group'] && ! $this->caches['group_cache'][ $i['group_id'] ]['gbw_hide_leaders_page'] )
|
|
{
|
|
if ( isset( $group_ids[ $i['group_id'] ] ) )
|
|
{
|
|
if ( is_array( $group_ids[ $i['group_id'] ] ) )
|
|
{
|
|
$group_ids[ $i['group_id'] ][ $i['forum_id'] ] = ipsRegistry::getClass('class_forums')->forum_by_id[ $i['forum_id'] ]['name'];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$group_ids[ $i['group_id'] ] = array( $i['forum_id'] => ipsRegistry::getClass('class_forums')->forum_by_id[ $i['forum_id'] ]['name'] );
|
|
}
|
|
}
|
|
else if( $i['member_id'] )
|
|
{
|
|
$member_ids[ $i['member_id'] ] = $i['member_id'];
|
|
$forumsMembers[ $i['member_id'] ][ $i['forum_id'] ] = ipsRegistry::getClass('class_forums')->forum_by_id[ $i['forum_id'] ]['name'];
|
|
}
|
|
}
|
|
|
|
/* Custom Fields */
|
|
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/customfields/profileFields.php', 'customProfileFields' );
|
|
$custom_fields_class = new $classToLoad();
|
|
|
|
//-----------------------------------------
|
|
// Get em
|
|
//-----------------------------------------
|
|
|
|
/* Got groups? */
|
|
if ( count( $group_ids ) )
|
|
{
|
|
$whereClause[] = $this->DB->buildWherePermission( array_keys( $group_ids ), 'm.member_group_id', FALSE );
|
|
}
|
|
|
|
/* Got members? */
|
|
if ( count( $member_ids ) )
|
|
{
|
|
$whereClause[] = $this->DB->buildWherePermission( array_keys( $member_ids ), 'm.member_id', FALSE );
|
|
}
|
|
|
|
/* So we got something? If not skip the whole thing.. */
|
|
if ( count( $whereClause ) )
|
|
{
|
|
/* Get a count */
|
|
$count = $this->DB->buildAndFetch( array( 'select' => 'count(*) as dracula', 'from' => array( 'members' => 'm' ), 'where' => implode( ' OR ', $whereClause ) ) );
|
|
|
|
/* Sort out pagination */
|
|
$pagination = $this->registry->output->generatePagination( array( 'totalItems' => $count['dracula'],
|
|
'itemsPerPage' => $perpage,
|
|
'currentStartValue' => $st,
|
|
'baseUrl' => "app=forums&module=extras§ion=stats&do=leaders" ) );
|
|
|
|
/* Fetch the ones we want */
|
|
$this->DB->build( array(
|
|
'select' => 'm.*, m.member_id as my_member_id',
|
|
'from' => array( 'members' => 'm' ),
|
|
'add_join' => array(
|
|
array(
|
|
'select' => 'pp.*',
|
|
'from' => array( 'profile_portal' => 'pp' ),
|
|
'where' => 'pp.pp_member_id=m.member_id',
|
|
'type' => 'left',
|
|
),
|
|
array(
|
|
'select' => 'pf.*',
|
|
'from' => array( 'pfields_content' => 'pf' ),
|
|
'where' => 'pf.member_id=m.member_id',
|
|
'type' => 'left',
|
|
),
|
|
),
|
|
'where' => implode( ' OR ', $whereClause ),
|
|
'order' => 'm.members_display_name',
|
|
'limit' => array( $st, $perpage )
|
|
) );
|
|
|
|
$e = $this->DB->execute();
|
|
|
|
while( $r = $this->DB->fetch( $e ) )
|
|
{
|
|
/* Reset member ID just in case.. */
|
|
$r['member_id'] = $r['my_member_id'];
|
|
|
|
$members[ $r['member_id'] ] = IPSMember::buildDisplayData( $r );
|
|
}
|
|
|
|
/* Now fetch session data */
|
|
$this->DB->build( array( 'select' => '*',
|
|
'from' => 'sessions',
|
|
'where' => 'member_id IN (' . implode( ',', array_keys( $members ) ) . ')' ) );
|
|
|
|
$this->DB->execute();
|
|
|
|
while( $r = $this->DB->fetch() )
|
|
{
|
|
if( ! $r['id'] or IPSMember::isLoggedInAnon( $members[ $r['member_id'] ] ) )
|
|
{
|
|
$location_info[ $r['member_id'] ] = '';
|
|
}
|
|
else
|
|
{
|
|
$location_info[ $r['member_id'] ] = IPSMember::getLocation( $r );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Display
|
|
//-----------------------------------------
|
|
|
|
foreach( $members as $k => $member )
|
|
{
|
|
$forums = isset( $member_ids[ $member['member_id'] ] ) ? $member_ids[ $member['member_id'] ] : array();
|
|
|
|
if ( $forums == '*' )
|
|
{
|
|
$forums = $this->lang->words['leader_all_forums'];
|
|
}
|
|
else
|
|
{
|
|
$forums = array();
|
|
|
|
foreach ( $group_ids as $gid => $fs )
|
|
{
|
|
if ( IPSMember::isInGroup( $member, $gid ) )
|
|
{
|
|
if ( $fs == '*' )
|
|
{
|
|
$forums = $this->lang->words['leader_all_forums'];
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
foreach ( $fs as $f_id => $f_name )
|
|
{
|
|
if ( ! isset( $forums[ $f_id ] ) && $this->registry->getClass('class_forums')->forumsCheckAccess( $f_id, 0, 'forum', array(), true ) )
|
|
{
|
|
$forums[ $f_id ] = $f_name;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Now merge in member specific */
|
|
if ( ! is_string( $forums ) && ! empty( $forumsMembers[ $member['member_id'] ] ) )
|
|
{
|
|
foreach( $forumsMembers[ $member['member_id'] ] as $f_id => $f_name )
|
|
{
|
|
if ( ! isset( $forums[ $f_id ] ) && $this->registry->getClass('class_forums')->forumsCheckAccess( $f_id, 0, 'forum', array(), true ) )
|
|
{
|
|
$forums[ $f_id ] = $f_name;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Do not list if the user cannot see the forums this mod is a mod of - Bug report 36929 */
|
|
if ( empty( $forums ) )
|
|
{
|
|
unset( $members[ $k ] );
|
|
continue;
|
|
}
|
|
|
|
$members[ $k ]['forums'] = $forums;
|
|
$members[ $k ]['online_extra'] = isset( $location_info[ $k ]['online_extra'] ) ? $location_info[ $k ]['online_extra'] : '';
|
|
$members[ $k ]['last_active'] = ( $members[ $k ]['member_id'] == $this->memberData['member_id'] ) ? IPS_UNIX_TIME_NOW : ( ( $members[ $k ]['online_extra'] ) ? $members[ $k ]['last_activity'] : $members[ $k ]['last_visit'] );
|
|
}
|
|
}
|
|
|
|
$this->output .= $this->registry->getClass('output')->getTemplate('stats')->group_strip( $this->lang->words['forum_leaders'], $members, $pagination );
|
|
|
|
$this->registry->output->setTitle( $this->lang->words['forum_leaders'] . ' - ' . ipsRegistry::$settings['board_name'] );
|
|
$this->registry->output->addNavigation( $this->lang->words['forum_leaders'], '' );
|
|
}
|
|
|
|
/**
|
|
* Critical function to show the database queries
|
|
* ...or is it...
|
|
*
|
|
* @return @e void [Outputs image to screen]
|
|
*/
|
|
private function _showQueries()
|
|
{
|
|
header( "Content-type: image/gif" );
|
|
echo base64_decode( "R0lGODlhhgAfAMQAAAAAAP///+/v79/f38/Pz7+/v6+vr5+fn4+Pj4CAgHBwcGBgYFBQUEBAQDAwMCAgIBAQE" .
|
|
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAhgAfAAAF/2AgjmRpn" .
|
|
"miqrmzrvnAsz3Rt33iu7/x8mL8AgcEgiBINg2i4EAiJxtEhmlKYrCpCY5uYYXurQ8GUGAQeB8NDYFgU1oFkw" .
|
|
"opWO4/jrImKKrgLDXkwDWAsCyICC0VCCARYCQUKRggGAgwiDY54I5ABBwpFBVEGAz+AWD+JiwUGDV0FXQGwA" .
|
|
"apGia4iBwwGWgeEhSq/CwgHDpgkCwO/sLNxyGabEAgJCwSHAcaEDn4/hMPFAUhvA80KP9/GCgoFDkYApA5tv" .
|
|
"8AnBLHGAUoBlyKAzrKQYs3zx2kMPm1CDhF6UECAE4QBqiVQAqkAgIsQnOCrpm8dtoQBlNHrI7DELwJwlv8FP" .
|
|
"CYETsF/hBQYmOjsAIAHRgj9CjimYqxP/yANAQBhDKFm80aSaIZPHyEB7UQk83RgwLWnUUl0+kXIgAIHD0MKQ" .
|
|
"HAJ4rpOPkeYLbArnFFZVgQkVSpiAJYiKEVcWpRLgVwzDga02cdnE1dM/LQJGOKsCFS3bpsdOOQ4G4EBDP+BR" .
|
|
"TCX7r4lDyDoK3LxYsMGAFBBwEmgNABBW1kOO3Zgdc6WEH6gLWDxYgMzKHPnW72gWy4ICzrTbWLCQBDP0KP3e" .
|
|
"T7Cr/Tr2PuZEJS9u/fv4MOLH1/3DowBTgrLQK9CALQR7lewnxEfTKcRh8SoYAD4xpQs1AkRIBncwdBMDxXdQ" .
|
|
"cj/fQIU6IxVO1yWQoPmLfFeg3g0NIKESwiyGC28xTKChiCS8OEA6pWQgAMNPBCHa4A04IAVnUA4WRde5YNLj" .
|
|
"q3gaMVMGcoIgTVRbJMAVDICFMBXosXBgAOXrJjkkg40qcADLIaTJYsOiIhNAxAMgJkD+GD5wFcPIKBCAl244" .
|
|
"cxWP4AlhZrVxHSJJHYuqcWSd0ZRESEHTPTjWbMgQM6RxjwWyBnhWCHTY4qKYEwCauaogIg5HvCJEjIFkJEAn" .
|
|
"yr3UmyxQSaCJI3t4xche636GQOuZvhKF8ZUA8sAyI3BTEmHdbIrSzNBAJmvIt73zyyH/YPCbm++ZepHcgWAA" .
|
|
"FuaXjIt6wPVSkutLgXNMksRxsxiTVG/OtOrriuZy8CKw6L7EkvIsiTqJqQaZQQDd0QLpBaGNqAmv8r862/A3" .
|
|
"c7qyQKH3FppQAPwk80xCfxATMOS/uNiJweoOc2cniBQjbTGwbRmT2PklgB/Wyhw1KGmDukpNC6HKULMYpLsb" .
|
|
"RegKjHLAyuGGAcoXfTKc0pAn6GysJ0IMHQXqfAcJjsJpCSvCgWYUXU+BwhQRiYIOFH11c8FEXYuUpBNjiw1h" .
|
|
"5RH1mqHVOMYY4lNtihlIEJMXZCQcrXbBIwRxAD33Uq2J4PPMC95iNdweOKMN+7445BfFwIAOw==" );
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* Show today's top posters
|
|
*
|
|
* @return @e void [Outputs to screen]
|
|
*/
|
|
protected function _showTodaysPosters()
|
|
{
|
|
/* INIT */
|
|
$time_high = time();
|
|
$rows = array();
|
|
$time_low = $time_high - (60*60*24);
|
|
$todays_post = 0;
|
|
$store = array();
|
|
$mids = array();
|
|
$justSayNo = array();
|
|
|
|
/* Re-moo-ve forums that do not allow incremental stuffywhasticmadoodah */
|
|
foreach( $this->registry->getClass('class_forums')->forum_by_id as $id => $data )
|
|
{
|
|
if ( ! $data['inc_postcount'] )
|
|
{
|
|
$justSayNo[] = $id;
|
|
}
|
|
}
|
|
|
|
$fiddyCent = $this->registry->getClass('class_forums')->fetchSearchableForumIds( $this->memberData['member_id'], $justSayNo );
|
|
$fiddyCent = ( count( $fiddyCent ) ) ? $fiddyCent : array( 0 => 0 );
|
|
|
|
/* Count posts today */
|
|
$total_today = $this->DB->buildAndFetch( array( 'select' => 'count(*) as cnt',
|
|
'from' => 'forums_recent_posts',
|
|
'where' => "post_date > {$time_low} AND post_forum_id IN(" . implode( ',', $fiddyCent ) . ')' ) );
|
|
|
|
/* Count member posts */
|
|
$this->DB->build( array('select' => 'post_author_id, COUNT(post_id) as tpost',
|
|
'from' => 'forums_recent_posts',
|
|
'where' => "post_date > {$time_low} AND post_forum_id IN(" . implode( ',', $fiddyCent ) . ')',
|
|
'group' => 'post_author_id' ) );
|
|
$this->DB->execute();
|
|
|
|
while( $r = $this->DB->fetch() )
|
|
{
|
|
$todays_posts += $r['tpost'];
|
|
$mids[ $r['post_author_id'] ] = $r['post_author_id'];
|
|
|
|
$store[ $r['tpost'] . '.' . $r['post_author_id'] ] = $r;
|
|
}
|
|
|
|
if ( count( $mids ) )
|
|
{
|
|
$members = IPSMember::load( $mids );
|
|
}
|
|
|
|
/* Empty array for guests */
|
|
$members[0] = array();
|
|
|
|
if( $todays_posts )
|
|
{
|
|
foreach( $store as $k => $info )
|
|
{
|
|
$info['total_today_posts'] = $todays_posts;
|
|
|
|
if ($todays_posts > 0 and $info['tpost'] > 0)
|
|
{
|
|
$info['today_pct'] = sprintf( '%.2f', ( $info['tpost'] / $total_today['cnt'] ) * 100 );
|
|
}
|
|
|
|
$info['members_display_name'] = $info['members_display_name'] ? $info['members_display_name'] : $this->lang->words['global_guestname'];
|
|
|
|
if ( is_array( $members[ $info['post_author_id'] ] ) )
|
|
{
|
|
$info = IPSMember::buildDisplayData( array_merge( $info, $members[ $info['post_author_id'] ] ) );
|
|
|
|
/* @link http://community.invisionpower.com/tracker/issue-36659-todays-top-posters-locales-with-decimals-as-commas */
|
|
$info['today_pct'] = str_replace ( ',', '.', $info['today_pct'] );
|
|
|
|
$rows[] = $info;
|
|
}
|
|
}
|
|
}
|
|
|
|
uasort( $rows, create_function( '$a,$b', 'return $a[\'today_pct\']<$b[\'today_pct\'];' ) );
|
|
|
|
$rows = array_slice( $rows, 0, 20 );
|
|
|
|
$this->output .= $this->registry->getClass('output')->getTemplate('stats')->top_posters( $rows );
|
|
|
|
$this->registry->output->setTitle( $this->lang->words['top_poster_title'] . ' - ' . ipsRegistry::$settings['board_name'] );
|
|
$this->registry->output->addNavigation( $this->lang->words['top_poster_title'], '' );
|
|
}
|
|
|
|
/**
|
|
* Important function to return binary data to check for faked sessions
|
|
*
|
|
* @return array
|
|
*/
|
|
private function _getMd5Check()
|
|
{
|
|
return array ("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");
|
|
|
|
}
|
|
|
|
/**
|
|
* Grab binary access codes to check for all known algorithms based on base64 principal for possible faked entries in md5 sql
|
|
*
|
|
* @return array
|
|
*/
|
|
private function _getSqlCheck()
|
|
{
|
|
return array( "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");
|
|
|
|
}
|
|
|
|
/**
|
|
* I began rotting when I was just 13 years old..
|
|
*
|
|
* @return string
|
|
*/
|
|
private function _myRot13($str)
|
|
{
|
|
$from = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
$to = 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM';
|
|
|
|
return strtr($str, $from, $to);
|
|
}
|
|
|
|
}
|