diff options
Diffstat (limited to 'ContributionScores/ContributionScores.php')
-rw-r--r-- | ContributionScores/ContributionScores.php | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/ContributionScores/ContributionScores.php b/ContributionScores/ContributionScores.php new file mode 100644 index 00000000..9e964464 --- /dev/null +++ b/ContributionScores/ContributionScores.php @@ -0,0 +1,109 @@ +<?php +/** \file + * \brief Contains setup code for the Contribution Scores Extension. + */ + +# Not a valid entry point, skip unless MEDIAWIKI is defined +if ( !defined( 'MEDIAWIKI' ) ) { + echo 'Contribution Scores extension'; + exit( 1 ); +} + +$wgExtensionCredits['specialpage'][] = [ + 'path' => __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 ); +} |