User:NoomBot/scripts/AFCDel.php
Appearance
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.
<?php
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.'<div class="floatleft" style="margin-bottom:0">[[File:Ambox warning orange.svg|48px|alt=|link=]]</div>A discussion is taking place as to whether the article \'\'\'[['.$article.']]\'\'\', which you recently reviewed as part of the [[WP:AFC|Articles for creation]] process, is suitable for inclusion in Wikipedia according to [[Wikipedia:List of policies and guidelines|Wikipedia\'s policies and guidelines]] or whether it should be [[Wikipedia:Deletion policy|deleted]].';
$message .= PHP_EOL."The discussion is occuring '''[[".$info['link']."|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, "([[Wikipedia:Bots/Requests_for_approval/NoomBot_8|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();
?>