User:ClueBot II/Source
The following is automatically generated by ClueBot II.
- wikibot.classes.php is here.
ClueBot Script (cluebot2.cbsfunctions.php)
<?PHP$debug = true;
function getarguments ($data,&$return,&$session,$conditionals = true,$delimiter = ' ') {
$pos = 0;
$depthp = 0;
$depthb = 0;
$quotes1 = 0;
$quotes2 = 0;
$tmp = '';
$chr = '';
$data = trim($data);
$array = array();
while ($pos < strlen($data)) {
$chr = $data{$pos};
if (($quotes1 == 1) and ($chr == '"')) { $quotes1 = 0; }
elseif (($quotes2 == 1) and ($chr == "'")) { $quotes2 = 0; }
elseif (($quotes1 == 0) and ($quotes2 == 0)) {
if ($depthb == 0) {
if ($chr == '(') $depthp++;
if ($chr == ')') $depthp--;
}
if ($depthp == 0) {
if ($chr == '{') $depthb++;
if ($chr == '}') $depthb--;
}
if ($chr == '"') $quotes1 = 1;
if ($chr == "'") $quotes2 = 1;
if (($chr == $delimiter) and ($depthp == 0) and ($depthb == 0)) { $array[] = $tmp; $tmp = ''; $pos++; continue; }
}
$tmp .= $chr;
$pos++;
}
$array[] = $tmp;
foreach ($array as $arg) {
if ($arg{0} == '%') {
$return[] = &$session['vars'][substr($arg,1)];
} elseif ($arg{0} == '{') {
$return[] = $arg;
} elseif (($conditionals == false) and ($arg{0} == '(')) {
$return[] = $arg;
} else {
$return[] = evalconditional($arg,&$session);
}
}
}
function evalfunction ($function,&$session) {
if (preg_match('/^\$([^(]+)\((.*)\)$/',trim($function),$m)) {
$func = strtolower($m[1]);
$args = array();
getarguments($m[2],&$args,&$session,true,',');
switch ($func) {
case '+':
case 'cat':
$ret = '';
foreach ($args as $arg) {
$ret .= $arg;
}
return $ret;
break;
case 'mid':
case 'substr':
if (count($args) == 2) {
return substr($args[0],$args[1]);
} elseif (count($args) == 3) {
return substr($args[0],$args[1],$args[2]);
}
break;
case 'gettok':
if (count($args) >= 3) {
if (count($args) == 4) {
$x = ($args[0]?explode($args[1],$args[0],$args[3]):array());
} elseif (count($args) == 3) {
$x = ($args[0]?explode($args[1],$args[0]):array());
}
if ($args[2] == 0) {
return count($x);
} else {
return $x[$args[2] - 1];
}
}
break;
case 'settok':
if (count($args) == 4) {
$x = ($args[0]?explode($args[1],$args[0]):array());
$x[$args[2] - 1] = $args[3];
return implode($args[1],$x);
}
break;
case 'addtok':
if (count($args) == 3) {
$x = ($args[0]?explode($args[1],$args[0]):array());
$x[] = $args[2];
return implode($args[1],$x);
}
break;
case 'deltok':
if (count($args) == 3) {
$x = ($args[0]?explode($args[1],$args[0]):array());
unset($x[$args[2] - 1]);
return implode($args[1],$x);
}
break;
case 'strpos':
if (count($args) == 2) {
return ((($x = strpos($args[0],$args[1])) === false)?-1:$x);
} elseif (count($args) == 3) {
return ((($x = strpos($args[0],$args[1],$args[2])) === false)?-1:$x);
}
break;
case 'stripos':
if (count($args) == 2) {
return ((($x = stripos($args[0],$args[1])) === false)?-1:$x);
} elseif (count($args) == 3) {
return ((($x = stripos($args[0],$args[1],$args[2])) === false)?-1:$x);
}
break;
case 'replace':
if ((count($args) % 2) == 1) {
$search = array();
$replace = array();
$data = $args[0];
for ($i=1;$i<count($args);$i+=2) {
$search[] = $args[$i];
$replace[] = $args[$i + 1];
}
return str_replace($search,$replace,$data);
}
break;
case 'pregreplace':
if (count($args) == 3) {
return preg_replace($args[1],$args[2],$args[0]);
}
break;
case 'time':
return time();
break;
}
}
}
function evalconditional ($conditional,&$session) {
global $debug;
if ($debug) echo 'evalconditional("'.$conditional.'",'.serialize($session).');'."\n";
$pos = 0;
$depth = 0;
$part = 1;
$quotes1 = 0;
$quotes2 = 0;
$c1 = '';
$op = '';
$c2 = '';
while ($pos < strlen($conditional)) {
$chr = $conditional{$pos};
$chr2 = $conditional{$pos+1};
$chr3 = $conditional{$pos+2};
if (($quotes1 == 1) and ($chr == '"')) { $quotes1 = 0; }
elseif (($quotes2 == 1) and ($chr == "'")) { $quotes2 = 0; }
elseif (($quotes1 == 0) and ($quotes2 == 0)) {
if ($chr == '(') $depth++;
if ($chr == ')') $depth--;
if ($chr == '"') $quotes1 = 1;
if ($chr == "'") $quotes2 = 1;
}
if (($depth == 0) and (preg_match('/^(\<=|\>=|\<|\>|==|or|\|\||and|&&|!=|\+|\-| \% |\^|\=|\||\&)/i',$chr.$chr2.$chr3,$m)) and ($quotes1 == 0) and ($quotes2 == 0)) {
$op = $m[1];
$part = 2;
$pos += (strlen($op) - 1);
} elseif ($part == 1) {
$c1 .= $chr;
} elseif ($part == 2) {
$c2 .= $chr;
}
$pos++;
}
$c1 = trim($c1);
$op = trim($op);
$c2 = trim($c2);
if (substr($c1,0,1) == '%') {
$d1 = '$e1';
$e1 = &$session['vars'][substr($c1,1)];
} elseif (substr($c1,0,1) == '$') {
$d1 = 'evalfunction($c1,&$session)';
} elseif ((substr($c1,0,1) == '(') and (substr($c1,-1,1) == ')')) {
$d1 = 'evalconditional($e1,&$session)';
$e1 = substr($c1,1,-1);
} elseif (((substr($c1,0,1) == '"') and (substr($c1,-1,1) == '"')) or ((substr($c1,0,1) == "'") and (substr($c1,-1,1) == "'"))) {
$d1 = '$e1';
if (substr($c1,0,1) == '"') { $c1 = str_replace(array('\n', '\r'),array("\n", "\r"),$c1); }
$e1 = substr($c1,1,-1);
} elseif (preg_match('/^[0-9+-]*$/',$c1)) {
$d1 = $c1;
} else {
$d1 = 'false';
}
if (($op) and ($c2)) {
if (substr($c2,0,1) == '%') {
$d2 = '$e2';
$e2 = &$session['vars'][substr($c2,1)];
} elseif (substr($c2,0,1) == '$') {
$d2 = 'evalfunction($c2,&$session)';
} elseif ((substr($c2,0,1) == '(') and (substr($c2,-1,1) == ')')) {
$d2 = 'evalconditional($e2,&$session)';
$e2 = substr($c2,1,-1);
} elseif (((substr($c2,0,1) == '"') and (substr($c2,-1,1) == '"')) or ((substr($c2,0,1) == "'") and (substr($c2,-1,1) == "'"))) {
$d2 = '$e2';
if (substr($c2,0,1) == '"') { $c2 = str_replace(array('\n', '\r'),array("\n", "\r"),$c2); }
$e2 = substr($c2,1,-1);
} elseif (preg_match('/^[0-9+-]*$/',$c2)) {
$d2 = $c2;
} else {
$d2 = 'false';
}
if ($debug) echo 'eval(\'$ret = ('.$d1.' '.$op.' '.$d2.');\');'."\n";
eval('$ret = ('.$d1.' '.$op.' '.$d2.');');
} else {
if ($debug) echo 'eval(\'$ret = '.$d1.';\');'."\n";
eval('$ret = '.$d1.';');
}
return $ret;
}
function evalstatement ($statement,&$session) {
global $wpq;
global $wpapi;
global $wpi;
global $debug;
if ($debug) echo 'evalstatement("'.$statement.'",'.serialize($session).');'."\n";
$statements = array (
'if', 'set',
'unset', 'while',
'foreach', 'pagereplace',
'pageappend', 'pagepregreplace',
'pageget', 'pageset',
'pageprepend', 'varappend',
'varprepend', 'getrecentchanges',
'getcategorymembers', 'eval',
'getmodifiedtime', 'getbacklinks',
'getembeddedin', 'getprefix'
);
foreach ($statements as $s) {
if (strtolower(substr($statement,0,strlen($s))) == $s) {
$rest = substr($statement,strlen($s));
switch ($s) {
case 'while':
case 'if':
$tmp = array();
getarguments($rest,&$tmp,&$session,false);
// print_r($tmp);
if ($s == 'if') {
if (evalconditional($tmp[0],&$session)) {
evalscript($tmp[1],&$session);
}
} elseif ($s == 'while') {
while (evalconditional($tmp[0],&$session)) {
evalscript($tmp[1],&$session);
}
}
break;
case 'set':
$tmp = array();
getarguments($rest,&$tmp,&$session);
$tmp[0] = $tmp[1];
break;
case 'unset':
$rest = trim($rest);
if ($rest{0} == '%') {
unset($session['vars'][substr($rest,1)]);
}
break;
case 'pagereplace':
case 'pagepregreplace':
$tmp = array();
getarguments($rest,&$tmp,&$session);
$page = $tmp[0];
$search = $tmp[1];
$replace = $tmp[2];
if (isset($tmp[3])) {
$editsummary = $tmp[3];
} else {
$editsummary = 'Replacing "'.$search.'" with "'.$replace.'". (bot)';
}
if ($s == 'pagereplace') {
$wpi->post($page,str_replace($search,$replace,$wpq->getpage($page)),$editsummary);
} elseif ($s == 'pagepregreplace') {
$wpi->post($page,preg_replace($search,$replace,$wpq->getpage($page)),$editsummary);
}
break;
case 'pageappend':
case 'pageprepend':
case 'pageset':
$tmp = array();
getarguments($rest,&$tmp,&$session);
$page = $tmp[0];
$data = $tmp[1];
if (isset($tmp[2])) {
$editsummary = $tmp[2];
} else {
if ($s == 'pageappend') {
$editsummary = 'Appending "'.((strlen($data) > 150)?substr($data,0,150).'...':$data).'". (bot)';
} elseif ($s == 'pageset') {
$editsummary = 'Setting page to "'.((strlen($data) > 100)?substr($data,0,100).'...':$data).'". (bot)';
}
}
if ($s == 'pageappend') {
$data = $wpq->getpage($page).$data;
} elseif ($s == 'pageprepend') {
$data = $data.$wpq->getpage($page);
}
$wpi->post($page,$data,$editsummary);
break;
case 'pageget':
$tmp = array();
getarguments($rest,&$tmp,&$session);
$page = $tmp[0];
$tmp[1] = $wpq->getpage($page);
break;
case 'varappend':
case 'varprepend':
$tmp = array();
getarguments($rest,&$tmp,&$session);
if ($s == 'varprepend') {
$tmp[0] = $tmp[1].$tmp[0];
} elseif ($s == 'varappend') {
$tmp[0] .= $tmp[1];
}
break;
case 'foreach':
$tmp = array();
getarguments($rest,&$tmp,&$session);
foreach (explode($tmp[1],$tmp[0]) as $tmp[2]) {
evalscript(trim($tmp[3]),&$session);
}
break;
case 'getrecentchanges':
$tmp = array();
getarguments($rest,&$tmp,&$session);
if (count($tmp) == 2) {
$x = $wpapi->recentchanges();
} elseif (count($tmp) == 3) {
$x = $wpapi->recentchanges($tmp[2]);
}
$z = array();
foreach ($x as $y) {
$z[] = $y['title'];
}
$tmp[0] = implode($tmp[1],$z);
break;
case 'getcategorymembers':
$tmp = array();
getarguments($rest,&$tmp,&$session);
if (count($tmp) == 3) {
$x = $wpapi->categorymembers($tmp[2]);
} elseif (count($tmp) == 4) {
$x = $wpapi->categorymembers($tmp[2],$tmp[3]);
} elseif (count($tmp) == 5) {
$x = $wpapi->categorymembers($tmp[2],$tmp[3],$tmp[4]);
}
$z = array();
foreach ($x as $y) { $z[] = $y['title']; }
$tmp[0] = implode($tmp[1],$z);
break;
case 'getbacklinks':
$tmp = array();
getarguments($rest,&$tmp,&$session);
if (count($tmp) == 3) {
$x = $wpapi->backlinks($tmp[2]);
} elseif (count($tmp) == 4) {
$x = $wpapi->backlinks($tmp[2],$tmp[3]);
} elseif (count($tmp) == 5) {
$x = $wpapi->backlinks($tmp[2],$tmp[3],$tmp[4]);
}
$z = array();
if (isset($x) and is_array($x)) { foreach ($x as $y) { $z[] = $y['title']; } }
$tmp[0] = implode($tmp[1],$z);
break;
case 'getembeddedin':
$tmp = array();
getarguments($rest,&$tmp,&$session);
if (count($tmp) == 3) {
$x = $wpapi->embeddedin($tmp[2]);
} elseif (count($tmp) == 4) {
$x = $wpapi->embeddedin($tmp[2],$tmp[3]);
} elseif (count($tmp) == 5) {
$x = $wpapi->embeddedin($tmp[2],$tmp[3],$tmp[4]);
}
$z = array();
if (isset($x) and is_array($x)) { foreach ($x as $y) { $z[] = $y['title']; } }
$tmp[0] = implode($tmp[1],$z);
break;
case 'getmodifiedtime':
$tmp = array();
getarguments($rest,&$tmp,&$session);
if (count($tmp) == 2) {
$x = $wpapi->revisions($tmp[1]);
if (preg_match('/(\d+)\-(\d+)\-(\d+)T(\d+):(\d+):(\d+)/',$x[0]['timestamp'],$m)) {
$tmp[0] = gmmktime($m[4],$m[5],$m[6],$m[2],$m[3],$m[1]);
}
}
break;
case 'getprefix':
$tmp = array();
getarguments($rest,&$tmp,&$session);
if (count($tmp) == 3) {
$x = $wpapi->listprefix($tmp[2]);
} elseif (count($tmp) == 4) {
$x = $wpapi->listprefix($tmp[2],$tmp[3]);
} elseif (count($tmp) == 5) {
$x = $wpapi->listprefix($tmp[2],$tmp[3],$tmp[4]);
} elseif (count($tmp) == 6) {
$x = $wpapi->listprefix($tmp[2],$tmp[3],$tmp[4],$tmp[5]);
}
$z = array();
foreach ($x as $y) { $z[] = $y['title']; }
$tmp[0] = implode($tmp[1],$z);
break;
case 'eval':
$tmp = array();
getarguments($rest,&$tmp,&$session);
evalscript($tmp[0],&$session);
break;
}
break;
}
}
}
function evalscript ($script,&$session = array()) {
/* Ok, we need to evaluate a ClueBot Script. */
global $debug;
if ($debug) echo 'evalscript("'.$script.'",'.serialize($session).');'."\n";
$pos = 0;
$quotes1 = 0;
$quotes2 = 0;
$depth = 0;
$script = trim($script);
$tmp = '';
if ((substr($script,0,1) == '{') and (substr($script,-1,1) == '}')) {
$script = trim(substr($script,1,-1));
}
while ($pos < strlen($script)) {
if (($quotes1 == 1) and ($script{$pos} == '"')) $quotes1 = 0;
elseif (($quotes2 == 1) and ($script{$pos} == "'")) $quotes2 = 0;
elseif (($quotes1 == 0) and ($quotes2 == 0)) {
if ($script{$pos} == '"') $quotes1 = 1;
if ($script{$pos} == "'") $quotes2 = 1;
if ($script{$pos} == '{') $depth++;
if ($script{$pos} == '}') $depth--;
if ((($script{$pos} == ';') or ($script{$pos} == '}')) and ($depth == 0)) {
if ($script{$pos} == '}') $tmp .= $script{$pos};
evalstatement(trim($tmp),&$session);
$tmp = '';
$pos++;
continue;
}
}
$tmp .= $script{$pos};
$pos++;
}
}
?>
Source to ClueBot II
<?PHPdeclare(ticks = 1);
pcntl_signal(SIGALRM, "docron", true);
include 'cluebot2.cbsfunctions.php';
function pub_evalscript ($script) { return evalscript($script); } /* Enable it to be called from docron() */
function pub_doatq () { return doatq(); } /* Enable it to be called from docron() */
function doatq () {
global $user;
global $wpq;
global $wpi;
global $wpapi;
$header = explode("\n#---\n",$wpq->getpage('User:'.$user.'/atq.js'),2);
$atq = explode("\nEOF.\n\n",$header[1]);
$header = $header[0];
$changed = false;
if ((count($atq) > 0) and (isset($atq[0])) and ($atq[0])) {
foreach ($atq as $key => $data) {
$data = explode("\n",$data,2);
$time = $data[0];
$script = $data[1];
if (time() >= $time) {
evalscript($script);
unset($atq[$key]);
$changed = true;
}
}
}
if ($changed == true) {
$wpapi->edit('User:'.$user.'/atq.js',$header."\n#---\n".implode("\nEOF.\n\n",$atq),'Updating atq.');
// echo 'Ugg...'."\n";
}
}
function docron () {
global $user;
global $wpq;
global $wpapi;
global $wpi;
pcntl_alarm(60);
$cron = explode("\n",$wpq->getpage('User:'.$user.'/crontab.js'));
$m = gmdate('i');
$h = gmdate('H');
$dm= gmdate('d');
$mo= gmdate('m');
$dw= gmdate('w');
foreach ($cron as $key => $data) {
if (substr($data,0,1) == '#') continue;
$data = explode(' ',$data,7);
$min = $data[0];
$hour = $data[1];
$dom = $data[2];
$mon = $data[3];
$dow = $data[4];
$func = $data[5];
$args = (isset($data[6])?unserialize(base64_decode($data[6])):array());
if (
(
($min == '*')
or ($min == $m)
or ((substr($min,0,2) == '*/') and ($tmp = explode('/',$min,2)) and (($m % $tmp[1]) == 0))
or (in_array($m,explode(',',$min)))
)
and (
($hour == '*')
or ($hour == $h)
or ((substr($hour,0,2) == '*/') and ($tmp = explode('/',$hour,2)) and (($h % $tmp[1]) == 0))
or (in_array($h,explode(',',$hour)))
)
and (
($dom == '*')
or ($dom == $dm)
or ((substr($dom,0,2) == '*/') and ($tmp = explode('/',$dom,2)) and (($dm % $tmp[1]) == 0))
or (in_array($dm,explode(',',$dom)))
)
and (
($mon == '*')
or ($mon == $mo)
or ((substr($mon,0,2) == '*/') and ($tmp = explode('/',$mon,2)) and (($mo % $tmp[1]) == 0))
or (in_array($mo,explode(',',$mon)))
)
and (
($dow == '*')
or ($dow == $dw)
or ((substr($dow,0,2) == '*/') and ($tmp = explode('/',$dow,2)) and (($dw % $tmp[1]) == 0))
or (in_array($dw,explode(',',$dow)))
)
) {
call_user_func_array('pub_'.$func,$args);
}
}
}
include '../wikibot.classes.php';
include 'cluebot2.config.php';
$wpq = new wikipediaquery;
$wpi = new wikipediaindex;
$wpapi = new wikipediaapi;
$wpapi->login($user,$pass);
$wpapi->edit('User:'.$user.'/Source',
'The following is automatically generated by '.$user.".\n\n\n\n" .
'* wikibot.classes.php is here.' .
"\n\n\n\n==ClueBot Script (cluebot2.cbsfunctions.php)==\n\n<pre>" .
htmlentities(file_get_contents('cluebot2.cbsfunctions.php'))."</pre>\n\n\n\n==Source to ".$user .
"==\n\n".'<pre>'.htmlentities(file_get_contents(__FILE__))."</pre>\n\n\n\n" .
'==Source to '.$user." (task 2)==\n\n<pre>".htmlentities(file_get_contents('cluebot2.task2.php')) .
"</pre>\n\n\n\n~~~~",
'Automated source upload.'); /* Our source code, we force post this because this is *our* page, and it triggers the nobots. */
// $session = array();
// evalscript('set %cm ""; getcategorymembers %cm "\n" "Wikipedia bots" "500";',&$session);
// print_r($session);
// foreach ($session['vars'] as $var => $value) {
// echo '%'.$var.' = '.$value."\n";
// }
docron();
while (1) sleep(2);
?>
Source to ClueBot II (task 2)
<?PHPinclude '../wikibot.classes.php';
include 'cluebot2.config.php';
$wpq = new wikipediaquery;
$wpapi = new wikipediaapi;
$wpi = new wikipediaindex;
// $wpapi->login($user,$pass);
while (true) {
$wpapi->login($user,$pass);
$content = $wpq->getpage('Wikipedia:Suspected copyright violations');
$content = str_replace("\n\n","\n",$content);
$comment = '<!-- When removing items from this list, please only edit below this comment. -->'."\n";
$tmp = explode($comment,$content,2);
$header = $tmp[0].$comment;
$body = $tmp[1];
$body = preg_replace('/===.*===\n/iU','',$body);
// echo $body."\n";
preg_match_all('/(^|\n)\*\s*([^ ][^\n]*\s*)?\[\[([^|\x5d]+)\]\]\s*([^ ][^\n]*\s*)?(--|—)\s*([^ ](.|\n)*)(?=(\n\*\s*([^ ][^\n]*\s*)?\[\[[^|\x5d]+\]\]\s*([^ ][^\n]*\s*)?(--|—)|$))/iU',$body,$matches,PREG_SET_ORDER);
// print_r($matches);
$redlinks = false;
// $unsetrls = unserialize(file_get_contents('unsetredlinks.txt'));
// foreach ($unsetrls as $key => $time) if ((time() - $time) > (24*60*60)) unset($unsetrls[$key]);
foreach ($matches as $key => $match) {
if ($wpq->getpageid($match[3]) <= 0) {
// $unsetrls[$match[3]] = time();
$redlinks = true;
// print_r($match);
unset($matches[$key]);
}
}
// file_put_contents('unsetredlinks.txt',serialize($unsetrls));
$date = '';
$data = $header;
foreach ($matches as $match) {
preg_match('/(\d+) (January|February|March|April|May|June|July|August|September|November|December) (\d+)/i',$match[5],$m);
$tmpdate = $m[2].' '.$m[1].', '.$m[3];
// if ($date != $tmpdate) { $date = $tmpdate; $data .= '==='.$date.'==='."\n"; } /* Uncomment this line if you want headers */
$data .= '* '.($match[2]?$match[2].' ':).''.$match[3].' '.($match[4]?$match[4].' ':).'— '.$match[6]."\n";
}
// echo $data;
if ($redlinks == true) {
$wpi->post('Wikipedia:Suspected copyright violations',$data,'Removing redlinks.');
}
sleep(600);
}
?>
ClueBot II (talk) 16:58, 8 January 2011 (UTC)