User:NoomBot/scripts/AFCDel.php

Uses framework based off of botclasses.php (bug fixes + extra functions). VertigoScript just provides some meta to a wrapper script which isn't being used to run this task. It is scheduled through cronie every 30 minutes to the toolserver job queue.

date_default_timezone_set('UTC');

require '../api/wapi.php';

require '../api/vertigo/vertigoscript.php';

class AFCDel extends VertigoScript {

private static function clean_old_cache($a) {

$nc = $a;

foreach ($a as $art => $info) {

if ($info['ts'] <= time()-60*60*24*31) unset($nc[$art]); # 31 day unset

}

return $nc;

}

public function run() {

$this->setAPI('wapi');

$this->setLogging('events.txt', 'actions.txt');

require '../en.php';

$cache = array();

if (!is_file('cache.dat')) {

$f = fopen('cache.dat', 'w'); fwrite($f, serialize($cache)); fclose($f);

}

$cache = unserialize(trim(file_get_contents('cache.dat')));

AFCDel::clean_old_cache($cache);

$b = new wikibot(false, 3);

$b->login($user, $password)or die("Failed to login");

$afd = $b->categorymembers("Category:Articles_for_deletion", false);

$afc = array();

foreach ($afd as $page) {

if ($b->shutoff("User:NoomBot/Shutoff/AFCDel")) die("Emergency stopped!!");

if (substr($page, 0, 9) == "Category:") continue;

# straight up continue if we saw the page in the last 3 days

if (isset($cache[$page]) && ((isset($cache[$page]['notafc'])) || ($cache[$page]['ts'] >= time()-60*60*24*3))) continue;

# fetch talk, check if has afc template

$t = $b->getPage("Talk:".$page);

$this->logEvent("Inspecting ".$page);

if (preg_match('${{(?:WikiProject Articles for creation|WPAFC)\|.*reviewer=(.+?)(?:\|.*)*}}$i', $t, $r)) {

# skip api request, find out ourselves

$rev = $r[1];

$this->logEvent($page." is an article for creation, reviewer: ".$rev);

}

else { # not afc article

$cache[$page] = array('notafc' => true, 'nom' => 1, 'ts' => time());

continue;

}

$p = $b->getPage($page);

if (preg_match('${{(?:afd|article for deletion|afdm|article for deletion/dated)\|page=(.+?)(?:\|.*)*}}$i', $p, $m)) {

$nom = 1;

if (preg_match('/.+\(([0-9])(?:th|nd|rd) nomination\)/', $m[1], $n)) {

$nom = $n[1];

}

if (isset($cache[$page]) && $cache[$page]['nom'] == $nom) {

$this->logEvent("Skipped page that's cached");

continue;

}

$info = array('retname' => $page, 'nom' => $nom, 'link' => "Wikipedia:Articles for deletion/".$m[1], 'rev' => $rev);

# okay, ready

$afc[$page] = $info;

}

else {

$this->logEvent("[WARNING] Article listed at AfD but could not match it's template!");

continue;

}

}

foreach ($afc as $article => $info) {

$reviewer = $info['rev'];

echo "Notifying ".$reviewer.", ".$article." listed at AfD... ";

if (isset($cache[$article])) {

echo "failed; reviewer already notified.".PHP_EOL;

continue;

}

$talk = $b->getPage("User talk:".$reviewer);

if (!$b->excluded($talk, "NoomBot")) {

echo "failed; nobots denied.".PHP_EOL;

continue;

}

$regex = str_replace(" ", ".", $info['link'])."|".str_replace(" ", ".", $article).".*delet[e|ed|ion].*";

$regex = "/".str_replace("/", "\/", $regex)."/i";

if (preg_match($regex, $talk)) {

echo "failed; user most likely aware of deletion, r1 match.".PHP_EOL;

continue;

}

if (preg_match('/{{retired(}}|\|.+}})/i', $talk)) {

echo 'failed; user likely retired, r2 match.'.PHP_EOL;

continue;

}

$message = "== Nomination of ".$article." for deletion ==";

$message .= PHP_EOL.'

A discussion is taking place as to whether the article \'\'\''.$article.'\'\'\', which you recently reviewed as part of the Articles for creation process, is suitable for inclusion in Wikipedia according to Wikipedia\'s policies and guidelines or whether it should be deleted.';

$message .= PHP_EOL."The discussion is occuring here. As the reviewer, your contribution to the discussion will be helpful in reaching a consensus. ~~~~";

$talk = rtrim($talk).PHP_EOL.PHP_EOL.$message;

$b->edit("User talk:".$reviewer, $talk, "(BOT) Notifying AfC reviewer of ".$info['link']."", null, false, true);

#$b->edit("User:Noommos/tests", $message, "Notifying AfC reviewer of ".$info['link']."", null, false, true);

$this->logAction("Notified ".$reviewer." about ".$article." at User talk:".$reviewer);

$info['ts'] = time();

$cache[$article] = $info;

echo "success.".PHP_EOL;

}

$f = fopen('cache.dat', 'w');

fwrite($f, serialize($cache));

fclose($f);

}

}

$task = new AFCDel();

$task->run();

?>