diff --git a/.phpcs.xml b/.phpcs.xml index bea60bd..46eab63 100644 --- a/.phpcs.xml +++ b/.phpcs.xml @@ -6,6 +6,7 @@ + . diff --git a/ContributionScores.php b/ContributionScores.php index 9e96446..2134105 100644 --- a/ContributionScores.php +++ b/ContributionScores.php @@ -1,109 +1,16 @@ __FILE__, - 'name' => 'Contribution Scores', - 'url' => 'https://www.mediawiki.org/wiki/Extension:Contribution_Scores', - 'author' => 'Tim Laqua', - 'descriptionmsg' => 'contributionscores-desc', - 'version' => '1.25.0' -]; - -define( 'CONTRIBUTIONSCORES_MAXINCLUDELIMIT', 50 ); -$wgContribScoreReports = null; - -// These settings can be overridden in LocalSettings.php. - -// Set to true to exclude bots from the reporting. -$wgContribScoreIgnoreBlockedUsers = false; - -// Set to true to exclude blocked users from the reporting. -$wgContribScoreIgnoreBots = false; - -// Set to true to use real user names when available. Only for MediaWiki 1.19 and later. -$wgContribScoresUseRealName = false; - -// Set to true to disable cache for parser function and inclusion of table. -$wgContribScoreDisableCache = false; - -$wgAutoloadClasses['ContributionScores'] = __DIR__ . '/ContributionScores_body.php'; -$wgSpecialPages['ContributionScores'] = 'ContributionScores'; - -$wgMessagesDirs['ContributionScores'] = __DIR__ . '/i18n'; -$wgExtensionMessagesFiles['ContributionScoresAlias'] = __DIR__ . '/ContributionScores.alias.php'; -$wgExtensionMessagesFiles['ContributionScoresMagic'] = - __DIR__ . '/ContributionScores.i18n.magic.php'; - -$wgHooks['ParserFirstCallInit'][] = 'efContributionScores_Setup'; - -function efContributionScores_Setup( &$parser ) { - $parser->setFunctionHook( 'cscore', 'efContributionScores_Render' ); - - return true; -} - -function efContributionScores_Render( &$parser, $usertext, $metric = 'score' ) { - global $wgContribScoreDisableCache; - - if ( $wgContribScoreDisableCache ) { - $parser->getOutput()->updateCacheExpiry( 0 ); - } - - $user = User::newFromName( $usertext ); - $dbr = wfGetDB( DB_REPLICA ); - - if ( $user instanceof User && $user->isLoggedIn() ) { - global $wgLang; - - $revWhere = ActorMigration::newMigration()->getWhere( $dbr, 'rev_user', $user ); - if ( $metric == 'score' ) { - $res = $dbr->select( - [ 'revision' ] + $revWhere['tables'], - 'COUNT(DISTINCT rev_page)+SQRT(COUNT(rev_id)-COUNT(DISTINCT rev_page))*2 AS wiki_rank', - $revWhere['conds'], - __METHOD__, - [], - $revWhere['joins'] - ); - $row = $dbr->fetchObject( $res ); - $output = $wgLang->formatNum( round( $row->wiki_rank, 0 ) ); - } elseif ( $metric == 'changes' ) { - $res = $dbr->select( - [ 'revision' ] + $revWhere['tables'], - 'COUNT(rev_id) AS rev_count', - $revWhere['conds'], - __METHOD__, - [], - $revWhere['joins'] - ); - $row = $dbr->fetchObject( $res ); - $output = $wgLang->formatNum( $row->rev_count ); - } elseif ( $metric == 'pages' ) { - $res = $dbr->select( - [ 'revision' ] + $revWhere['tables'], - 'COUNT(DISTINCT rev_page) AS page_count', - $revWhere['conds'], - __METHOD__, - [], - $revWhere['joins'] - ); - $row = $dbr->fetchObject( $res ); - $output = $wgLang->formatNum( $row->page_count ); - } else { - $output = wfMessage( 'contributionscores-invalidmetric' )->text(); - } - } else { - $output = wfMessage( 'contributionscores-invalidusername' )->text(); - } - - return $parser->insertStripItem( $output, $parser->mStripState ); +if ( function_exists( 'wfLoadExtension' ) ) { + wfLoadExtension( 'ContributionScores' ); + // Keep i18n globals so mergeMessageFileList.php doesn't break + $wgMessageDirs['ContributionScores'] = __DIR__ . '/i18n'; + $wgExtensionMessagesFiles['ContributionScoresAlias'] = __DIR__ . '/ContributionScores.alias.php'; + $wgExtensionMessagesFiles['ContributionScoresMagic'] = __DIR__ . '/ContributionScores.i18n.magic.php'; + wfWarn( + 'Deprecated PHP entry point used for ContributionScores extension. ' . + 'Please use wfLoadExtension instead, ' . + 'see https://www.mediawiki.org/wiki/Extension_registration for more details.' + ); +} else { + die( 'This version of the ContributionScores extension requires MediaWiki 1.29+' ); } diff --git a/ContributionScores_body.php b/ContributionScores_body.php index 9a59c5b..5cca29c 100644 --- a/ContributionScores_body.php +++ b/ContributionScores_body.php @@ -15,10 +15,72 @@ use MediaWiki\MediaWikiServices; * @author Tim Laqua */ class ContributionScores extends IncludableSpecialPage { + const CONTRIBUTIONSCORES_MAXINCLUDELIMIT = 50; + public function __construct() { parent::__construct( 'ContributionScores' ); } + public static function onParserFirstCallInit( Parser $parser ) { + $parser->setFunctionHook( 'cscore', [ self::class, 'efContributionScoresRender' ] ); + } + + public static function efContributionScoresRender( $parser, $usertext, $metric = 'score' ) { + global $wgContribScoreDisableCache; + + if ( $wgContribScoreDisableCache ) { + $parser->getOutput()->updateCacheExpiry( 0 ); + } + + $user = User::newFromName( $usertext ); + $dbr = wfGetDB( DB_REPLICA ); + + if ( $user instanceof User && $user->isLoggedIn() ) { + global $wgLang; + + $revWhere = ActorMigration::newMigration()->getWhere( $dbr, 'rev_user', $user ); + if ( $metric == 'score' ) { + $res = $dbr->select( + [ 'revision' ] + $revWhere['tables'], + 'COUNT(DISTINCT rev_page)+SQRT(COUNT(rev_id)-COUNT(DISTINCT rev_page))*2 AS wiki_rank', + $revWhere['conds'], + __METHOD__, + [], + $revWhere['joins'] + ); + $row = $dbr->fetchObject( $res ); + $output = $wgLang->formatNum( round( $row->wiki_rank, 0 ) ); + } elseif ( $metric == 'changes' ) { + $res = $dbr->select( + [ 'revision' ] + $revWhere['tables'], + 'COUNT(rev_id) AS rev_count', + $revWhere['conds'], + __METHOD__, + [], + $revWhere['joins'] + ); + $row = $dbr->fetchObject( $res ); + $output = $wgLang->formatNum( $row->rev_count ); + } elseif ( $metric == 'pages' ) { + $res = $dbr->select( + [ 'revision' ] + $revWhere['tables'], + 'COUNT(DISTINCT rev_page) AS page_count', + $revWhere['conds'], + __METHOD__, + [], + $revWhere['joins'] + ); + $row = $dbr->fetchObject( $res ); + $output = $wgLang->formatNum( $row->page_count ); + } else { + $output = wfMessage( 'contributionscores-invalidmetric' )->text(); + } + } else { + $output = wfMessage( 'contributionscores-invalidusername' )->text(); + } + return $parser->insertStripItem( $output, $parser->mStripState ); + } + /// Generates a "Contribution Scores" table for a given LIMIT and date range /** @@ -257,7 +319,7 @@ class ContributionScores extends IncludableSpecialPage { } } - if ( empty( $limit ) || $limit < 1 || $limit > CONTRIBUTIONSCORES_MAXINCLUDELIMIT ) { + if ( empty( $limit ) || $limit < 1 || $limit > self::CONTRIBUTIONSCORES_MAXINCLUDELIMIT ) { $limit = 10; } if ( $days === null || $days < 0 ) { diff --git a/extension.json b/extension.json new file mode 100644 index 0000000..c9b217c --- /dev/null +++ b/extension.json @@ -0,0 +1,52 @@ +{ + "name": "ContributionScores", + "author": "Tim Laqua", + "url": "https://www.mediawiki.org/wiki/Extension:Contribution_Scores", + "descriptionmsg": "contributionscore-desc", + "version": "1.25.0", + "type": "specialpage", + "requires": { + "MediaWiki": ">= 1.33.0" + }, + "SpecialPages": { + "ContributionScores": "ContributionScores" + }, + "AutoloadClasses": { + "ContributionScores": "ContributionScores_body.php" + }, + "Hooks": { + "ParserFirstCallInit": "ContributionScores::onParserFirstCallInit" + }, + "MessagesDirs": { + "ContributionScores": [ + "i18n" + ] + }, + "ExtensionMessagesFiles": { + "ContribScoreAlias": "ContributionScores.alias.php", + "ContribScoreMagic": "ContributionScores.i18n.magic.php" + }, + "config": { + "ContribScoreReports": { + "value": null, + "description": "Each array defines a report - 7,50 is \"past 7 days \" and \"LIMIT 50 \" - Can be omitted." + }, + "ContribScoreIgnoreBlockedUsers": { + "value": false, + "description": "Set to true to exclude blocked users from the reporting." + }, + "ContribScoreIgnoreBots": { + "value": false, + "description": "Set to true to exclude bots users from the reporting." + }, + "ContribScoresUseRealName": { + "value": false, + "description": "Set to true to use real user names when available." + }, + "ContribScoreDisableCache": { + "value": false, + "description": "Set to true to disable cache for parser function and inclusion of table." + } + }, + "manifest_version": 2 +}