User:Nx/Extensions/Editcount/Editcount.body.php
< User:Nx | Extensions
Jump to navigation
Jump to search
<?php
class SpecialEditcount extends SpecialPage {
var $target, $cutoff, $month, $year;
function __construct() {
parent::__construct('Editcount');
#SpecialPage::setGroup('Editcount','users');
global $wgSpecialPageGroups;
$wgSpecialPageGroups['Editcount']='users';
wfLoadExtensionMessages('Editcount');
}
function execute( $par ) {
global $wgRequest, $wgOut, $wgUser;
if( wfReadOnly() ) {
$wgOut->readOnlyPage();
return;
}
$this->target = $wgRequest->getVal('name', $par );
$this->target = strtr( $this->target, '_', ' ' );
$this->cutoff= $wgRequest->getVal('cutoff');
$this->month= $wgRequest->getVal('month','__');
$this->year= $wgRequest->getVal('year','____');
if ($this->target) $this->cutoff = null;
$this->setHeaders();
$mAll = wfMsg('editcount-all');
$currentYear = gmdate('Y');
$yearoptions = '';
for ($i = $currentYear; $i>= 2007; --$i)
{
$yearoptions .= "<option value=\"$i\" " . (($this->year == $i) ? "selected" : "") .">$i</option>\n";
}
$titleObject = $this->getTitle(); #For( 'Editcount' );
$wgOut->addHTML(
Xml::openElement('form', array( 'id' => 'editcount', 'method' => 'post', 'action' => $titleObject->getLocalURL("action=submit"), ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'editcountlegend' ) ) .
Xml::label( wfMsg('editcount-username'), 'name' ) . " " .
Xml::input( 'name', 45, $this->target,
array( 'tabindex' => '1',
'id' => 'name', ) ) .
"<p>" .
Xml::label( wfMsg('editcount-month'), 'month' ) . " " .
"<select id=\"month\" name=\"month\" tabindex=\"2\">
<option value=\"__\">{$mAll}</option>
<option value=\"01\" " . (($this->month == '01') ? 'selected' : '') .">01</option>
<option value=\"02\" " . (($this->month == '02') ? 'selected' : '') .">02</option>
<option value=\"03\" " . (($this->month == '03') ? 'selected' : '') .">03</option>
<option value=\"04\" " . (($this->month == '04') ? 'selected' : '') .">04</option>
<option value=\"05\" " . (($this->month == '05') ? 'selected' : '') .">05</option>
<option value=\"06\" " . (($this->month == '06') ? 'selected' : '') .">06</option>
<option value=\"07\" " . (($this->month == '07') ? 'selected' : '') .">07</option>
<option value=\"08\" " . (($this->month == '08') ? 'selected' : '') .">08</option>
<option value=\"09\" " . (($this->month == '09') ? 'selected' : '') .">09</option>
<option value=\"10\" " . (($this->month == '10') ? 'selected' : '') .">10</option>
<option value=\"11\" " . (($this->month == '11') ? 'selected' : '') .">11</option>
<option value=\"12\" " . (($this->month == '12') ? 'selected' : '') .">12</option>
</select> " .
Xml::label( wfMsg('editcount-year'), 'year' ) . "
<select id=\"year\" name=\"year\" tabindex=\"3\">
<option value=\"____\">{$mAll}</option>
{$yearoptions}
</select>
</p><p> " .
Xml::label( wfMsg('editcount-returntop'), 'month' ) . " " .
Xml::input( 'cutoff', 1, $this->cutoff,
array( 'tabindex' => '4',
'id' => 'cutoff',
'maxlength' => '3' ) ) . "
</p><p> " .
Xml::submitButton( wfMsg( 'editcount-go' ),
array('name' => 'editcount_go',
'tabindex' => '5',
'accesskey' => 's') ) . "
</p>" .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' )
);
$like = "{$this->year}{$this->month}";
$dbr = wfGetDB(DB_SLAVE);
if ($this->target)
{
$conds = array(
'rev_user_text' => $this->target,
'rev_timestamp LIKE "' . /*$dbr->escapeLike(*/$like/*)*/ . '%"',
);
$res = $dbr->select(array('page', 'revision'),
array('page_namespace','count(page_namespace)'),
$conds,
'SpecialEditcount::execute',
array('GROUP BY' => 'page_namespace'),
array('revision' => array('JOIN','page_id=rev_page')) );
$total = 0;
$data = array();
while($row = $dbr->fetchRow($res))
{
$total += $row['count(page_namespace)'];
$data[] = array('ns' => $row['page_namespace'],'count' => $row['count(page_namespace)']);
}
$res->free();
$this->month = $this->month == '__' ? '*' : $this->month;
$this->year = $this->year == '____' ? '*' : $this->year;
$totallabel = wfMsg('editcount-total');
$wgOut->addHTML("<table>
<tr>
<td style='padding-right:4em;'>{$this->target}</td>
<td style='padding-right:1em;'>{$this->month}/{$this->year}</td>
<td>$totallabel {$total}</td>
</tr>
"
);
global $wgCanonicalNamespaceNames;
for($i=0; $i<count($data);++$i)
{
$ns = ($data[$i]['ns'] == NS_MAIN) ? wfMsg(blanknamespace) : strtr( $wgCanonicalNamespaceNames[$data[$i]['ns']], '_', ' ' );;
$num = $data[$i]['count'];
$perc = round($num/$total*100,2);
$wgOut->addHTML("
<tr>
<td>{$ns}</td>
<td>{$num}</td>
<td>{$perc}%</td>
</tr>
"
);
}
$wgOut->addHTML('</table>');
} elseif ($this->cutoff) {
$res=$dbr->select('revision',
array('rev_user_text','count(rev_timestamp)'),
array('rev_timestamp LIKE "' . /*$dbr->escapeLike(*/$like/*)*/ . '%"',),
'SpecialEditcount::execute',
array('GROUP BY' => 'rev_user_text', 'ORDER BY' => 'count(rev_timestamp) desc', 'LIMIT' => "{$this->cutoff}")
);
$wgOut->addHTML("<table>");
$mmonth = $this->month == '__' ? '*' : $this->month;
$myear = $this->year == '____' ? '*' : $this->year;
while($row = $dbr->fetchRow($res))
{
$name = $row['rev_user_text'];
$total = $row['count(rev_timestamp)'];
$userlink = Xml::openElement('a',array('href' => $titleObject->getLocalURL(array('name' => $name,
'year' => $this->year,
'month' => $this->month)) )) .
$name .
Xml::closeElement('a');
$wgOut->addHTML("
<tr>
<td style='padding-right:4em;'>{$userlink}</td>
<td style='padding-right:1em;'>{$mmonth}/{$myear}</td>
<td>$totallabel {$total}</td>
</tr>
"
);
}
$wgOut->addHTML("</table>");
}
}
}
class ApiActiveusers extends ApiQueryBase {
public function __construct($query, $moduleName) {
parent::__construct($query,$moduleName,'ac');
}
public function execute() {
$db = $this->getDB();
$params = $this->extractRequestParams();
$month = $params['month'];
if (!is_null($month))
{
$month = str_pad($month,2,'0',STR_PAD_LEFT);
}
$year = $params['year'];
$limit = $params['limit'];
$this->addTables('revision');
//"rev_timestamp like \"{$this->year}{$this->month}%\""
if (!is_null($year) && !is_null($month)) {
$this->addWhere( 'rev_timestamp LIKE "' . $db->escapeLike( "{$year}{$month}" ) . '%"' );
} elseif (!is_null($year)) {
$this->addWhere( 'rev_timestamp LIKE "' . $db->escapeLike( "{$year}" ) . '%"' );
} elseif (!is_null($month)) {
$this->addWhere( 'rev_timestamp LIKE "____' . $db->escapeLike( "{$month}" ) . '%"' );
}
$this->addFields( array('rev_user_text','count(rev_timestamp)') );
$this->addOption('GROUP BY', 'rev_user_text');
$this->addOption('ORDER BY', "count(rev_timestamp) desc");
$this->addOption('LIMIT', "{$limit}");
$res = $this->select(__METHOD__);
$result = $this->getResult();
$data = array();
while ($row = $db->fetchRow($res)) {
$data[] = array('name' => $row['rev_user_text'], 'editcount' => $row['count(rev_timestamp)']);
}
$db->freeResult($res);
$result->setIndexedTagName($data, 'u');
$result->addValue('query',$this->getModuleName(),$data);
}
public function getAllowedParams() {
return array (
'month' => null,
'year' => null,
'limit' => array (
ApiBase :: PARAM_DFLT => 10,
ApiBase :: PARAM_TYPE => 'limit',
ApiBase :: PARAM_MIN => 1,
ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
)
);
}
public function getParamDescription() {
return array (
'month' => 'Get contributions for this month only',
'year' => 'Get contributions for this year only',
'limit' => 'How many total user names to return.',
);
}
public function getDescription() {
return 'Enumerate active users';
}
public function getExamples() {
return array(
'api.php?action=query&list=activeusers&aclimit=150',
'api.php?action=query&list=activeusers&aclimit=150&acmonth=03&acyear=2009',
);
}
public function getVersion() {
return "1.0";
}
}