121 lines
3.4 KiB
PHP
121 lines
3.4 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Comments of the Day parser hook -- shows the five newest comments that have
|
||
|
* been sent within the last 24 hours.
|
||
|
*
|
||
|
* @file
|
||
|
* @ingroup Extensions
|
||
|
* @date 27 November 2015
|
||
|
*/
|
||
|
|
||
|
class CommentsOfTheDay {
|
||
|
|
||
|
/**
|
||
|
* Register the new <commentsoftheday /> parser hook with the Parser.
|
||
|
*
|
||
|
* @param Parser $parser Instance of Parser
|
||
|
* @return bool
|
||
|
*/
|
||
|
public static function registerTag( &$parser ) {
|
||
|
$parser->setHook( 'commentsoftheday', array( __CLASS__, 'getHTML' ) );
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get comments of the day -- five newest comments within the last 24 hours
|
||
|
*
|
||
|
* @return string HTML
|
||
|
*/
|
||
|
public static function getHTML( $input, $args, $parser ) {
|
||
|
$comments = self::get( (bool)$args['nocache'] );
|
||
|
$commentOutput = '';
|
||
|
|
||
|
foreach ( $comments as $comment ) {
|
||
|
$commentOutput .= $comment->displayForCommentOfTheDay();
|
||
|
}
|
||
|
|
||
|
$output = '';
|
||
|
if ( !empty( $commentOutput ) ) {
|
||
|
$output .= $commentOutput;
|
||
|
} else {
|
||
|
$output .= wfMessage( 'comments-no-comments-of-day' )->plain();
|
||
|
}
|
||
|
|
||
|
return $output;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get comments of the day, either from cache or the DB.
|
||
|
*
|
||
|
* @param bool $skipCache Skip using memcached and fetch data directly from the DB?
|
||
|
* @param int $cacheTime How long to cache the results in memcached? Default is one day (60 * 60 * 24).
|
||
|
* @param array $whereConds WHERE conditions for the SQL clause (if not using the defaults)
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get( $skipCache = false, $cacheTime = 86400, $whereConds = array() ) {
|
||
|
global $wgMemc;
|
||
|
|
||
|
// Try memcached first
|
||
|
$key = wfMemcKey( 'comments-of-the-day', 'standalone-hook-new' );
|
||
|
$data = $wgMemc->get( $key );
|
||
|
|
||
|
if ( $data ) { // success, got it from memcached!
|
||
|
$comments = $data;
|
||
|
} elseif ( !$data || $skipCache ) { // just query the DB
|
||
|
$dbr = wfGetDB( DB_SLAVE );
|
||
|
|
||
|
if ( empty( $whereConds ) ) {
|
||
|
$whereConds = array(
|
||
|
'Comment_Page_ID = page_id',
|
||
|
'UNIX_TIMESTAMP(Comment_Date) > ' . ( time() - ( $cacheTime ) )
|
||
|
);
|
||
|
}
|
||
|
|
||
|
$res = $dbr->select(
|
||
|
array( 'Comments', 'page' ),
|
||
|
array(
|
||
|
'Comment_Username', 'Comment_IP', 'Comment_Text',
|
||
|
'Comment_Date', 'Comment_User_Id', 'CommentID',
|
||
|
'Comment_Parent_ID', 'Comment_Page_ID'
|
||
|
),
|
||
|
$whereConds,
|
||
|
__METHOD__
|
||
|
);
|
||
|
|
||
|
$comments = array();
|
||
|
|
||
|
foreach ( $res as $row ) {
|
||
|
if ( $row->Comment_Parent_ID == 0 ) {
|
||
|
$thread = $row->CommentID;
|
||
|
} else {
|
||
|
$thread = $row->Comment_Parent_ID;
|
||
|
}
|
||
|
$data = array(
|
||
|
'Comment_Username' => $row->Comment_Username,
|
||
|
'Comment_IP' => $row->Comment_IP,
|
||
|
'Comment_Text' => $row->Comment_Text,
|
||
|
'Comment_Date' => $row->Comment_Date,
|
||
|
'Comment_user_id' => $row->Comment_User_Id,
|
||
|
// @todo FIXME: absolutely disgusting -- should use Language's formatNum() for better i18n
|
||
|
'Comment_user_points' => ( isset( $row->stats_total_points ) ? number_format( $row->stats_total_points ) : 0 ),
|
||
|
'CommentID' => $row->CommentID,
|
||
|
'Comment_Parent_ID' => $row->Comment_Parent_ID,
|
||
|
'thread' => $thread,
|
||
|
'timestamp' => wfTimestamp( TS_UNIX, $row->Comment_Date )
|
||
|
);
|
||
|
|
||
|
$page = new CommentsPage( $row->Comment_Page_ID, new RequestContext() );
|
||
|
$comments[] = new Comment( $page, new RequestContext(), $data );
|
||
|
}
|
||
|
|
||
|
usort( $comments, array( 'CommentFunctions', 'sortCommentScore' ) );
|
||
|
$comments = array_slice( $comments, 0, 5 );
|
||
|
|
||
|
$wgMemc->set( $key, $comments, $cacheTime );
|
||
|
}
|
||
|
|
||
|
return $comments;
|
||
|
}
|
||
|
|
||
|
}
|