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
+}