This is the code for SinBot. and this is the code that shall be followed in order for SinBot to execute its actions nicely. Any questions go on my talk page. Thank you.
If the code was written correctly, then the following shall be SinBots duties:
thats about it. If my bot does anyhing else, let me know.
I am currently still waiting for this bot to be accepted, then i shall paste the code onto here.
<tt> <?PHP class http { private $ch; private $uid; public $postfollowredirs; public $getfollowredirs; function data_encode ($data, $keyprefix = "", $keypostfix = "") { assert( is_array($data) ); $vars=null; foreach($data as $key=>$value) { if(is_array($value)) $vars .= $this->data_encode($value, $keyprefix.$key.$keypostfix.urlencode("")); else $vars .= $keyprefix.$key.$keypostfix."=".urlencode($value)."&"; } return $vars; } function __construct () { $this->ch = curl_init(); $this->uid = dechex(rand(0,99999999)); curl_setopt($this->ch,CURLOPT_COOKIEJAR,'/tmp/cluewikibot.cookies.'.$this->uid.'.dat'); curl_setopt($this->ch,CURLOPT_COOKIEFILE,'/tmp/cluewikibot.cookies.'.$this->uid.'.dat'); curl_setopt($this->ch,CURLOPT_MAXCONNECTS,100); curl_setopt($this->ch,CURLOPT_CLOSEPOLICY,CURLCLOSEPOLICY_LEAST_RECENTLY_USED); $this->postfollowredirs = 0; $this->getfollowredirs = 1; } function post ($url,$data) { // echo 'POST: '.$url."\n"; $time = microtime(1); curl_setopt($this->ch,CURLOPT_URL,$url); curl_setopt($this->ch,CURLOPT_FOLLOWLOCATION,$this->postfollowredirs); curl_setopt($this->ch,CURLOPT_MAXREDIRS,10); curl_setopt($this->ch,CURLOPT_HEADER,0); curl_setopt($this->ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($this->ch,CURLOPT_TIMEOUT,30); curl_setopt($this->ch,CURLOPT_CONNECTTIMEOUT,10); curl_setopt($this->ch,CURLOPT_POST,1); // curl_setopt($this->ch,CURLOPT_POSTFIELDS, substr($this->data_encode($data), 0, -1) ); curl_setopt($this->ch,CURLOPT_POSTFIELDS, $data); $data = curl_exec($this->ch); //var_dump($data); echo 'POST: '.$url.' ('.(microtime(1) - $time).' s) ('.strlen($data)." b)\n"; return $data; } function get ($url) { //echo 'GET: '.$url."\n"; $time = microtime(1); curl_setopt($this->ch,CURLOPT_URL,$url); curl_setopt($this->ch,CURLOPT_FOLLOWLOCATION,$this->getfollowredirs); curl_setopt($this->ch,CURLOPT_MAXREDIRS,10); curl_setopt($this->ch,CURLOPT_HEADER,0); curl_setopt($this->ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($this->ch,CURLOPT_TIMEOUT,30); curl_setopt($this->ch,CURLOPT_CONNECTTIMEOUT,10); curl_setopt($this->ch,CURLOPT_HTTPGET,1); $data = curl_exec($this->ch); //var_dump($data); echo 'GET: '.$url.' ('.(microtime(1) - $time).' s) ('.strlen($data)." b)\n"; return $data; } function __destruct () { curl_close($this->ch); @unlink('/tmp/cluewikibot.cookies.'.$this->uid.'.dat'); } } class wiktionaryquery { private $http; public $queryurl = 'http://en.wiktionary.org/w/query.php'; function __construct () { global $__wp__http; if (!isset($__wp__http)) { $__wp__http = new http; } $this->http = &$__wp__http; } function getpage ($page) { $ret = unserialize($this->http->get($this->queryurl.'?what=content&format=php&titles='.urlencode($page))); foreach ($ret as $page) { return $page; } } function getpageid ($page) { $ret = unserialize($this->http->get($this->queryurl.'?what=content&format=php&titles='.urlencode($page))); foreach ($ret as $page) { return $page; } } function contribcount ($user) { $ret = unserialize($this->http->get($this->queryurl.'?what=contribcounter&format=php&titles=User:'.urlencode($user))); foreach ($ret as $page) { return $page; } } } class wiktionaryapi { private $http; public $apiurl = 'http://en.wiktionary.org/w/api.php'; function __construct () { global $__wp__http; if (!isset($__wp__http)) { $__wp__http = new http; } $this->http = &$__wp__http; } function login ($user,$pass) { $this->http->post($this->apiurl.'?action=login',array('lgname' => $user, 'lgpassword' => $pass)); } function getedittoken () { $x = $this->http->get($this->apiurl.'?action=query&format=php&prop=info&intoken=edit&titles=Main%20Page'); $x = unserialize($x); foreach ($x as $y) { return $y; } } function recentchanges ($count = 10,$namespace = null,$dir = 'older',$ts = null) { $append = ''; if ($ts !== null) { $append .= '&rcstart='.urlencode($ts); } $append .= '&rcdir='.urlencode($dir); if ($namespace !== null) { $append .= '&rcnamespace='.urlencode($namespace); } $x = $this->http->get($this->apiurl.'?action=query&list=recentchanges&rcprop=user|comment|flags|timestamp|title|ids|sizes&format=php&rclimit='.$count.$append); $x = unserialize($x); return $x; } function search ($search,$limit = 10,$offset = 0,$namespace = 0,$what = 'text',$redirs = false) { $append = ''; if ($limit != null) $append .= '&srlimit='.urlencode($limit); if ($offset != null) $append .= '&sroffset='.urlencode($offset); if ($namespace != null) $append .= '&srnamespace='.urlencode($namespace); if ($what != null) $append .= '&srwhat='.urlencode($what); if ($redirs == true) $append .= '&srredirects=1'; else $append .= '&srredirects=0'; $x = $this->http->get($this->apiurl.'?action=query&list=search&format=php&srsearch='.urlencode($search).$append); $x = unserialize($x); return $x; } function logs ($user = null,$title = null,$limit = 50,$type = null,$start = null,$end = null,$dir = 'older') { $append = ''; if ($user != null) $append.= '&leuser='.urlencode($user); if ($title != null) $append.= '&letitle='.urlencode($title); if ($limit != null) $append.= '&lelimit='.urlencode($limit); if ($type != null) $append.= '&letype='.urlencode($type); if ($start != null) $append.= '&lestart='.urlencode($start); if ($end != null) $append.= '&leend='.urlencode($end); if ($dir != null) $append.= '&ledir='.urlencode($dir); $x = $this->http->get($this->apiurl.'?action=query&format=php&list=logevents&leprop=ids|title|type|user|timestamp|comment|details'.$append); $x = unserialize($x); return $x; } function usercontribs ($user,$count = 50,&$continue = null,$dir = 'older') { if ($continue != null) { $append = '&ucstart='.urlencode($continue); } else { $append = ''; } $x = $this->http->get($this->apiurl.'?action=query&format=php&list=usercontribs&ucuser='.urlencode($user).'&uclimit='.urlencode($count).'&ucdir='.urlencode($dir).$append); $x = unserialize($x); $continue = $x; return $x; } function revisions ($page,$count = 1,$dir = 'older',$content = false,$revid = null,$wait = true,$getrbtok = false,$dieonerror = true,$redirects = false) { $x = $this->http->get($this->apiurl.'?action=query&prop=revisions&titles='.urlencode($page).'&rvlimit='.urlencode($count).'&rvprop=timestamp|ids|user|comment'.(($content)?'|content':'').'&format=php&meta=userinfo&rvdir='.urlencode($dir).(($revid !== null)?'&rvstartid='.urlencode($revid):'').(($getrbtok == true)?'&rvtoken=rollback':'').(($redirects == true)?'&redirects':'')); $x = unserialize($x); if ($revid !== null) { $found = false; if (!isset($x) or !is_array($x)) { if ($dieonerror == true) die('No such page.'."\n"); else return false; } foreach ($x as $data) { if (!isset($data) or !is_array($data)) { if ($dieonerror == true) die('No such page.'."\n"); else return false; } foreach ($data as $data2) if ($data2 == $revid) $found = true; unset($data,$data2); break; } if ($found == false) { if ($wait == true) { sleep(1); return $this->revisions($page,$count,$dir,$content,$revid,false,$getrbtok,$dieonerror); } else { if ($dieonerror == true) die('Revision error.'."\n"); } } } foreach ($x as $data) { $data = $data; $data = $data; $data = $x; // $data = $x; $data = $x; return $data; } } function users ($start = null,$limit = 1,$group = null,$reqirestart = false,&$continue = null) { $append = ''; if ($start != null) $append .= '&aufrom='.urlencode($start); if ($group != null) $append .= '&augroup='.urlencode($group); $x = $this->http->get($this->apiurl.'?action=query&list=allusers&format=php&auprop=blockinfo|editcount|registration|groups&aulimit='.urlencode($limit).$append); $x = unserialize($x); $continue = $x; if (($requirestart == true) and ($x != $start)) return false; return $x; } function categorymembers ($category,$count = 500,&$continue = null) { if ($continue != null) { $append = '&cmcontinue='.urlencode($continue); } else { $append = ''; } $category = 'Category:'.str_ireplace('category:','',$category); $x = $this->http->get($this->apiurl.'?action=query&list=categorymembers&cmtitle='.urlencode($category).'&format=php&cmlimit='.$count.$append); $x = unserialize($x); $continue = $x; return $x; } function listcategories (&$start = null,$limit = 50,$dir = 'ascending',$prefix = null) { $append = ''; if ($start != null) $append .= '&acfrom='.urlencode($start); if ($limit != null) $append .= '&aclimit='.urlencode($limit); if ($dir != null) $append .= '&acdir='.urlencode($dir); if ($prefix != null) $append .= '&acprefix='.urlencode($prefix); $x = $this->http->get($this->apiurl.'?action=query&list=allcategories&acprop=size&format=php'.$append); $x = unserialize($x); $start = $x; return $x; } function backlinks ($page,$count = 500,&$continue = null,$filter = null) { if ($continue != null) { $append = '&blcontinue='.urlencode($continue); } else { $append = ''; } if ($filter != null) { $append .= '&blfilterredir='.urlencode($filter); } $x = $this->http->get($this->apiurl.'?action=query&list=backlinks&bltitle='.urlencode($page).'&format=php&bllimit='.$count.$append); $x = unserialize($x); $continue = $x; return $x; } function embeddedin ($page,$count = 500,&$continue = null) { if ($continue != null) { $append = '&eicontinue='.urlencode($continue); } else { $append = ''; } $x = $this->http->get($this->apiurl.'?action=query&list=embeddedin&eititle='.urlencode($page).'&format=php&eilimit='.$count.$append); $x = unserialize($x); $continue = $x; return $x; } function listprefix ($prefix,$namespace = 0,$count = 500,&$continue = null) { $append = '&apnamespace='.urlencode($namespace); if ($continue != null) { $append .= '&apfrom='.urlencode($continue); } $x = $this->http->get($this->apiurl.'?action=query&list=allpages&apprefix='.urlencode($prefix).'&format=php&aplimit='.$count.$append); $x = unserialize($x); $continue = $x; return $x; } } class wiktionaryindex { private $http; public $indexurl = 'http://en.wiktionary.orghttps://en.wiktionary.org/w/index.php'; private $postinterval = 0; private $lastpost; private $edittoken; function __construct () { global $__wp__http; if (!isset($__wp__http)) { $__wp__http = new http; } $this->http = &$__wp__http; } function post ($page,$data,$summery = '',$minor = false,$rv = null,$bot = true) { global $user; global $maxlag; global $irc; global $irctechchannel; global $run; global $maxlagkeepgoing; $wpq = new wiktionaryquery; $wpq->queryurl = str_replace('index.php','query.php',$this->indexurl); $wpapi = new wiktionaryapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl); if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken(); if ($rv == null) $rv = $wpapi->revisions($page,1,'older',true); if (!$rv) $rv = $wpq->getpage($page); //Fake the edit form. $now = gmdate('YmdHis', time()); $token = htmlspecialchars($this->edittoken); $tmp = date_parse($rv); $edittime = gmdate('YmdHis', gmmktime($tmp,$tmp,$tmp,$tmp,$tmp,$tmp)); $html = "<input type='hidden' value=\"{$now}\" name=\"wpStarttime\" />\n"; $html.= "<input type='hidden' value=\"{$edittime}\" name=\"wpEdittime\" />\n"; $html.= "<input type='hidden' value=\"{$token}\" name=\"wpEditToken\" />\n"; $html.= '<input name="wpAutoSummary" type="hidden" value="'.md5('').'" />'."\n"; if (preg_match('/'.preg_quote('{{nobots}}','/').'/iS',$rv)) { return false; } /* Honor the bots flags */ if (preg_match('/'.preg_quote('{{bots|allow=none}}','/').'/iS',$rv)) { return false; } if (preg_match('/'.preg_quote('{{bots|deny=all}}','/').'/iS',$rv)) { return false; } if (preg_match('/'.preg_quote('{{bots|deny=','/').'(.*)'.preg_quote('}}','/').'/iS',$rv,$m)) { if (in_array(explode(',',$m),$user)) { return false; } } /* /Honor the bots flags */ if (!preg_match('/'.preg_quote($user,'/').'/iS',$rv)) { return false; } /* We need to be logged in */ // if (preg_match('/'.preg_quote('You have new messages','/').'/iS',$rv)) { return false; } /* Check talk page */ if (!preg_match('/(yes|enable|true)/iS',((isset($run))?$run:$wpq->getpage('User:'.$user.'/Run')))) { return false; } /* Check /Run page */ $x = $this->forcepost($page,$data,$summery,$minor,$html,$maxlag,$maxlagkeepgoing,$bot); /* Go ahead and post. */ $this->lastpost = time(); return $x; } function forcepost ($page,$data,$summery = '',$minor = false,$edithtml = null,$maxlag = null,$mlkg = null,$bot = true) { $post = ''; $post = ''; if ($minor == true) { $post = 1; } $post = $data; $post = $summery; if ($edithtml == null) { $html = $this->http->get($this->indexurl.'?title='.urlencode($page).'&action=edit'); } else { $html = $edithtml; } preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpStarttime\" /\>|U',$html,$m); $post = $m; preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpEdittime\" /\>|U',$html,$m); $post = $m; preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpEditToken\" /\>|U',$html,$m); $post = $m; preg_match('|\<input name\=\"wpAutoSummary\" type\=\"hidden\" value\=\"(.*)\" /\>|U',$html,$m); $post = $m; if ($maxlag != null) { $x = $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&maxlag='.urlencode($maxlag).'&bot='.(($bot == true)?'1':'0'),$post); if (preg_match('/Waiting for (*): (+) seconds lagged/S',$x,$lagged)) { global $irc; if (is_resource($irc)) { global $irctechchannel; foreach(explode(',',$irctechchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :'.$lagged.' is lagged out by '.$lagged.' seconds. ('.$lagged.')'."\n"); } } sleep(10); if ($mlkg != true) { return false; } else { $x = $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&bot='.(($bot == true)?'1':'0'),$post); } } return $x; } else { return $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&bot='.(($bot == true)?'1':'0'),$post); } } function diff ($title,$oldid,$id,$wait = true) { $deleted = ''; $added = ''; $html = $this->http->get($this->indexurl.'?title='.urlencode($title).'&action=render&diff='.urlencode($id).'&oldid='.urlencode($oldid).'&diffonly=1'); if (preg_match_all('/\&\;(oldid\=|undo=)(\d*)\\\'\>(Revision as of|undo)/USs', $html, $m, PREG_SET_ORDER)) { //print_r($m); if ((($oldid != $m) and (is_numeric($oldid))) or (($id != $m) and (is_numeric($id)))) { if ($wait == true) { sleep(1); return $this->diff($title,$oldid,$id,false); } else { die('Revision error.'."\n"); } } } if (preg_match_all('/\<td class\=(\"|\\\')diff-addedline\1\>\<div\>(.*)\<\/div\>\<\/td\>/USs', $html, $m, PREG_SET_ORDER)) { //print_r($m); foreach ($m as $x) { $added .= htmlspecialchars_decode(strip_tags($x))."\n"; } } if (preg_match_all('/\<td class\=(\"|\\\')diff-deletedline\1\>\<div\>(.*)\<\/div\>\<\/td\>/USs', $html, $m, PREG_SET_ORDER)) { //print_r($m); foreach ($m as $x) { $deleted .= htmlspecialchars_decode(strip_tags($x))."\n"; } } //echo $added."\n".$deleted."\n"; if (preg_match('/action\=rollback\&\;from\=.*\&\;token\=(.*)\"/US', $html, $m)) { $rbtoken = urldecode($rbtoken); return array($added,$deleted,$rbtoken); } return array($added,$deleted); } function rollback ($title,$user,$reason = null,$token = null,$bot = true) { if (($token == null) or (!$token)) { $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl); $token = $wpapi->revisions($title,1,'older',false,null,true,true); if ($token == $user) { $token = $token; } else { return false; } } $x = $this->http->get($this->indexurl.'?title='.urlencode($title).'&action=rollback&from='.urlencode($user).'&token='.urlencode($token).(($reason != null)?'&summary='.urlencode($reason):'').'&bot='.(($bot == true)?'1':'0')); if (!preg_match('/action complete/iS',$x)) return false; return $x; } function move ($old,$new,$reason) { $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl); if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken(); $token = htmlspecialchars($this->edittoken); $post = array ( 'wtOldTitle' => $old, 'wtNewTitle' => $new, 'wtReason' => $reason, 'wtWatch' => '0', 'wtEditToken' => $token, 'wtMove' => 'Move page' ); return $this->http->post($this->indexurl.'?title=Special:Movepage&action=submit',$post); } function upload ($page,$file,$desc) { $post = array ( 'wtUploadFile' => '@'.$file, 'wtSourceType' => 'file', 'wtDestFile' => $page, 'wtUploadDescription' => $desc, 'wtLicense' => '', 'wtWatchthis' => '0', 'wtIgnoreWarning' => '1', 'wtUpload' => 'Upload file' ); return $this->http->post($this->indexurl.'?title=Special:Upload&action=submit',$post); } function hasemail ($user) { $tmp = $this->http->get($this->indexurl.'?title=Special:EmailUser&target='.urlencode($user)); if (stripos($tmp,"No e-mail address") !== false) return false; return true; } function email ($user,$subject,$body) { $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl); if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken(); $post = array ( 'wtSubject' => $subject, 'wtText' => $body, 'wtCCMe' => 0, 'wtSend' => 'Send', 'wtEditToken' => $this->edittoken ); return $this->http->post($this->indexurl.'?title=Special:EmailUser&target='.urlencode($user).'&action=submit',$post); } } ?> Diff function (diff.function.php) <?PHP function diff ($old,$new,$nret = true,$inline = false) { // if ($inline) { // return str_replace(array("\n",chr(92).chr(92),'\n'),array(' ',chr(92),"\n"),diff(implode("\n",explode(' ',str_replace(array(chr(92),"\n"),array(chr(92).chr(92),'\n'),$old))),implode("\n",explode(' ',str_replace(array(chr(92),"\n"),array(chr(92).chr(92),'\n'),$new))),$nret,false)); // } $file1 = tempnam('/tmp','diff_'); $file2 = tempnam('/tmp','diff_'); file_put_contents($file1,$old); file_put_contents($file2,$new); $out = array(); if ($inline) { // echo 'EXEC: wdiff -3'.(($nret)?'1':'2').' '.escapeshellarg($file1).' '.escapeshellarg($file2)."\n"; @exec('wdiff -3'.(($nret)?'1':'2').' '.escapeshellarg($file1).' '.escapeshellarg($file2),$out); foreach ($out as $key => $line) { if ($line == '======================================================================') unset($out); elseif ($nret) $out = '> '.$line; else $out = '< '.$line; } } else { @exec('diff -d --suppress-common-lines '.escapeshellarg($file1).' '.escapeshellarg($file2),$out); } $out2 = array(); foreach ($out as $line) { if ( ( ($nret) and (preg_match('/^\> .*$/',$line)) ) or ( (!$nret) and (preg_match('/^\< .*$/',$line)) ) ) { $out2 = substr($line,2); } } $out = $out2; unset($out2); unlink($file1); unlink($file2); return implode("\n",$out); } ?> </tt> <h3>diff.function.php</h3> <tt> <?PHP function diff ($old,$new,$nret = true,$inline = false) { // if ($inline) { // return str_replace(array("\n",chr(92).chr(92),'\n'),array(' ',chr(92),"\n"),diff(implode("\n",explode(' ',str_replace(array(chr(92),"\n"),array(chr(92).chr(92),'\n'),$old))),implode("\n",explode(' ',str_replace(array(chr(92),"\n"),array(chr(92).chr(92),'\n'),$new))),$nret,false)); // } $file1 = tempnam('/tmp','diff_'); $file2 = tempnam('/tmp','diff_'); file_put_contents($file1,$old); file_put_contents($file2,$new); $out = array(); if ($inline) { // echo 'EXEC: wdiff -3'.(($nret)?'1':'2').' '.escapeshellarg($file1).' '.escapeshellarg($file2)."\n"; @exec('wdiff -3'.(($nret)?'1':'2').' '.escapeshellarg($file1).' '.escapeshellarg($file2),$out); foreach ($out as $key => $line) { if ($line == '======================================================================') unset($out); elseif ($nret) $out = '> '.$line; else $out = '< '.$line; } } else { @exec('diff -d --suppress-common-lines '.escapeshellarg($file1).' '.escapeshellarg($file2),$out); } $out2 = array(); foreach ($out as $line) { if ( ( ($nret) and (preg_match('/^\> .*$/',$line)) ) or ( (!$nret) and (preg_match('/^\< .*$/',$line)) ) ) { $out2 = substr($line,2); } } $out = $out2; unset($out2); unlink($file1); unlink($file2); return implode("\n",$out); } ?> </tt> <h3>Source to SinBot</h3> <tt><nowiki> <?PHP declare(ticks = 1); function sig_handler($signo) { switch ($signo) { case SIGCHLD: while (($x = pcntl_waitpid(0, $status, WNOHANG)) != -1) { if ($x == 0) break; $status = pcntl_wexitstatus($status); } break; } } pcntl_signal(SIGCHLD, "sig_handler"); function score ($list,$data,&$matches = null) { $ret = 0; foreach ($list as $preg => $pts) { if ($x = preg_match_all($preg.'S',$data,$m)) { // echo $x.'*'.$pts.' ('.$preg.')'."\n"; $matches = $x; $ret += $pts * $x; } } // echo 'Score: '.$ret."\n"; return $ret; } include '../diff.function.php'; /* The diff function. */ include '../wikibot.classes.php'; /* The wiktionary classes. */ include 'cluebot.config.php'; /* This file is very simple, but it contains sensitive information, we just define $user, $ircserver, $ircport, $ircchannel, $pass, $owner, and $status. */ include 'cluebot.scorelist.php'; /* This file is uploaded as well as the main file. */ $wpapi = new wiktionaryapi; $wpq = new wiktionaryquery; $wpi = new wiktionaryindex; $wpapi->login($user,$pass); $mysql = mysql_pconnect($mysqlhost.':'.$mysqlport,$mysqluser,$mysqlpass); if (!$mysql) { die('Could not connect: ' . mysql_error()); } if (!mysql_select_db($mysqldb, $mysql)) { die ('Can\'t use database : ' . mysql_error()); } $ircconfig = explode("\n",$wpq->getpage('User:'.$owner.'/CBChannels.js')); $tmp = array(); foreach($ircconfig as $tmpline) { if (substr($tmpline,0,1) != '#') { $tmpline = explode('=',$tmpline,2); $tmp)] = trim($tmpline); } } $ircchannel = $tmp; $ircdebugchannel = $tmp; $ircreportchannel = $tmp; $ircvandalismchannel = $tmp; $ircaivchannel = $tmp; $irctechchannel = $tmp; $ircproxychannels = $tmp; $ircunrevertedchannels = $tmp; $ircbagtrialchannels = $tmp; $ircotherchannels = $tmp; unset($tmp,$tmpline); $stalkbots = array(); $trialbots = explode("\n",$wpq->getpage('Wiktionary:Bots/Requests for approval')); foreach ($trialbots as $trialbot) if (preg_match('/\{\{BRFA\|(.*)\|.*\|Trial\}\}/',str_replace(array("\n","\r"),'',$trialbot),$m)) $stalkbots] = 1; $irc = fsockopen($ircserver,$ircport,$ircerrno,$ircerrstr,15); $ircpid = pcntl_fork(); if ($ircpid == 0) { fwrite($irc,'PASS '.$ircpass."\n"); fwrite($irc,'USER '.$user.' "1" "1" :Sinbot Wiktionary Bot.'."\n"); fwrite($irc,'NICK '.$user."\n"); while (!feof($irc)) { $data = str_replace(array("\n","\r"),'',fgets($irc,1024)); // echo 'IRC: '.$data."\n"; $d = explode(' ',$data); if (strtolower($d) == 'ping') { fwrite($irc,'PONG '.$d."\n"); } elseif (($d == '376') or ($d == '422')) { // fwrite($irc,'PRIVMSG NickServ :identify '.$pass."\n"); // sleep(2); fwrite($irc,'JOIN '.$ircchannel.','.$ircdebugchannel.','.$ircreportchannel.','.$ircvandalismchannel.','.$ircaivchannel.','.$irctechchannel.','.$ircproxychannels.','.$ircunrevertedchannels.','.$ircbagtrialchannels.','.$ircotherchannels."\n"); foreach (explode(',',$ircchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :IRC logging enabled.'."\n"); } } elseif (strtolower($d) == 'privmsg') { if (substr($d,0,2) == ':!') { if (strtolower($d) == '#wiktionary-en') { $tmp = explode('!',substr($d,1)); $cmd = 'NOTICE '.$tmp; } elseif (strtolower($d) == strtolower($user)) { $tmp = explode('!',substr($d,1)); $cmd = 'NOTICE '.$tmp; } else { $cmd = 'PRIVMSG '.$d; } switch (substr(strtolower($d),2)) { case 'edit': if (preg_match("/\\]/",$data,$m)) { $rv = $wpapi->revisions($m,1,'older'); fwrite($irc,$cmd.' :.']] http://en.wikipedia.orghttps://en.wiktionary.org/w/index.php?title='.urlencode($m).'&diff=prev' . '&oldid='.urlencode($rv).' * '.$rv.' * '.$rv."\n"); } else { fwrite($irc,$cmd.' :Couldn\'t find link.'."\n"); } break; case 'stalk': if (preg_match("/\\]/",$data,$m)) { $uc = $wpapi->usercontribs($m,1); fwrite($irc,$cmd.' :.']] http://en.wikipedia.orghttps://en.wiktionary.org/w/index.php?title='.urlencode($uc).'&diff=prev' . '&oldid='.urlencode($uc).' * '.$m.' * '.$uc."\n"); } else { fwrite($irc,$cmd.' :Couldn\'t find link.'."\n"); } break; case 'beaten': if (preg_match("/\\]/",$data,$m)) { if (!mysql_ping($mysql)) { $mysql = mysql_pconnect($mysqlhost.':'.$mysqlport,$mysqluser,$mysqlpass); mysql_select_db($mysqldb, $mysql); } $x = mysql_fetch_assoc(mysql_query('SELECT COUNT(`id`) AS `count` FROM `beaten` WHERE `user` = \''.mysql_real_escape_string($m).'\' GROUP BY `user`')); $y = mysql_fetch_assoc(mysql_query('SELECT SQL_CALC_FOUND_ROWS COUNT(`id`) AS `count2` FROM `beaten` GROUP BY `user` HAVING `count2` > \''.mysql_real_escape_string($x).'\' LIMIT 1')); $z = mysql_fetch_assoc(mysql_query('SELECT FOUND_ROWS() as `ahead`')); fwrite($irc,$cmd.' :.']] has beaten me '.(($x != '')?$x:'0').' times. There are '.$z.' users who have beaten me more times.'."\n"); unset($x,$y); } else { fwrite($irc,$cmd.' :Couldn\'t find link.'."\n"); } break; case 'vandalcount': if (preg_match("/\\]/",$data,$m)) { $tmp = unserialize(file_get_contents('oftenvandalized.txt')); if (isset($tmp])) { fwrite($irc,$cmd.' :.']] has been vandalized '.count($tmp]).' time(s) in the last 48 hours.'."\n"); } else { fwrite($irc,$cmd.' :.']] has not been vandalized in the last 48 hours.'."\n"); } } else { fwrite($irc,$cmd.' :Couldn\'t find link.'."\n"); } break; case 'heuristics': include 'cluebot.heuristics.config.php'; $stats = unserialize(file_get_contents('cluebot.heuristics.stats.txt')); fwrite($irc,$cmd.' :I have the following heuristics enabled: '.implode(', ',$heuristics).".\n"); foreach ($stats as $heuristic => $count) { fwrite($irc,$cmd.' :The '.$heuristic.' heuristic has been matched '.$count.' times.'."\n"); } unset($count,$heuristic,$stats,$heuristics); break; case 'status': $ov = unserialize(file_get_contents('oftenvandalized.txt')); foreach ($ov as $title => $array) { if (count($array) == 0) unset($ov); } file_put_contents('oftenvandalized.txt',serialize($ov)); $count = count($ov); $titles = unserialize(file_get_contents('titles.txt')); foreach ($titles as $title => $time) { if ((time() - $time) > (24*60*60)) { unset($titles); } } file_put_contents('titles.txt',serialize($titles)); $tcount = count($titles); foreach ($ov as $x => $y) { $ocount = count($y); } arsort($ocount); foreach ($ocount as $x => $y) { $mova = $x; $movacount = $y; break; } preg_match('/\(\'\'\'\*)\|more...\]\]\'\'\'\)/iU',$wpq->getpage('Wikipedia:Today\'s featured article/'.date('F j, Y')),$tfa); $tfa = $tfa; if (!preg_match('/(yes|enable|true)/i',$wpq->getpage('User:'.$user.'/Run'))) { $run = false; } else { $run = true; } $top5beat = array(); if (!mysql_ping($mysql)) { $mysql = mysql_pconnect($mysqlhost.':'.$mysqlport,$mysqluser,$mysqlpass); mysql_select_db($mysqldb, $mysql); } $q = mysql_query('SELECT `user`,COUNT(`id`) AS `count` FROM `cluebot_enwiki`.`beaten` WHERE `user` != \'\' GROUP BY `user` HAVING `count` > 1 ORDER BY `count` DESC LIMIT 5'); while ($x = mysql_fetch_assoc($q)) { $top5beat = $x.' ('.$x.')'; } unset($x,$q); $top5beat = implode(' - ',$top5beat); fwrite($irc,$cmd.' :I am '.$user.'. I am currently '.($run?'enabled':'disabled').'. I currently have '.$wpq->contribcount($user).' contributions.'."\n"); fwrite($irc,$cmd.' :I have attempted to revert '.$tcount.' unique article/user combinations in the last 24 hours. ' . 'I know of '.$count.' different articles that have been vandalized in the last 48 hours.'."\n" ); fwrite($irc,$cmd.' :] is the most vandalized page with a total of '.$movacount.' vandalisms in the last 48 hours. ' . 'Today\'s featured article is: ].'."\n" ); fwrite($irc,$cmd.' :The following users have beat me to the revert the most: '.$top5beat."\n"); fwrite($irc,$cmd.' :I log all information to '.$ircchannel.'. This channel is '.$d.'.'."\n"); unset($x,$y,$count,$ov,$tcount,$ocount,$mova,$movacount,$tfa,$run,$title,$titles,$time,$top5beat); break; case 'warninglevel': if (preg_match("/\\]/",$data,$n)) { $warning = 0; if (preg_match_all('/<!-- Template:(uw-*(\d)(im)?|Blatantvandal \(serious warning\)) -->.*(\d{2}):(\d{2}), (\d+) (+) (\d{4}) \(UTC\)/iU', $wpq->getpage('User talk:'.$n), $match,PREG_SET_ORDER) ) { foreach ($match as $m) { $month = array('January' => 1, 'February' => 2, 'March' => 3, 'April' => 4, 'May' => 5, 'June' => 6, 'July' => 7, 'August' => 8, 'September' => 9, 'October' => 10, 'November' => 11, 'December' => 12 ); if ($m == 'Blatantvandal (serious warning)') $m = 4; if ((time() - gmmktime($m,$m,0,$month],$m,$m)) <= (2*24*60*60)) { if ($m > $warning) { $warning = $m; } } } } fwrite($irc,$cmd.' :.']] is at warning level '.$warning.".\n"); } else { fwrite($irc,$cmd.' :Couldn\'t find link.'."\n"); } break; case 'count': if (preg_match("/\\]/",$data,$n)) { fwrite($irc,$cmd.' :.']] has '.$wpq->contribcount($n)." contributions.\n"); } else { fwrite($irc,$cmd.' :Couldn\'t find link.'."\n"); } break; case 'help': fwrite($irc,$cmd.' :Please see ].'."\n"); break; case 'eval': $tmp = explode(' ',$data,6); $tmp1 = explode('!',substr($d,1)); if ($d == md5($thesecret.$tmp1.$tmp)) { eval($tmp); } else { fwrite($irc,$cmd.' :Code incorrect.'."\n"); } break; case 'cbproxy': $tmp = explode(' ',$data,6); $tmp1 = explode('!',substr($d,1)); if ($tmp1 == 'ClueBot-Bopm') { foreach (explode(',',$ircproxychannels) as $y) { fwrite($irc,'PRIVMSG '.$y.' :!admin '.$tmp."\n"); } $data = $wpq->getpage('Wikipedia:WikiProject on open proxies'); if (strpos($data,$tmp) === false) { $header = explode('{{proxyip2|127.0.0.1}} || Example',$data,2); $header .= '{{proxyip2|127.0.0.1}} || Example '; $footer = $header; $header = $header; $data = "\n".'{{proxyip2|'.$tmp.'}} || '.$tmp.' ~~~~'."\n"; $data = $header.$data.$footer; unset($header,$footer); $wpi->post('Wikipedia:WikiProject on open proxies',$data,'Adding '.$tmp.'.'); unset($data); } } break; } } } } die(); } $heuristics = "==Heuristics==\n\n===Config (cluebot.heuristics.config.php)===\n\n<pre>".htmlentities(file_get_contents('cluebot.heuristics.config.php'))."
\n\n"; foreach (glob('heuristics/cluebot.*.heuristic.php') as $heuristic) $heuristics .= '==='.$heuristic."===\n\n
".htmlentities(file_get_contents($heuristic))."
\n\n";
unset($heuristic);
$wpi->forcepost('User:'.$user.'/Source',
'The following is automatically generated by '.$user.".\n\n\n\n==Classes (wikibot.classes.php)==\n\n
" . htmlentities(file_get_contents('../wikibot.classes.php'))."
\n\n\n\n==Diff function (diff.function.php)==\n\n
" . htmlentities(file_get_contents('../diff.function.php'))."
\n\n\n\n==Source to ".$user . "==\n\n".'
'.htmlentities(file_get_contents(__FILE__))."
\n\n\n\n" .
$heuristics .
"==Score list==\n\n".'
'.htmlentities(file_get_contents('cluebot.scorelist.php'))."
\n\n\n\nThe7DeadlySins 02:55, 2 July 2008 (UTC)",
'Automated source upload.'); /* Our source code, we force post this because this is *our* page, and it triggers the nobots. */
unset($heuristics);
$wpi->forcepost('User:'.$user, "User:SinBot/Userpage\n", 'Automated bot userpage set.'); /* Our page, we force post this because this is *our* page. */
$tfas = 0; $pipe = fopen('thepipe','w'); $stdin = fopen('php://stdin','r'); $run = $wpq->getpage('User:'.$user.'/Run'); $wl = $wpq->getpage('User:'.$user.'/Whitelist'); $optin = $wpq->getpage('User:'.$user.'/Optin'); $aoptin = $wpq->getpage('User:'.$user.'/AngryOptin');
unset($tmp,$tmp2,$tmp3);
$tmp = explode("\n",$wpq->getpage('User:'.$owner.'/CBAutostalk.js')); foreach ($tmp as $tmp2) { if (substr($tmp2,0,1) != '#') { $tmp3 = explode('|',$tmp2,2); $stalk] = trim($tmp3); } } $tmp = explode("\n",$wpq->getpage('User:'.$owner.'/CBAutoedit.js')); foreach ($tmp as $tmp2) { if (substr($tmp2,0,1) != '#') { $tmp3 = explode('|',$tmp2,2); $edit] = trim($tmp3); } } unset($tmp,$tmp2,$tmp3);
print_r($stalk); print_r($edit);
while (1) { $feed = fsockopen($feedhost,$feedport,$feederrno,$feederrstr,30);
if (!$feed) { sleep(10); $feed = fsockopen($feedhost,$feedport,$feederrno,$feederrstr,30); if (!$feed) die($feederrstr.' ('.$feederrno.')'); }
fwrite($feed,'USER '.$user.' "1" "1" :SinBot Wiktionary Bot.'."\n"); fwrite($feed,'NICK '.$user."\n");
while (!feof($feed)) { $rawline = fgets($feed,1024); $line = str_replace(array("\n","\r","\002"),,$rawline); $line = preg_replace('/\003(\d\d?(,\d\d?)?)?/',,$line);
// echo 'FEED: '.$line."\n";
if (!$line) { fclose($feed); break; } $linea= explode(' ',$line,4);
if (strtolower($linea) == 'ping') { fwrite($feed,'PONG '.$linea."\n"); } elseif (($linea == '376') or ($linea == '422')) { fwrite($feed,'JOIN '.$feedchannel."\n"); } elseif ((strtolower($linea) == 'privmsg') and (strtolower($linea) == strtolower($feedchannel))) { $message = substr($linea,1); if (preg_match('/^\*)\]\] (\S*) (http:\/\/en\.wiktionary\.org\/w\/index\.php\?title=*&diff=(\d*)&oldid=(\d*)|http:\/\/en\.wikipedia\.org\/wiki\/\S+)? \* (*) \* (\((*)\))? (.*)$/S',$message,$m)) { $messagereceived = microtime(1); $change = $m; $change = $m; $change = $m; $change = $m; $change = $m; $change = $m; $change = $m; $change = $m; $change = $m;
// include 'cluebot.stalk.config.php';
$stalkchannel = array(); foreach ($stalk as $key => $value) if (fnmatch(str_replace('_',' ',$key),str_replace('_',' ',$change))) $stalkchannel = array_merge($stalkchannel,explode(',',$value)); foreach ($stalkbots as $key => $value) if (fnmatch(str_replace('_',' ',$key),str_replace('_',' ',$change))) $stalkchannel = array_merge($stalkchannel,explode(',',$ircbagtrialchannels)); foreach ($edit as $key => $value) if (fnmatch(str_replace('_',' ',$key),str_replace('_',' ',$change.$change))) $stalkchannel = array_merge($stalkchannel,explode(',',$value));
// if ($change == $owner) $stalkchannel = $ircchannel;
$stalkchannel = array_unique($stalkchannel);
foreach ($stalkchannel as $y) { fwrite($irc,'PRIVMSG '.$y.' :New edit: .$change.']] http://en.wikipedia.orghttps://en.wiktionary.org/w/index.php?title=' . urlencode($change.$change).'&diff=prev'.'&oldid='.urlencode($change).' * '.$change . ' * '.$change."\n"); } if (($change == 'User:') or ($change == 'User talk:')) { if (strtolower($change) == strtolower($user.'/Run')) { $run = $wpq->getpage('User:'.$user.'/Run'); } if (strtolower($change) == strtolower($user.'/Whitelist')) { $wl = $wpq->getpage('User:'.$user.'/Whitelist'); } if (strtolower($change) == strtolower($user.'/Optin')) { $optin = $wpq->getpage('User:'.$user.'/Optin'); } if (strtolower($change) == strtolower($user.'/AngryOptin')) { $aoptin = $wpq->getpage('User:'.$user.'/AngryOptin'); } if (strtolower($change) == strtolower($owner.'/CBAutostalk.js')) { unset($stalk); $tmp = explode("\n",$wpq->getpage('User:'.$owner.'/CBAutostalk.js')); foreach ($tmp as $tmp2) { if (substr($tmp2,0,1) != '#') { $tmp3 = explode('|',$tmp2,2); $stalk] = trim($tmp3); } } unset($tmp,$tmp2,$tmp3); print_r($stalk); } if (strtolower($change) == strtolower($owner.'/CBAutoedit.js')) { unset($edit); $tmp = explode("\n",$wpq->getpage('User:'.$owner.'/CBAutoedit.js')); foreach ($tmp as $tmp2) { if (substr($tmp2,0,1) != '#') { $tmp3 = explode('|',$tmp2,2); $edit] = trim($tmp3); } } unset($tmp,$tmp2,$tmp3); print_r($edit); } if (strtolower($change) == strtolower($owner.'/CBChannels.js')) { $ircconfig = explode("\n",$wpq->getpage('User:'.$owner.'/CBChannels.js')); $tmp = array(); foreach($ircconfig as $tmpline) { if (substr($tmpline,0,1) != '#') { $tmpline = explode('=',$tmpline,2); $tmp)] = trim($tmpline); } } print_r($tmp);
$tmpold = array(); $tmpnew = array(); foreach ($tmp as $tmp2) foreach (explode(',',$tmp2) as $tmp3) $tmpnew = 1; foreach (explode(',',$ircchannel.','.$ircdebugchannel.','.$ircreportchannel.','.$ircvandalismchannel.','.$ircaivchannel.','.$irctechchannel.','.$ircproxychannels.','.$ircunrevertedchannels.','.$ircbagtrialchannels.','.$ircotherchannels) as $tmp3) $tmpold = 1;
foreach ($tmpold as $tmp2 => $tmp3) if (isset($tmpnew)) unset($tmpold,$tmpnew); foreach ($tmpnew as $tmp2 => $tmp3) $tmpnew1 = $tmp2; foreach ($tmpold as $tmp2 => $tmp3) $tmpold1 = $tmp2;
$tmpold = $tmpold1; $tmpnew = $tmpnew1; unset($tmpold1,$tmpnew1);
fwrite($irc,'JOIN '.implode(',',$tmpnew)."\n"); fwrite($irc,'PART '.implode(',',$tmpold)."\n");
$ircchannel = $tmp; $ircdebugchannel = $tmp; $ircreportchannel = $tmp; $ircvandalismchannel = $tmp; $ircaivchannel = $tmp; $irctechchannel = $tmp; $ircproxychannels = $tmp; $ircunrevertedchannels = $tmp; $ircbagtrialchannels = $tmp; $ircotherchannels = $tmp;
unset($tmp,$tmpline,$tmpold,$tmpnew,$tmp2,$tmp3); } } if ($change.$change == 'Wiktionary:Bots/Requests for approval') { $stalkbots = array(); $trialbots = explode("\n",$wpq->getpage('Wiktionary:Bots/Requests for approval')); foreach ($trialbots as $trialbot) if (preg_match('/\{\{BRFA\|(.*)\|.*\|Trial\}\}/',str_replace(array("\n","\r"),,$trialbot),$m)) $stalkbots] = 1; }
if (($change != ) and ((!preg_match('/\* \.$change,'/').')\]\] \- .*/i',$optin))) and ($change != 'move')) continue;
$change = $change; $change = $change.$change;
if ($change == 'move') { if (preg_match('/moved \\] to \\]( over redirect)?: (.*)$/',$change,$m)) { $change = $m; $change = $m; $change = $change; $change = $m; echo "\n\n\n".'Move!'."\n\n\n"; print_r($change); echo "\n\n\n".'Move!'."\n\n\n"; } }
if ( ((time() - $tfas) >= 1800) and (preg_match('/\(\'\'\'\*)\|more...\]\]\'\'\'\)/iU',$wpq->getpage('Wiktionary:Today\'s featured article/'.date('F j, Y')),$tfam)) ) { $tfas = time(); $tfa = $tfam; //echo "TFA: ".$tfa."\n"; } $s = null; $pid = @pcntl_fork(); if ($pid != 0) continue;
$hutime = microtime(1);
include 'cluebot.heuristics.config.php'; foreach ($heuristics as $heuristic) { $heuristicret = false; include 'heuristics/cluebot.'.$heuristic.'.heuristic.php'; if ($heuristicret == true) { $stats = unserialize(file_get_contents('cluebot.heuristics.stats.txt')); $stats++; print_r($log); file_put_contents('cluebot.heuristics.stats.txt',serialize($stats)); unset($stats); break; } }
if ($heuristicret == true) { echo 'Heuristics time: '.(microtime(1) - $hutime)."\n"; file_put_contents('trainingdata.txt',$change."\0".$change."\0".'1'."\n",FILE_APPEND); } else { $tmp = explode(' ',$rawline,4); $tmp = $tmp; $udp = fsockopen('udp://localhost',3333); fwrite($udp,substr(str_replace(array("\n","\r"),,$tmp),1)."\n"); fclose($udp); unset($tmp,$udp); $d = $wpi->diff($change,$change,$change); $s = score($obscenelist,$d,$log); $s -= score($obscenelist,$d,$log); if ($s > 15) file_put_contents('trainingdata.txt',$change."\0".$change."\0".'0'."\n",FILE_APPEND); } unset($hutime);
if ( ($heuristicret == true) ) { if ( ( ( /* IP users with 250 contributions are fine .. */ (long2ip(ip2long($change)) == $change) /* and ($uc = $wpapi->usercontribs($change,250)) and (!isset($uc)) */ ) or ( /* Users with 50 contributions are fine .. */ (long2ip(ip2long($change)) != $change) and ($wpq->contribcount($change) < 50) ) ) and ( /* Whitelisted users are ok. */ /* ($wl = $wpq->getpage('User:'.$user.'/Whitelist')) and */ (!preg_match('/^\* \,'/').')|\1\]\] \- .*/',$wl)) ) ) {
// $vandalpage = $wpq->getpage('User:'.$user.'/PossibleVandalism'); // $x = explode("\n\n",$vandalpage); // foreach ($x as $k => $y) { // if (preg_match('/(\d+)\-(\d+)\-(\d+)T(\d+):(\d+):(\d+)/',$y,$m)) { // if ((time() - gmmktime($m,$m,$m,$m,$m,$m)) > (5*60*60)) { // unset($x); // } // } // } // $vandalpage = implode("\n\n",$x);
$diff = 'http://en.wikipedia.orghttps://en.wiktionary.org/w/index.php' . '?title='.urlencode($change) . '&diff='.urlencode($change) . '&oldid='.urlencode($change);
$report = '.']] was ' . (($change != 'move')?' by ':'moved to .']] by ') . '.'|'.$change.']] ' . '.'|(u)]] ' . '.'|(t)]] ' . $reason.' on '.gmdate('c');
// $datatopost = $vandalpage."\n\n".'Possible vandalism: '.$report." The7DeadlySins 02:55, 2 July 2008 (UTC)\n";
if ($s == null) {
// $rv = $wpapi->revisions($change,2,'older',true,$change); // $s = score($scorelist,diff($rv,$rv)); // $s += (score($scorelist,diff($rv,$rv,false))) * -1;
$s = 'N/A'; }
$tmp = unserialize(file_get_contents('oftenvandalized.txt')); foreach ($tmp as $key1 => $tmp2) { foreach ($tmp2 as $key2 => $time) { if ((time() - $time) > (2*24*60*60)) { unset($tmp); } } } $tmp] = time(); if (count($tmp]) >= 30) { foreach (explode(',',$ircreportchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :!admin .']] has been vandalized '.(count($tmp])).' times in the last 2 days.'."\n"); } } file_put_contents('oftenvandalized.txt',serialize($tmp));
if ( ( ($rv1 = $wpapi->revisions($change,1,'older')) and ($rv1 == $change) ) or ($change == 'move') ) { /* No need to continue further if it has been reverted */ echo 'Possible vandalism: '.$change.' changed by '.$change.' '.$reason.' on '.$rv.'('.$s.").\n"; foreach (explode(',',$ircdebugchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :Possible vandalism: '.$change.' changed by '.$change.' '.$reason.' on '.$rv.'('.$s.").\n"); fwrite($irc,'PRIVMSG '.$y.' :( http://en.wikipedia.orghttps://en.wiktionary.org/w/index.php?title='.urlencode($change).'&action=history | '.$change.' )'."\n"); } fwrite($pipe,'http://en.wikipedia.orghttps://en.wiktionary.org/w/index.php?title='.urlencode($change).'&action=history'."\n"); /* Tell owner */
$mqtime = microtime(1);
if (is_array($log)) { $logt = ; foreach ($log as $k => $v) { $logt .= '* '.$v.' * "'.$k.'"'."\n"; } }
$query = 'INSERT INTO `vandalism` ' . '(`id`,`user`,`article`,`heuristic`'.((is_array($log))?',`regex`':).',`reason`,`diff`,`old_id`,`new_id`,`reverted`) ' . 'VALUES ' . '(NULL,\.mysql_real_escape_string($change).'\',' . '\.mysql_real_escape_string($change).'\',' . '\.mysql_real_escape_string($heuristic).'\',' . ((is_array($log))?'\.mysql_real_escape_string($logt).'\',':) . '\.mysql_real_escape_string($reason).'\',' . '\.mysql_real_escape_string($change).'\',' . '\.mysql_real_escape_string($change).'\',' . '\.mysql_real_escape_string($change).'\',0)'; //echo 'Mysql query: '.$query."\n"; if (!mysql_ping($mysql)) { $mysql = mysql_pconnect($mysqlhost.':'.$mysqlport,$mysqluser,$mysqlpass); if (!$mysql) { die('Could not connect: ' . mysql_error()); } if (!mysql_select_db($mysqldb, $mysql)) { die ('Can\'t use database : ' . mysql_error()); } } mysql_query($query); //echo 'Mysql error: '.mysql_error()."\n"; $mysqlid = mysql_insert_id(); echo 'MySQL time: '.(microtime(1) - $mqtime).' MySQL id: '.$mysqlid."\n"; unset($mqtime);
if ( ( ( (preg_match('/(assisted|manual)/iS',$status)) and (print('Revert ? ')) and (strtolower(substr(fgets($stdin,3),0,1)) == 'y') ) or ( (preg_match('/(read-write|rw|go|approved|trial)/iS',$status)) ) ) and ( ( ( ((time() - $tfas) < 1800) or ( (preg_match('/\(\'\'\'\*)\|more...\]\]\'\'\'\)/iU',$wpq->getpage('Wikipedia:Today\'s featured article/'.date('F j, Y')),$tfam)) and ($tfas = time()) and ($tfa = $tfam) and ((print("TFA: ".$tfa."\n")) or (true)) ) ) and ($tfa == $change) ) or ( (preg_match('/\* \,'/').')\]\] \- .*/i',$aoptin)) and ((fwrite($irc,'PRIVMSG '.$ircdebugchannel.' :Angry-reverting .']].'."\n")) or (true)) ) or ( (($tmp = unserialize(file_get_contents('titles.txt'))) !== false) and ((!isset($tmp.$change])) or ((time() - $tmp.$change]) > (24*60*60))) and ($tmp.$change] = time()) and ((file_put_contents('titles.txt',serialize($tmp))) !== false) ) ) ) { echo 'Reverting ...'."\n"; if ($change != 'move') { $rev = $wpapi->revisions($change,5,'older',false,null,true,true); $revid = 0; $rbtok = $rev; foreach ($rev as $revdata) { if ($revdata != $change) { $revid = $revdata; break; } } if (($revdata == $user) or (in_array($revdata,explode(',',$botfriends)))) { die(); /* Do not revert to us. */ } }
// if ($revid == 0) { die(); }
foreach (explode(',',$ircdebugchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :Reverting ...'."\n"); }
// $revisiondata = $wpapi->revisions($change,1,'older',true,$revid); // if (!$revisiondata) die(); // if (!$rv1) $rv1 = $rv; // $wpi->post( // $change, // $revisiondata, // 'Reverting possible vandalism by .'|'.$change.']] ' . // 'to version by '.$revisiondata.'. ' . // 'False positive? Report it. '. // 'Thanks, '.$user.'. ('.$mysqlid.') (Bot)', // false, // $rv1 // ); /* Revert the page */
if ($change != 'move') { $rbret = $wpi->rollback( $change, $change, 'Reverting possible vandalism by .'|'.$change.']] ' . 'to '.(($revid == 0)?'older version':'version by '.$revdata).'. ' . 'False positive? Report it. '. 'Thanks, User:'.$user.'. ('.$mysqlid.') (Bot)', $rbtok, false ); } else { $rbret = $wpi->move( $change, $change, 'Reverting possible vandalism by .'|'.$change.']] ' . 'to '.(($revid == 0)?'older version':'version by '.$revdata).'. ' . 'False positive? Report it. '. 'Thanks, User:'.$user.'. ('.$mysqlid.') (Bot)' ); }
// // $rv2 = $wpapi->revisions($change,1); // if ($rv2 == $user) {
if ($rbret !== false) { foreach (explode(',',$ircdebugchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :Reverted. ('.(microtime(1) - $messagereceived).' s)'."\n"); } $warning = 0; $tpcontent = $wpq->getpage('User talk:'.$change); if (preg_match_all('/.*(\d{2}):(\d{2}), (\d+) (+) (\d{4}) \(UTC\)/iU', $tpcontent, $match,PREG_SET_ORDER) ) { foreach ($match as $m) { $month = array('January' => 1, 'February' => 2, 'March' => 3, 'April' => 4, 'May' => 5, 'June' => 6, 'July' => 7, 'August' => 8, 'September' => 9, 'October' => 10, 'November' => 11, 'December' => 12 ); if ($m == 'Blatantvandal (serious warning)') $m = 4; if ((time() - gmmktime($m,$m,0,$month],$m,$m)) <= (2*24*60*60)) { if ($m > $warning) { $warning = $m; } } } } $warning++; if ($warning == 5) { /* Report them if they have been warned 4 times. */ $aivdata = $wpq->getpage('User talk:Iamthe7DeadlySins'); if (!preg_match('/'.preg_quote($change,'/').'/i',$aivdata)) { foreach(explode(',',$ircaivchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :!admin Reporting .']] to WP:AIV. Contributions: .']] Block: .']]'."\n"); } foreach (explode(',',$ircvandalismchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :computer bl add '.$change.' x='.(24*$warning).' r=Vandalism to .']] (#'.$warning.").\n"); } $wpi->post( 'Wikipedia:Administrator_intervention_against_vandalism/TB2', $aivdata . "\n\n* {{".((long2ip(ip2long($change)) == $change)?'IPvandal':'Vandal').'|'.$change.'}}' . ' - '.$report." (Automated) The7DeadlySins 02:55, 2 July 2008 (UTC)\n", 'Automatically reporting .']]. (bot)', false, null, false ); } else { foreach (explode(',',$ircreportchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :!admin .']] has vandalized at least one time while being listed on WP:AIV. Contributions: .']] Block: .']]'."\n"); } } } elseif ($warning < 5) { /* Warn them if they haven't been warned 4 times. */ foreach (explode(',',$ircvandalismchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :computer bl add '.$change.' x='.(24*$warning).' r=Vandalism to .']] (#'.$warning.').'."\n"); } $wpi->post( 'User talk:'.$change, $tpcontent."\n\n" . '{{subst:User:'.$user.'/Warnings/Warning|1='.$warning.'|2='.$change.'|3='.$report.' }} The7DeadlySins 02:55, 2 July 2008 (UTC)'."\n", 'Warning .'|'.$change.']] - #'.$warning, false, null, false ); /* Warn the user */ } else { /* They have already been reported ... do nothing */
} if (!mysql_ping($mysql)) { $mysql = mysql_pconnect($mysqlhost.':'.$mysqlport,$mysqluser,$mysqlpass); if (!$mysql) { die('Could not connect: ' . mysql_error()); } if (!mysql_select_db($mysqldb, $mysql)) { die ('Can\'t use database : ' . mysql_error()); } } mysql_query('UPDATE `vandalism` SET `reverted` = 1 WHERE `id` = \.mysql_real_escape_string($mysqlid).'\); } else { $rv2 = $wpapi->revisions($change,1); if ($change != $rv2) { echo 'Grr! Beaten by '.$rv2.".\n"; foreach(explode(',',$ircdebugchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :Grr! Beaten by '.$rv2.".\n"); } if (!mysql_ping($mysql)) { $mysql = mysql_pconnect($mysqlhost.':'.$mysqlport,$mysqluser,$mysqlpass); mysql_select_db($mysqldb, $mysql); } mysql_query('INSERT INTO `beaten` (`id`,`article`,`diff`,`user`) VALUES (NULL,\.mysql_real_escape_string($change).'\',\.mysql_real_escape_string($change).'\',\.mysql_real_escape_string($rv2).'\')'); } } } else { foreach (explode(',',$ircunrevertedchannels) as $y) { fwrite($irc,'PRIVMSG '.$y.' :'."\002\00304Possible ignored vandalism: \002\003."\003]]\00304 changed by \003."\003]] \00303".$reason."\00304 on \00307".$rv."\003(\002\00313".$s."\003).\n"); fwrite($irc,'PRIVMSG '.$y.' :'."\002(\002\00312 http://en.wikipedia.orghttps://en.wiktionary.org/w/index.php?title=".urlencode($change)."&action=history \003\002|\002\00312 ".$change." \003\002)\002"."\n"); } }
} else { $rev = $wpapi->revisions($change,1); $rev = $rev;
echo 'Possible corrected vandalism: '.$change.' changed by '.$change.' '.$reason.'('.$s.")\n\tReverted by ".$rev." before I saw it.\n"; foreach (explode(',',$ircdebugchannel) as $y) { fwrite($irc,'PRIVMSG '.$y.' :Possible corrected vandalism: '.$change.' changed by '.$change.' '.$reason.'('.$s.")\n"); fwrite($irc,'PRIVMSG '.$y.' :Reverted by '.$rev." before I saw it.\n"); } if (($rev != $user) and ($rev != $change)) { if (!mysql_ping($mysql)) { $mysql = mysql_pconnect($mysqlhost.':'.$mysqlport,$mysqluser,$mysqlpass); mysql_select_db($mysqldb, $mysql); } mysql_query('INSERT INTO `beaten` (`id`,`article`,`diff`,`user`) VALUES (NULL,\.mysql_real_escape_string($change).'\',\.mysql_real_escape_string($change).'\',\.mysql_real_escape_string($rev).'\')'); } } } } die(); } } } }
?>
</nowiki>
<?PHP $heuristics = 'grawp'; $heuristics = 'evolution'; $heuristics = 'pagereplace'; $heuristics = 'pageblank'; $heuristics = 'massdelete'; $heuristics = 'massadd'; $heuristics = 'smallchange'; $heuristics = 'claimjumperpete'; $heuristics = 'redirect'; ?> </tt>
<?PHP $heuristics = 'grawp'; $heuristics = 'evolution'; $heuristics = 'pagereplace'; $heuristics = 'pageblank'; $heuristics = 'massdelete'; $heuristics = 'massadd'; $heuristics = 'smallchange'; $heuristics = 'claimjumperpete'; $heuristics = 'redirect'; ?> </tt>
<?PHP if ( /* The ClaimJumperPete vandal */ (($change >= 100) and ($change <= 400)) and ( ($change <= 200) or ($d = $wpi->diff($change,$change,$change)) ) and ( (fnmatch("<!--*howdy y'all*-->*",trim(strtolower($d)))) or (fnmatch("<!--*hello der*-->*",trim(strtolower($d)))) or (fnmatch("<!--*happy editin' y'all*-->*",trim(strtolower($d)))) ) and ($reason = 'ClaimJumperPete?') ) { $heuristicret = true; fwrite($irc,'PRIVMSG #cvn-wp-en :!admin ClaimJumperPete vandal? http://en.wikipedia.orghttps://en.wiktionary.org/w/index.php?title='.urlencode($change).'&diff=prev'.'&oldid='.urlencode($change)." .\n"); } ?> </tt>
<?PHP
if ( /* Massive additions */
($change >= 7500)
and ($rv = $wpapi->revisions($change,2,'older',true,$change))
and ($pagedata = $wpq->getpage($change))
and ($s = score($scorelist,$rv))
and ($s += (score($scorelist,$rv)) * -1)
and ($s < -1000)
and ($reason = 'score equals '.$s)
) $heuristicret = true;
?>
</tt.
<?PHP if ( /* Massive deletes */ ($change <= -7500) and ($pagedata = $wpq->getpage($change)) and (!fnmatch('*#REDIRECT*',strtoupper(substr($pagedata,0,9)))) and ($rv = $wpapi->revisions($change,2,'older',true,$change)) and ($s = score($scorelist,$rv)) and ($s += (score($scorelist,$rv)) * -1) and ($s < -50) /* There are times when massive deletes are ok. */ and ($reason = 'deleting '.($change * -1).' characters') ) $heuristicret = true; ?> </tt>
<?PHP
if ( /* Page blanks */
(preg_match('/\,$m))
and (($pagedata = $wpq->getpage($change)) or true)
and ($fc = $wpapi->revisions($change,1,'newer'))
and ($fc != $change) /* The creator is allowed to blank the page. */
and ($reason = 'blanking the page')
) $heuristicret = true;
?>
</tt>
<?PHP
if ( /* Page replaces */
(preg_match('/\\]Replaced page with (.*)$/',$change,$m))
and ($pagedata = $wpq->getpage($change))
and ($fc = $wpapi->revisions($change,1,'newer'))
and ($fc != $change) /* The creator is allowed to replace the page. */
and ($reason = 'replacing entire content with something else')
) $heuristicret = true;
?>
</tt>
<?PHP
if ( /* The Redirect vandals */
(
($tfa == $change)
and (fnmatch('*#redirect *',strtolower($wpq->getpage($change))))
and ($reason = 'redirecting featured article to new title')
)
or (
($pagedata = $wpq->getpage($change))
and (fnmatch('*#redirect *',strtolower($pagedata)))
and (preg_match('/\\]/',$pagedata,$m))
and (!$wpq->getpage($m))
and ($reason = 'redirecting article to non-existant page')
)
) {
$heuristicret = true;
// fwrite($irc,'PRIVMSG #cvn-wp-en :!admin Grawp vandal? http://en.wiktionary.orghttps://dictious.com/en/Special:Contributions/'.$change." .\n");
}
?>
</tt>