User:SinBot~enwiktionary/code

Hello, you have come here looking for the meaning of the word User:SinBot~enwiktionary/code. In DICTIOUS you will not only get to know all the dictionary meanings for the word User:SinBot~enwiktionary/code, but we will also tell you about its etymology, its characteristics and you will know how to say User:SinBot~enwiktionary/code in singular and plural. Everything you need to know about the word User:SinBot~enwiktionary/code you have here. The definition of the word User:SinBot~enwiktionary/code will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofUser:SinBot~enwiktionary/code, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.
See also: User:Scsbot/wikised, the initial source of the code here.
Resources

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.

Uses

If the code was written correctly, then the following shall be SinBots duties:

    1. Cleaning up vandalism at the click of a button
    2. Warning me of pages that were deleted
    3. Warning me of blanked pages

thats about it. If my bot does anyhing else, let me know.

Request

I am currently still waiting for this bot to be accepted, then i shall paste the code onto here.

wikibot.classes.php

<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('/\&amp\;(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\&amp\;from\=.*\&amp\;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>

Heuristics

<?PHP $heuristics = 'grawp'; $heuristics = 'evolution'; $heuristics = 'pagereplace'; $heuristics = 'pageblank'; $heuristics = 'massdelete'; $heuristics = 'massadd'; $heuristics = 'smallchange'; $heuristics = 'claimjumperpete'; $heuristics = 'redirect'; ?> </tt>

Config (sinbot.heuristics.config.php)

<?PHP $heuristics = 'grawp'; $heuristics = 'evolution'; $heuristics = 'pagereplace'; $heuristics = 'pageblank'; $heuristics = 'massdelete'; $heuristics = 'massadd'; $heuristics = 'smallchange'; $heuristics = 'claimjumperpete'; $heuristics = 'redirect'; ?> </tt>

heuristics/sinbot.claimjumperpete.heuristic.php

<?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>


heuristics/sinbot.grawp.heuristic.php

<?PHP if ( /* The Grawp vandal */ ( (fnmatch('*epic*lulz*on*nimp*org*',strtolower($change))) or (fnmatch('*on*nimp*org*epic*lulz*',strtolower($change))) or (fnmatch('*punishing*wikipedia*',strtolower($change))) or (fnmatch('*anti*avril*hate*campaign*',strtolower($change))) or (fnmatch('*hagger*',strtolower($change))) or (fnmatch('*h?a?g?g?e?r*',strtolower($change))) ) and ($reason = 'Grawp?') ) { $heuristicret = true; fwrite($irc,'PRIVMSG #cvn-wp-en :!admin Grawp vandal? http://en.wikipedia.orghttps://dictious.com/en/Special:Contributions/'.$change." .\n"); } ?> </tt>

heuristics/sinbot.massadd.heuristic.php


<?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.

heuristics/sinbot.massdelete.heuristic.php

<?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>


heuristics/sinbot.pageblank.heuristic.php


<?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>

heuristics/sinbot.pagereplace.heuristic.php


<?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>

heuristics/sinbot.redirect.heuristic.php


<?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>

heuristics/sinbot.smallchange.heuristic.php

unset($log,$log2); if ( /* Small changes with obscenities. */ (($change >= -200) and ($change <= 200)) and (($d = $wpi->diff($change,$change,$change)) or true) and ((($change == 'User:SinBot/Sandbox') and print_r($rv)) or true) and (($s = score($obscenelist,$d,$log)) or true) and (($s -= score($obscenelist,$d,$log2)) or true) and ( ( ($s < -5) /* There are times when small changes are ok. */ and (($rv = $wpapi->revisions($change,2,'older',true,$change)) or true) and (!fnmatch('*#REDIRECT*',strtoupper(substr($rv,0,9)))) and (!fnmatch('*SEX*',strtoupper($rv))) and (!fnmatch('*BDSM*',strtoupper($rv))) and (score($obscenelist,$change) >= 0) and (score($obscenelist,$rv) >= 0) and (!preg_match('/(^|\s)({1,2}(\*+|\-{3,}){0,2}|\*{4}|\-{4}|(\<|\()?censored(\>|\))?)(ing?|ed)?(\s|$)/iS',$rv)) and ($heuristic .= '/obscenities') and ($reason = 'making a minor change with obscenities') ) or ( ($s > 5) and (($rv = $wpapi->revisions($change,2,'older',true,$change)) or true) and (!fnmatch('*#REDIRECT*',strtoupper(substr($rv,0,9)))) and (!preg_match('/(^|\s)({1,2}(\*+|\-{3,}){0,2}|\*{4}|\-{4}|(\<|\()?censored(\>|\))?)(ing?|ed)?(\s|$)/iS',$rv)) and (preg_match('/(^|\s)({1,2}(\*+|\-{3,}){0,2}|\*{4}|\-{4}|(\<|\()?censored(\>|\))?)(ing?|ed)?(\s|$)/iS',$rv)) and ($heuristic .= '/censor') and ($reason = 'making a minor change censoring content (])') ) or ( (preg_match('/\!\!\!/S',$d)) and (($rv = $wpapi->revisions($change,2,'older',true,$change)) or true) and (!preg_match('/\!\!\!/S',$rv)) and (!fnmatch('*#REDIRECT*',strtoupper(substr($rv,0,9)))) and ($heuristic .= '/exclamation') and ($reason = 'making a minor change adding "!!!"') ) ) ) { $heuristicret = true; if (isset($log2) and is_array($log2)) foreach ($log2 as $k => $v) $log -= $v; if (isset($log) and is_array($log)) foreach ($log as $k => $v) if ($v == 0) unset($log); unset($log2); /* fwrite($irc,'PRIVMSG #wikipedia-BAG/ClueBot :Would revert http://en.wikipedia.orghttps://en.wiktionary.org/w/index.php?title='.urlencode($change.$change).'&diff=prev'.'&oldid='.urlencode($change)." .\n"); */ } ?> Score list <?PHP /* * This page contains bad words out of necessity. * Here is 50 lines of whitespace before the actual list: * (scroll down to see the list) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Here is the list: */ $obscenelist = Array ( /* 'preg' => points, */ '/suck/i' => -5, /* Usually bad words */ '/stupid/i' => -3, '/haha/i' => -5, '/\bomg/i' => -3, '/\bpimp\b/i' => -7, '/1337/i' => -5, '/leet/i' => -5, '/dumb/i' => -5, '/\bputa\b/i' => -7, '/\bhomo\b/i' => -7, '/\bGAY\b/' => -10, '/\bslut/i' => -5, '/damn/i' => -5, '/\bass\b/i' => -10, '/\brape\b/i' => -7, '/\bpoop\b/i' => -10, '/\bcock\b/i' => -10, '/\blol\b/i' => -7, '/\bcrap\b/i' => -5, '/\bsex\b/i' => -5, '/noob/i' => -5, '/\bnazi\b/i' => -3, '/\bneo-nazi\b/i' => +3, /* False-positive */ '/fuck/i' => -20, /* Stronger bad words */ '/\\]/' => +20, /* This one is a false positive */ '/bitch/i' => -20, '/\bpussy\b/i' => -20, '/penis/i' => -20, '/vagina/i' => -20, '/whore/i' => -15, '/\bshit\b/i' => -20, '/nigger/i' => -20, '/\bnigga\b/i' => -20, '/cocksucker/i' => -20, '/assrape/i' => -15, '/motherfucker/i' => -20, '/wanker/i' => -20, '/\bcunt\b/i' => -20, '/faggot/i' => -20, '/fags/i' => -20, '/asshole/i' => -15, '/fuck ((yo)?u|h(er|im)|them|it)/i' => -100, /* This looks like a personal attack */ '/((yo)?u|s?he|we|they|it) sucks?/i' => -100, /* This looks like a personal attack */ '/666+\b/i' => -50 /* Though this has uses, it is commonly used by vandals */ ); $grammarlist = Array ( '/(.{1,4})\1{30}/' => -10, /* Ugg .. the same letter(s) several times in a row. */ '/\b.*\b/U' => +2, /* This looks to be a correct sentence */ '/\b{30,}\b/U' => -10, /* All capitals? Looks like vandal activity */ '/\b{1500,}\b/U' => -10, /* No capitals? Looks like vandal activity */ '/!{5,}/i' => -10, /* No wikipedia article needs '!!!!!' in it */ '/!!+1+(one)*/i' => -30, /* No wikipedia article needs '!!!11one' in it */ '/\\]/U' => +1, /* Wiki links are good. */ '/\{\{.*\}\}/U' => +5, /* Wiki transcludes are good. */ '/\{\{nfobox .*\}\}/U' => +20, /* Wiki infoboxes are good. */ '/\\]/iU' => +3 /* Wiki categories are good. */ ); $scorelist = array_merge($obscenelist,$grammarlist); ?> </tt>