BIC: NOLADE21UEL
Stichwort: PERRYPEDIA
Institut: SK Uelzen Lüchow-Dannenberg
Kontoinhaber: PERRY RHODAN FAN ZENTRALEDeine Spenden helfen, die Perrypedia zu betreiben.Benutzer:Bully1966/UserStatistics
Mit der Extension UserStatistics für MediaWiki kann man die Anzahl der bearbeiteten und erzeugten Dokumente in den laufenden Text einbinden.
Beispiel
- Der Benutzer Bully1966 hat <useredit>Bully1966</useredit> Bearbeitungen durchgeführt.
- Der Benutzer Bully1966 hat <usercreate>Bully1966</usercreate> Artikel im Hauptnamensraum erstellt.
- Der Benutzer Bully1966 hat <usercreate all>Bully1966</usercreate> Artikel in allen Namensräumen erstellt.
Top 20 Liste
- <useredittopten>20</useredittopten>
Verbesserungsvorschläge
- Anzahl der bearbeiteten Artikel abrunden auf >50, >100, >250 usw.
- Möglichkeit Bots aus der Liste auszuschließen (Parameter nobot).
SQL - Abfrage
Die Ermittlung der Anzahl der Dokumente wurde mit folgenden SQL-Statement erfragt:
SELECT COUNT(*) AS Counter FROM (SELECT MIN(rev_id), rev_user, rev_page FROM revision GROUP BY rev_page ORDER BY rev_page, rev_timestamp) AS tt, page WHERE rev_user = 4 AND rev_page = page_id AND page_is_redirect=0 ORDER BY rev_page
Für die Bestimmung des Benutzers muss die Benutzer-Id eingesetzt werden. In dem SQL-Statement ist sie 4. Des weiteren werden die Tabellen revision und page ohne einen Präfix und kann nur in der MediaVersion ab 1.5.x benutzt werden.
Versionshistory
- 27.09.2006 - 1.1.2 - Problem mit HAVING MySQL 4.0.x behoben
- 25.09.2006 - 1.1.1 - Abfrage der ersten Bearbeitung >> sample: <usereditfirst>UserName</usereditfirst> oder letzte Bearbeitung >> sample: <usereditlast>UserName</usereditlast>
- 17.07.2006 - 1.1.0 - UserCreate funkioniert jetzt auch mit MySQL 4.0.x
- 17.07.2006 - 1.0.9 - Fehler in editcount bei 0 Bearbeitungen behoben
- 10.05.2006 - 1.0.8 - Beim Schlüsselwort useredit kann nun mehrere Benutzer angeben, getrennt durch |
- 10.05.2006 - 1.0.7 - EditCount sql query und TopTenEditCount sql query abgeglichen
- 04.05.2006 - 1.0.6 - Man kann in der TopTenListe die Anzahl der Benutzer angeben >> sample: <useredittopten>[all] | [number] | []</useredittopten>
- 03.04.2006 - 1.0.5 - Top 10 Liste der Benutzer mit den meisten Bearbeitungen
- 13.12.2005 - 1.0.4 - Unterscheidung bei Zählen der Dokumente für alle Namensräume und und nur Artikel
- 12.12.2005 - 1.0.3 - Entfällt
- 23.11.2005 - 1.0.2 - Abschalten des Cache für die Seiten, die diese Extension benutzten
- 22.11.2005 - 1.0.1 - Überprüfung der Version der MySQL-Datenbank
- 15.11.2005 - 1.0.0 - Freigabe der ersten Version
Installation
Die Installation geht mit folgenden Schritten ab:
- Erzeuge aus dem Quellcode, der im nächsten Kapitel steht eine Datei mit Namen UserStatistics.php.
- Kopiere die Datei in das Unterverzeichnis extensions der MediaWiki Installation.
- Füge folgende Zeile
include("extensions/UserStatistics.php");in die LocalSettings.php unterhalb des Includes der DefaultSettings.php Datei ein.
Achtung: Wiki-System die noch die Datenbank MySQL 4.0.x benutzen müssen überprüfen, ob der Datenbankbenutzer die Rechte hat eine temporäre Tabelle (CREATE_TMP_TABLE) anlegen zu können und zu zerstören (DROP) zu können. Wenn das der Fall ist muss die Varibale wgMySQL40Userright auf true gesetzt werden.
Hinweis: Probiere dies erst an einem Testsystem aus, bevor du das in einem laufenden System machst. Denn Fehler können geschehen.
Quellcode
<?php
# Copyright (C) 2005 - 2006 Thomas Klein <tkl-online@gmx.de>
# http://www.mediawiki.org/
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# http://www.gnu.org/copyleft/gpl.html
/**
* Extension to counting of working article on a user
*
* Use with:
*
* <useredit>UserName[|UserName]</useredit>
* <useredittopten>[all]|[number]|[]</useredittopten>
* <usercreate [all]>UserName</usercreate>
* <usereditfirst>UserName</usereditfirst>
* <usereditlast>UserName</usereditlast>
*
* @author Thomas Klein <tkl-online@gmx.de>
* @package MediaWiki
* @subpackage Extensions
*/
/**
* Version History
*
* 27.09.2006 1.1.2
* - Having problems with MySQL 4.0.x fixed
*
* 25.09.2006 1.1.1
* - Query the first edit date >> sample: <usereditfirst>UserName</usereditfirst>
* - Query the last edit date >> sample: <usereditlast>UserName</usereditlast>
*
* 17.07.2006 1.1.0
* - UserCreate is working with MySQL 4.0.x
*
* 17.07.2006 1.0.9
* - In editcout an error with not user found fixed.
*
* 10.05.2006 1.0.8
* - For the keyword useredit now several users can indicate, separately through |
*
* 10.05.2006 1.0.7
* - EditCount sql query and TopTenEditCount sql query adjusted
*
* 04.05.2006 1.0.6
* - Listing the top ten with count >> sample: <useredittopten>[all] | [number] | []</useredittopten>
*
* 03.04.2006 1.0.5
* - Listing the top ten of edits
*
* 13.12.2005 1.0.4
* - Counting the create dokument with namespace
*
* 23.11.2005 1.0.2
* - Disable caching for pages using this extension
*
* 22.11.2005 1.0.1
* - Checking the database version of MySQL
*
* 15.11.2005 1.0.0
* - Release of the first version
*/
if( !defined( 'MEDIAWIKI' ) ) {
die();
}
require_once( 'Sanitizer.php' );
require_once( 'HttpFunctions.php' );
$wgMySQL40Userright = true;
$wgExtensionFunctions[] = "wfUserStatistics";
$wgExtensionCredits['parserhook'][] = array(
'name' => 'UserStatistics',
'author' => 'Thomas Klein',
'url' => 'http://www.perrypedia.proc.org/index.php?title=Benutzer:Bully1966/UserStatistics',
'description' => 'Extension to counting of working article on a user',
'version'=>'1.1.2');
function wfUserStatistics() {
global $wgParser;
$wgParser->setHook( "useredit" , 'counting_useredit' ) ;
$wgParser->setHook( "useredittopten" , 'counting_useredit_topten' ) ;
$wgParser->setHook( "usercreate" , 'counting_usercreate' ) ;
$wgParser->setHook( "usereditfirst" , 'first_useredit' ) ;
$wgParser->setHook( "usereditlast" , 'last_useredit' ) ;
//$wgParser->setHook( "usercreate4_0_x" , 'counting_usercreate_4_0_x' ) ;
return true;
}
function counting_useredit( $text ) {
global $wgVersion, $wgOut;
global $wgParser;
$ret = "" ;
if ( version_compare( $wgVersion, '1.5beta4', '<' ) ) {
$ret = "1.5.x of MediaWiki required";
return $ret ;
}
$wgParser->disableCache();
$totalall = 0;
// Parse each parameter
$params = explode('|', $text);
foreach ($params as $param)
{
list( $username, $namespace ) = extractParamaters( $param );
$username = Title::newFromText( $username );
$username = is_object( $username ) ? $username->getText() : '';
$uid = User::idFromName( $username );
if ($uid != 0) {
global $wgLang;
$total = editsByNumber( $uid );
$totalall = $totalall + $total;
} else {
$total = editsByName( $username );
if ($uid != $total) {
$totalall = $totalall + $total;
} else {
$totalall = -1;
break;
}
}
}
if ($totalall != -1) {
global $wgLang;
$ret = $wgLang->formatNum( $totalall );
} else {
$ret = "Benutzer nicht bekannt";
}
return $ret ;
}
function counting_useredit_topten( $text ) {
global $wgVersion, $wgOut, $wgUser, $wgLang;
global $wgParser;
$ret = "" ;
if ( version_compare( $wgVersion, '1.5beta4', '<' ) ) {
$ret = "1.5.x of MediaWiki required";
return $ret ;
}
$wgParser->disableCache();
$skin = $wgUser->getSkin();
$ret = '<ol>';
$dbr =& wfGetDB( DB_SLAVE );
$rev = $dbr->tableName( 'revision' );
if (empty( $text )) {
$limit= "LIMIT 0,11";
}
else {
if (is_numeric( $text )) {
$text = $text + 1;
$limit= "LIMIT 0,$text";
}
else {
$limit= "";
}
}
# We fetch 11, even though we want 10, because we *don't* want MediaWiki default (and we might get it)
$sql = "SELECT COUNT(*) AS count, rev_user FROM $rev GROUP BY rev_user ORDER BY count DESC $limit";
$res = $dbr->query( $sql, "UserStatistics::counting_useredit_topten" );
while( $row = $dbr->fetchObject( $res ) ) {
if( $row->rev_user != 0 ) {
$upt = Title::makeTitle( NS_USER, User::whoIs($row->rev_user) );
$cpt = Title::makeTitle( NS_SPECIAL, 'Contributions/' . User::whoIs($row->rev_user) );
$upl = $skin->makeLinkObj( $upt, $upt->getText() );
$tpl = $skin->makeLinkObj( $upt->getTalkPage(), $wgLang->getNsText( NS_TALK ) );
$cpl = $skin->makeKnownLinkObj( $cpt, wfMsgHtml( 'contribslink' ) );
$uec = $wgLang->formatNum( $row->count );
$ret .= "<li>$upl ($tpl | $cpl) - $uec</li>";
}
}
$ret .= '</ol>';
return( $ret == '<ul></ul>' ? '' : $ret );
}
function first_useredit( $text ) {
global $wgVersion, $wgOut;
global $wgParser;
$ret = "hallo" ;
if ( version_compare( $wgVersion, '1.5beta4', '<' ) ) {
$ret = "1.5.x of MediaWiki required";
return $ret ;
}
$wgParser->disableCache();
list( $username, $namespace ) = extractParamaters( $text );
$username = Title::newFromText( $username );
$username = is_object( $username ) ? $username->getText() : '';
$uid = User::idFromName( $username );
if ($uid != 0) {
$ret = editFirstDate( $uid );
}
return $ret ;
}
function last_useredit( $text ) {
global $wgVersion, $wgOut;
global $wgParser;
$ret = "" ;
if ( version_compare( $wgVersion, '1.5beta4', '<' ) ) {
$ret = "1.5.x of MediaWiki required";
return $ret ;
}
$wgParser->disableCache();
list( $username, $namespace ) = extractParamaters( $text );
$username = Title::newFromText( $username );
$username = is_object( $username ) ? $username->getText() : '';
$uid = User::idFromName( $username );
if ($uid != 0) {
$ret = editLastDate( $uid );
}
return $ret ;
}
function counting_usercreate( $text, $params = array() ) {
global $wgVersion, $wgOut;
global $wgParser;
$ret = "" ;
if ( version_compare( $wgVersion, '1.5beta4', '<' ) ) {
$ret = "1.5.x of MediaWiki required";
return $ret ;
}
$dbr =& wfGetDB( DB_SLAVE );
if ( version_compare( $dbr->getServerVersion(), '4.1', '<' ) ) {
if ( version_compare( $dbr->getServerVersion(), '4.0', '<' ) ) {
$ret = "4.0 or higher of MySQL required";
return $ret;
}
else {
if ($wgMySQL40Userright) {
return counting_usercreate_4_0_x ( $text, $params );
}
else {
$ret = "DBUser need user right DROP and CREATE_TMP_TABLE";
return $ret;
}
}
}
$wgParser->disableCache();
list( $username, $namespace ) = extractParamaters( $text );
$username = Title::newFromText( $username );
$username = is_object( $username ) ? $username->getText() : '';
$uid = User::idFromName( $username );
if ($uid != 0) {
global $wgLang;
if (isset( $params['all'] )) {
$total = createsByUserAll( $uid );
}
else {
$total = createsByUser( $uid );
}
$ret = $wgLang->formatNum( $total );
} else {
$ret = "Benutzer nicht bekannt";
}
return $ret ;
}
function counting_usercreate_4_0_x( $text, $params = array() ) {
global $wgVersion, $wgOut;
global $wgParser;
$fname = 'UserStatistics::counting_usercreate_4_0_x';
$ret = "" ;
if ( version_compare( $wgVersion, '1.5beta4', '<' ) ) {
$ret = "1.5.x of MediaWiki required";
return $ret ;
}
$wgParser->disableCache();
list( $username, $namespace ) = extractParamaters( $text );
$username = Title::newFromText( $username );
$username = is_object( $username ) ? $username->getText() : '';
$uid = User::idFromName( $username );
if ($uid != 0) {
global $wgLang;
if (isset( $params['all'] )) {
wfProfileIn( $fname );
$dbw =& wfGetDB( DB_MASTER );
$oldignore = $dbw->ignoreErrors( true );
$old_user_abort = ignore_user_abort( true );
$usercreatesTable = $dbw->tableName( 'accusercreate' );
$revision = $dbw->tableName( 'revision' );
$page = $dbw->tableName( 'page' );
$dbw->query("CREATE TEMPORARY TABLE $usercreatesTable ENGINE=HEAP ".
"SELECT MIN(rev_id), rev_user, rev_page FROM $revision GROUP BY rev_page ORDER BY rev_page, rev_timestamp", "UserStatistics::CreateTempTable");
$sql = "SELECT COUNT(*) AS Counter FROM $usercreatesTable, $page WHERE rev_user = $uid AND rev_page = page_id AND page_is_redirect=0 ORDER BY rev_page";
$res = $dbw->query( $sql, "UserStatistics::QueryCounting" );
$dbw->query("DROP TABLE $usercreatesTable", "UserStatistics::DropTempTable");
$obj = $dbw->fetchObject( $res );
$nscount = 0;
if ($obj) {
$nscount = $obj->Counter;
}
$dbw->freeResult( $res );
$total = $nscount;
ignore_user_abort( $old_user_abort );
$oldignore = $dbw->ignoreErrors( $oldignore );
wfProfileOut( $fname );
}
else {
wfProfileIn( $fname );
$dbw =& wfGetDB( DB_MASTER );
$oldignore = $dbw->ignoreErrors( true );
$old_user_abort = ignore_user_abort( true );
$usercreatesTable = $dbw->tableName( 'accusercreate' );
$revision = $dbw->tableName( 'revision' );
$page = $dbw->tableName( 'page' );
$dbw->query("CREATE TEMPORARY TABLE $usercreatesTable ENGINE=HEAP ".
"SELECT MIN(rev_id), rev_user, rev_page FROM $revision GROUP BY rev_page ORDER BY rev_page, rev_timestamp", "UserStatistics::CreateTempTable");
$sql = "SELECT COUNT(*) AS Counter FROM $usercreatesTable, $page WHERE rev_user = $uid AND rev_page = page_id AND page_is_redirect=0 AND page_namespace = 0 ORDER BY rev_page";
$res = $dbw->query( $sql, "UserStatistics::QueryCounting" );
$dbw->query("DROP TABLE $usercreatesTable", "UserStatistics::DropTempTable");
$obj = $dbw->fetchObject( $res );
$nscount = 0;
if ($obj) {
$nscount = $obj->Counter;
}
$dbw->freeResult( $res );
$total = $nscount;
ignore_user_abort( $old_user_abort );
$oldignore = $dbw->ignoreErrors( $oldignore );
wfProfileOut( $fname );
}
$ret = $wgLang->formatNum( $total );
} else {
$ret = "Benutzer nicht bekannt";
}
return $ret ;
}
/**
* Compute and return the total edits in all namespaces
*
* @access private
*
* @param array $nscount An associative array
* @return int
*/
function getTotal( $nscount ) {
$total = 0;
foreach ( array_values( $nscount ) as $i )
$total += $i;
return $total;
}
/**
* Parse the username and namespace parts of the input and return them
*
* @access private
*
* @param string $par
* @return array
*/
function extractParamaters( $par ) {
global $wgContLang;
@list($user, $namespace) = explode( '/', $par, 2 );
// str*cmp sucks
if ( isset( $namespace ) )
$namespace = $wgContLang->getNsIndex( $namespace );
return array( $user, $namespace );
}
/**
* Count the number of edits of a userid
*
* @param int $uid The user ID to check
* @return array
*/
function editsByNumber( $uid ) {
$fname = 'UserStatistics::editsByNumber';
$dbr =& wfGetDB( DB_SLAVE );
$rev = $dbr->tableName( 'revision' );
$sql = "SELECT COUNT(*) AS count FROM $rev WHERE rev_user = $uid";
$res = $dbr->query( $sql, $fname );
$row = $dbr->fetchObject( $res );
return $row->count;
}
/**
* First edit of a user
*
* @param int $uid The user ID to check
* @return array
*/
function editFirstDate( $uid ) {
global $wgLang;
$ret = "";
$fname = 'UserStatistics::editFirstDate';
$dbr =& wfGetDB( DB_SLAVE );
$rev = $dbr->tableName( 'revision' );
$sql = "SELECT MIN(rev_id) AS number FROM $rev WHERE rev_user = $uid";
$res = $dbr->query( $sql, $fname );
$revid = $dbr->fetchObject( $res );
if ($revid) {
$sql = "SELECT rev_timestamp FROM $rev WHERE rev_id = $revid->number";
$res = $dbr->query( $sql, $fname );
$row = $dbr->fetchObject( $res );
if ($row) {
$ret = $wgLang->timeanddate( wfTimestamp(TS_MW, $row->rev_timestamp), true);
}
}
return $ret;
}
/**
* Last edit of a user
*
* @param int $uid The user ID to check
* @return array
*/
function editLastDate( $uid ) {
global $wgLang;
$ret = "";
$fname = 'UserStatistics::editLastDate';
$dbr =& wfGetDB( DB_SLAVE );
$rev = $dbr->tableName( 'revision' );
$sql = "SELECT MAX(rev_id) AS number FROM $rev WHERE rev_user = $uid";
$res = $dbr->query( $sql, $fname );
$revid = $dbr->fetchObject( $res );
if ($revid) {
$sql = "SELECT rev_timestamp FROM $rev WHERE rev_id = $revid->number";
$res = $dbr->query( $sql, $fname );
$row = $dbr->fetchObject( $res );
if ($row) {
$ret = $wgLang->timeanddate( wfTimestamp(TS_MW, $row->rev_timestamp), true);
}
}
return $ret;
}
/**
* Count the number of edits of a username
*
* @param string $usName The username to check
* @return array
*/
function editsByName( $usName ) {
$fname = 'UserStatistics::editsByName';
$nscount = array();
$dbr =& wfGetDB( DB_SLAVE );
$rev = $dbr->tableName( 'revision' );
$sql = "SELECT COUNT(*) AS count FROM $rev WHERE rev_user_text = \"$usName\"";
$res = $dbr->query( $sql, $fname );
$row = $dbr->fetchObject( $res );
return $row->count;
}
/**
* Count the number of creates of a user
*
* @param int $uid The user ID to check
* @return array
*/
function createsByUser( $uid ) {
$fname = 'UserStatistics::createsByUser';
$db =& wfGetDB( DB_SLAVE );
$revision = $db->tableName( 'revision' );
$page = $db->tableName( 'page' );
$sql = "SELECT COUNT(*) AS Counter FROM (SELECT MIN(rev_id), rev_user, rev_page FROM " .
"$revision GROUP BY rev_page ORDER BY rev_page, rev_timestamp) AS temp, $page " .
"WHERE rev_user = $uid AND rev_page = page_id AND page_is_redirect=0 AND page_namespace = 0 ORDER BY rev_page";
$res = $db->query( $sql, "UserStatistics::createsByUser" );
$obj = $db->fetchObject( $res );
$nscount = 0;
if ($obj) {
$nscount = $obj->Counter;
}
$db->freeResult( $res );
return $nscount;
}
/**
* Count the number of creates of a user
*
* @param int $uid The user ID to check
* @return array
*/
function createsByUserAll( $uid ) {
$fname = 'UserStatistics::createsByUser';
$db =& wfGetDB( DB_SLAVE );
$revision = $db->tableName( 'revision' );
$page = $db->tableName( 'page' );
$sql = "SELECT COUNT(*) AS Counter FROM (SELECT MIN(rev_id), rev_user, rev_page FROM " .
"$revision GROUP BY rev_page ORDER BY rev_page, rev_timestamp) AS temp, $page " .
"WHERE rev_user = $uid AND rev_page = page_id AND page_is_redirect=0 ORDER BY rev_page";
$res = $db->query( $sql, "UserStatistics::createsByUser" );
$obj = $db->fetchObject( $res );
$nscount = 0;
if ($obj) {
$nscount = $obj->Counter;
}
$db->freeResult( $res );
return $nscount;
}
?>