r67104 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r67103‎ | r67104 | r67105 >
Date:19:05, 30 May 2010
Author:tisane
Status:deferred
Tags:
Comment:
=Moving RPEDFileReader.php to wikibots directory
Modified paths:
  • /trunk/extensions/RPED/RPED.config.php (deleted) (history)
  • /trunk/extensions/RPED/RPEDFileReader.php (deleted) (history)
  • /trunk/extensions/RPED/RPEDFileReader.pl (deleted) (history)
  • /trunk/extensions/RPED/RPEDFileReader.py (deleted) (history)
  • /trunk/extensions/RPED/RPEDIRCBot.php (deleted) (history)
  • /trunk/extensions/RPED/wikibot.classes.php (deleted) (history)

Diff [purge]

Index: trunk/extensions/RPED/RPEDFileReader.php
@@ -1,65 +0,0 @@
2 -<?php
3 -# RPEDFileReader.php by Tisane, http://www.mediawiki.org/wiki/User:Tisane
4 -#
5 -# This script is free software that is available under the terms of the Creative Commons
6 -# Attribution-ShareAlike 3.0 license and the current version of the GNU General Public License.
7 -#
8 -# The purpose of this script is to read a text file (specifically, the list of page titles from
9 -# Wikipedia's data dump) and add each page title to a database table.
10 -
11 -include 'wikibot.classes.php'; /* The wikipedia classes. */
12 -include 'RPED.config.php'; /* This file is very simple, but it contains sensitive information, we just define $user, $ircserver, $ircport, $ircchannel, $pass, $owner, and $status. */
13 -
14 -$wpapi = new wikipediaapi;
15 -$wpq = new wikipediaquery;
16 -$wpi = new wikipediaindex;
17 -if ($wpapi->login($user,$pass)!='true'){
18 - die();
19 -}
20 -
21 -$searching=false;
22 -
23 -if (isset($argv[1]) && $argv[1]!=''){
24 - $searching=true;
25 -}
26 -
27 -$handle = @fopen("enwiki-20100312-all-titles-in-ns0", "r");
28 -$lineNumber=0;
29 -$line="";
30 -
31 -if ($handle) {
32 - # Launch daemon!
33 - $pid = pcntl_fork(); // fork
34 - if ($pid < 0)
35 - exit;
36 - else if ($pid) // parent
37 - exit;
38 - else { // child
39 -
40 - $sid = posix_setsid();
41 -
42 - if ($sid < 0)
43 - exit;
44 -
45 - while (!feof($handle)) {
46 - $buffer = fgets($handle, 4096);
47 - $buffer=str_replace("\n","",$buffer);
48 - if ($searching==true){
49 - if ($buffer==$argv[1]){
50 - $searching=false;
51 - }
52 - } else {
53 - $buffer=urlencode ( $buffer );
54 - if ($line!=""){
55 - $line.="|";
56 - }
57 - if (strlen($line)+strlen($buffer)>200){
58 - $wpapi->rpedInsert($line);
59 - $line="";
60 - }
61 - $line.=$buffer;
62 - }
63 - }
64 - fclose($handle);
65 - }
66 -}
\ No newline at end of file
Index: trunk/extensions/RPED/RPEDIRCBot.php
@@ -1,93 +0,0 @@
2 -<?php
3 -# RPEDIRC.php by Tisane, http://www.mediawiki.org/wiki/User:Tisane
4 -#
5 -# This script is free software that is available under the terms of the Creative Commons
6 -# Attribution 3.0 license and the current version of the GNU General Public License.
7 -#
8 -# The purpose of this script is to get the titles of all new, deleted and restored
9 -# pages from #en.wikipedia and add/delete them from the rped_table.
10 -
11 -ini_set('include_path', ini_get('include_path').':..');
12 -
13 -// Include Class
14 -error_reporting(E_ALL);
15 -
16 -include 'wikibot.classes.php'; /* The wikipedia classes. */
17 -include 'RPED.config.php'; /* This file is very simple, but it contains sensitive information, we just define $user, $ircserver, $ircport, $ircchannel, $pass, $owner, and $status. */
18 -
19 -$wpapi = new wikipediaapi;
20 -$wpq = new wikipediaquery;
21 -$wpi = new wikipediaindex;
22 -if ($wpapi->login($user,$pass)!='true'){
23 - die();
24 -}
25 -
26 -$readbuffer="";
27 -$startSep="[[";
28 -$endSep="]]";
29 -
30 -
31 -// open a socket connection to the IRC server
32 -$fp = fsockopen($host, $port, $erno, $errstr, 30);
33 -
34 -// print the error if there is no connection
35 -if (!$fp) {
36 - echo $errstr." (".$errno.")<br />\n";
37 -} else {
38 - // write data through the socket to join the channel
39 - fwrite($fp, "NICK ".$nick."\r\n");
40 - fwrite($fp, "USER ".$ident." ".$host." bla :".$realname."\r\n");
41 - fwrite($fp, "JOIN :".$chan."\r\n");
42 -
43 - # Launch daemon!
44 - $pid = pcntl_fork(); // fork
45 - if ($pid < 0)
46 - exit;
47 - else if ($pid) // parent
48 - exit;
49 - else { // child
50 -
51 - $sid = posix_setsid();
52 -
53 - if ($sid < 0)
54 - exit;
55 -
56 - while (!feof($fp)) {
57 -
58 - $line = fgets($fp, 512);
59 - $pingLine = explode(' ', $line);
60 - if(strtolower($pingLine[0]) == 'ping'){
61 - $response="PONG ".$pingLine[1]."\n";
62 - fwrite($fp, "PONG ".$response);
63 - }
64 - usleep(10);
65 - $startPos=strpos($line,$startSep);
66 - $endPos=strpos($line,$endSep);
67 - $subLine=substr($line,$startPos+5,$endPos-$startPos-8);
68 - if ($subLine=="Special:Log/delete"){
69 - $delstartPos=strpos($line,$startSep,$endPos);
70 - $delendPos=strpos($line,$endSep,$endPos+1);
71 - $delLine=substr($line,$delstartPos+5,$delendPos-$delstartPos-8);
72 - $action=substr($line,$delstartPos-9,7);
73 - if ($action=="deleted"){
74 - $wpapi->rpedDelete($delLine);
75 - } else {
76 - $wpapi->rpedInsert($delLine);
77 - }
78 - }
79 - if ($subLine=="Special:Log/move"){
80 - $delstartPos=strpos($line,$startSep,$endPos);
81 - $delendPos=strpos($line,$endSep,$endPos+1);
82 - $delstartPos=strpos($line,$startSep,$delstartPos+1);
83 - $delendPos=strpos($line,$endSep,$delendPos+1);
84 - $delLine=substr($line,$delstartPos+2,$delendPos-$delstartPos-2);
85 - $wpapi->rpedInsert($delLine);
86 - }
87 - if (substr($line,$endPos+5,1)=="N" || substr($line,$endPos+6,1)=="N"){
88 - $wpapi->rpedInsert($subLine);
89 - }
90 - }
91 -
92 - fclose($fp);
93 - }
94 -}
\ No newline at end of file
Index: trunk/extensions/RPED/RPED.config.php
@@ -1,16 +0,0 @@
2 -<?php
3 -$user='WikiSysop'; // Your username on your local wiki (must have RPED rights)
4 -$ircserver='irc.mediawiki.org';
5 -$ircport='6667';
6 -$ircchannel='en.wikipedia';
7 -$pass='password'; // Your password on your local wiki
8 -$owner=$user;
9 -$status='';
10 -
11 -#RPECIRC variables
12 -$nick="YourNick"; // e.g. Awesome
13 -$ident="YourIdent"; // For IRC identification purposes; e.g. AwesomeBot
14 -$chan="#en.wikipedia";
15 -$realname = "Your Real Name";
16 -$port=6667;
17 -$host = "irc.wikimedia.org";
\ No newline at end of file
Index: trunk/extensions/RPED/RPEDFileReader.py
@@ -1,47 +0,0 @@
2 -# RPEDFileReader.py by Tisane, http://www.mediawiki.org/wiki/User:Tisane
3 -#
4 -# This script is free software that is available under the terms of the Creative Commons
5 -# Attribution-Sharealike 3.0 license and the current version of the GNU General Public License.
6 -#
7 -# The purpose of this script is to read a text file (specifically, the list of page titles from
8 -# Wikipedia's data dump) and add each page title to a database table.
9 -
10 -FILES = ["enwiki-20100312-all-titles-in-ns0"]
11 -
12 -# Get the Data
13 -import MySQLdb
14 -import sys
15 -
16 -db= MySQLdb.connect(host='localhost', user='rpedorg' , passwd='password', db='rpedorg_beta2')
17 -cursor= db.cursor()
18 -
19 -numArgs=0
20 -titleStart="foo"
21 -notYetThere=False
22 -
23 -# FIXME: This argument-parsing system totally blows and doesn't work for strings
24 -# starting with unusual characters (e.g. parentheses)
25 -for arg in sys.argv:
26 - numArgs+=1
27 - if numArgs==2:
28 - if arg!='-l':
29 - if arg!='line':
30 - break
31 - if numArgs==3:
32 - titleStart=arg
33 - notYetThere=True
34 -lnum=0
35 -
36 -for file in FILES:
37 - infile = open(file,"r")
38 - while infile:
39 - line = infile.readline()
40 - line=line.rstrip("\n")
41 - if notYetThere==True:
42 - if line==titleStart:
43 - notYetThere==False
44 - if notYetThere==False:
45 - cursor.execute("INSERT INTO rped_page (rped_page_title) VALUES (%s)", (line,))
46 - lnum+=1
47 - if lnum%100==0:
48 - print "%s: %s" % (lnum, line,)
\ No newline at end of file
Index: trunk/extensions/RPED/RPEDFileReader.pl
@@ -1,68 +0,0 @@
2 -# RPEDFileReader.pl by Tisane, http://www.mediawiki.org/wiki/User:Tisane
3 -#
4 -# This script is free software that is available under the terms of the Creative Commons
5 -# Attribution 3.0 license and the current version of the GNU General Public License.
6 -#
7 -# The purpose of this script is to read a text file (specifically, the list of page titles from
8 -# Wikipedia's data dump) and add each page title to a database table.
9 -
10 -use strict;
11 -
12 -my $base_module_dir = (-d '/home2/rpedorg/perl' ? '/home2/rpedorg/perl' : ( getpwuid($>) )[7] . '/perl/');
13 - unshift @INC, map { $base_module_dir . $_ } @INC;
14 -
15 -#use Mysql;
16 -use DBI;
17 -
18 -my $sql_login = 'rpedorg';
19 -my $sql_pass = 'Ab123456!';
20 -my $db_name = 'rpedorg_libertapedia';
21 -my $db_host = 'localhost'; # or remote mysql server name
22 -my $numArgs = $#ARGV + 1;
23 -my $offset=0;
24 -my $titleMatch='';
25 -if ($numArgs>1){
26 - if ($ARGV[0] eq '-line' || $ARGV[0] eq '-l'){
27 - $offset=$ARGV[1];
28 - }
29 - if ($ARGV[0] eq '-title' || $ARGV[0] eq '-t'){
30 - $titleMatch=$ARGV[1];
31 - }
32 -}
33 -
34 -# if left blank, this defaults to localhost
35 -
36 -# PERL MYSQL CONNECT()
37 -my $conn_string = "DBI:mysql:$db_name";
38 -if ($db_host) { $conn_string .= ":$db_host"; }
39 -my $dbh = DBI->connect("$conn_string",$sql_login,$sql_pass);
40 -
41 -my $filename='enwiki-20100312-all-titles-in-ns0';
42 -open(MYDATA, $filename) or
43 - die("Error: cannot open file '".$filename."'\n");
44 -my $line;
45 -my $lnum = 1;
46 -my $titleMatched=0;
47 -if ($titleMatch eq ''){
48 - $titleMatched=1;
49 -}
50 -while( $line = <MYDATA> ){
51 - chomp($line);
52 - if ($titleMatched==0){
53 - if ($titleMatch eq $line){
54 - $titleMatched=1;
55 - }
56 - }
57 - if ($lnum>=$offset && $titleMatched==1){
58 - $line=$dbh->quote("$line");
59 - my $sql="INSERT INTO rped_page (rped_page_title) VALUES ($line)";
60 - $dbh->prepare($sql);
61 - $dbh->do($sql);
62 - if ($lnum%100==0){
63 - print "$lnum: $line\n";
64 - }
65 - }
66 - $lnum++;
67 -}
68 -
69 -close MYDATA;
\ No newline at end of file
Index: trunk/extensions/RPED/wikibot.classes.php
@@ -1,971 +0,0 @@
2 -<?PHP
3 - /**
4 - * @author Cobi Carter
5 - **/
6 -
7 - /**
8 - * This class is designed to provide a simplified interface to cURL which maintains cookies.
9 - * @author Cobi
10 - **/
11 - class http {
12 - private $ch;
13 - private $uid;
14 - public $postfollowredirs;
15 - public $getfollowredirs;
16 -
17 - /**
18 - * Our constructor function. This just does basic cURL initialization.
19 - * @return void
20 - **/
21 - function __construct () {
22 - global $proxyhost, $proxyport;
23 - $this->ch = curl_init();
24 - $this->uid = dechex(rand(0,99999999));
25 - curl_setopt($this->ch,CURLOPT_COOKIEJAR,'/tmp/cluewikibot.cookies.'.$this->uid.'.dat');
26 - curl_setopt($this->ch,CURLOPT_COOKIEFILE,'/tmp/cluewikibot.cookies.'.$this->uid.'.dat');
27 - curl_setopt($this->ch,CURLOPT_MAXCONNECTS,100);
28 - curl_setopt($this->ch,CURLOPT_CLOSEPOLICY,CURLCLOSEPOLICY_LEAST_RECENTLY_USED);
29 - curl_setopt($this->ch,CURLOPT_USERAGENT,'ClueBot/1.1');
30 - if (isset($proxyhost) and isset($proxyport) and ($proxyport != null) and ($proxyhost != null)) {
31 - curl_setopt($this->ch,CURLOPT_PROXYTYPE,CURLPROXY_HTTP);
32 - curl_setopt($this->ch,CURLOPT_PROXY,$proxyhost);
33 - curl_setopt($this->ch,CURLOPT_PROXYPORT,$proxyport);
34 - }
35 - $this->postfollowredirs = 0;
36 - $this->getfollowredirs = 1;
37 - }
38 -
39 - /**
40 - * Post to a URL.
41 - * @param $url The URL to post to.
42 - * @param $data The post-data to post, should be an array of key => value pairs.
43 - * @return Data retrieved from the POST request.
44 - **/
45 - function post ($url,$data) {
46 - $time = microtime(1);
47 - curl_setopt($this->ch,CURLOPT_URL,$url);
48 - curl_setopt($this->ch,CURLOPT_FOLLOWLOCATION,$this->postfollowredirs);
49 - curl_setopt($this->ch,CURLOPT_MAXREDIRS,10);
50 - curl_setopt($this->ch,CURLOPT_HEADER,0);
51 - curl_setopt($this->ch,CURLOPT_RETURNTRANSFER,1);
52 - curl_setopt($this->ch,CURLOPT_TIMEOUT,30);
53 - curl_setopt($this->ch,CURLOPT_CONNECTTIMEOUT,10);
54 - curl_setopt($this->ch,CURLOPT_POST,1);
55 - curl_setopt($this->ch,CURLOPT_POSTFIELDS, $data);
56 - curl_setopt($this->ch,CURLOPT_HTTPHEADER, array('Expect:'));
57 - $data = curl_exec($this->ch);
58 - #global $logfd; if (!is_resource($logfd)) $logfd = fopen('php://stderr','w'); fwrite($logfd,'POST: '.$url.' ('.(microtime(1) - $time).' s) ('.strlen($data)." b)\n");
59 - return $data;
60 - }
61 -
62 - /**
63 - * Get a URL.
64 - * @param $url The URL to get.
65 - * @return Data retrieved from the GET request.
66 - **/
67 - function get ($url) {
68 - $time = microtime(1);
69 - curl_setopt($this->ch,CURLOPT_URL,$url);
70 - curl_setopt($this->ch,CURLOPT_FOLLOWLOCATION,$this->getfollowredirs);
71 - curl_setopt($this->ch,CURLOPT_MAXREDIRS,10);
72 - curl_setopt($this->ch,CURLOPT_HEADER,0);
73 - curl_setopt($this->ch,CURLOPT_RETURNTRANSFER,1);
74 - curl_setopt($this->ch,CURLOPT_TIMEOUT,30);
75 - curl_setopt($this->ch,CURLOPT_CONNECTTIMEOUT,10);
76 - curl_setopt($this->ch,CURLOPT_HTTPGET,1);
77 - $data = curl_exec($this->ch);
78 - #$global $logfd; if (!is_resource($logfd)) $logfd = fopen('php://stderr','w'); fwrite($logfd,'GET: '.$url.' ('.(microtime(1) - $time).' s) ('.strlen($data)." b)\n");
79 - return $data;
80 - }
81 -
82 - /**
83 - * Our destructor. Cleans up cURL and unlinks temporary files.
84 - **/
85 - function __destruct () {
86 - curl_close($this->ch);
87 - @unlink('/tmp/cluewikibot.cookies.'.$this->uid.'.dat');
88 - }
89 - }
90 -
91 - /**
92 - * This class is a deprecated wrapper class which allows legacy code written for Wikipedia's query.php API to still work with wikipediaapi::.
93 - **/
94 - class wikipediaquery {
95 - private $http;
96 - private $api;
97 - public $queryurl = 'http://rped.org/beta2/query.php'; //Obsolete, but kept for compatibility purposes.
98 -
99 - /**
100 - * This is our constructor.
101 - * @return void
102 - **/
103 - function __construct () {
104 - global $__wp__http;
105 - if (!isset($__wp__http)) {
106 - $__wp__http = new http;
107 - }
108 - $this->http = &$__wp__http;
109 - $this->api = new wikipediaapi;
110 - }
111 -
112 - /**
113 - * Reinitializes the queryurl.
114 - * @private
115 - * @return void
116 - **/
117 - private function checkurl() {
118 - $this->api->apiurl = str_replace('query.php','api.php',$this->queryurl);
119 - }
120 -
121 - /**
122 - * Gets the content of a page.
123 - * @param $page The wikipedia page to fetch.
124 - * @return The wikitext for the page.
125 - **/
126 - function getpage ($page) {
127 - $this->checkurl();
128 - $ret = $this->api->revisions($page,1,'older',true,null,true,false,false,false);
129 - return $ret[0]['*'];
130 - }
131 -
132 - /**
133 - * Gets the page id for a page.
134 - * @param $page The wikipedia page to get the id for.
135 - * @return The page id of the page.
136 - **/
137 - function getpageid ($page) {
138 - $this->checkurl();
139 - $ret = $this->api->revisions($page,1,'older',false,null,true,false,false,false);
140 - return $ret['pageid'];
141 - }
142 -
143 - /**
144 - * Gets the number of contributions a user has.
145 - * @param $user The username for which to get the edit count.
146 - * @return The number of contributions the user has.
147 - **/
148 - function contribcount ($user) {
149 - $this->checkurl();
150 - $ret = $this->api->users($user,1,null,true);
151 - if ($ret !== false) return $ret[0]['editcount'];
152 - return false;
153 - }
154 - }
155 -
156 - /**
157 - * This class is for interacting with Wikipedia's api.php API.
158 - **/
159 - class wikipediaapi {
160 - private $http;
161 - private $edittoken;
162 - private $tokencache;
163 - public $apiurl = 'http://rped.org/beta2/api.php';
164 -
165 - /**
166 - * This is our constructor.
167 - * @return void
168 - **/
169 - function __construct () {
170 - global $__wp__http;
171 - if (!isset($__wp__http)) {
172 - $__wp__http = new http;
173 - }
174 - $this->http = &$__wp__http;
175 - }
176 -
177 - function rpedInsert ($page){
178 -
179 - $params = Array(
180 - 'action' => 'rped',
181 - 'format' => 'php',
182 - 'insert' => $page,
183 - );
184 -
185 - $x = $this->http->post($this->apiurl,$params);
186 - $x = unserialize($x);
187 - #var_export($x);
188 - return true;
189 - }
190 -
191 - function rpedDelete ($page){
192 -
193 - $params = Array(
194 - 'action' => 'rped',
195 - 'format' => 'php',
196 - 'delete' => $page,
197 - );
198 -
199 - $x = $this->http->post($this->apiurl,$params);
200 - $x = unserialize($x);
201 - #var_export($x);
202 - return true;
203 - }
204 -
205 -
206 - /**
207 - * This function takes a username and password and logs you into wikipedia.
208 - * @param $user Username to login as.
209 - * @param $pass Password that corrisponds to the username.
210 - * @return void
211 - **/
212 - function login ($user,$pass) {
213 - $x = unserialize($this->http->post($this->apiurl.'?action=login&format=php',array('lgname' => $user, 'lgpassword' => $pass)));
214 - if($x['login']['result'] == 'Success')
215 - return true;
216 - if($x['login']['result'] == 'NeedToken') {
217 - $x = unserialize($this->http->post($this->apiurl.'?action=login&format=php',array('lgname' => $user, 'lgpassword' => $pass, 'lgtoken' => $x['login']['token'])));
218 - if($x['login']['result'] == 'Success')
219 - return true;
220 - }
221 - return false;
222 - }
223 -
224 - /**
225 - * This function returns the edit token.
226 - * @return Edit token.
227 - **/
228 - function getedittoken () {
229 - $tokens = $this->gettokens('Main Page');
230 - if ($tokens['edittoken'] == '') $tokens = $this->gettokens('Main Page',true);
231 - $this->edittoken = $tokens['edittoken'];
232 - return $tokens['edittoken'];
233 - }
234 -
235 - /**
236 - * This function returns the various tokens for a certain page.
237 - * @param $title Page to get the tokens for.
238 - * @param $flush Optional - internal use only. Flushes the token cache.
239 - * @return An associative array of tokens for the page.
240 - **/
241 - function gettokens ($title,$flush = false) {
242 - if (!is_array($this->tokencache)) $this->tokencache = array();
243 - foreach ($this->tokencache as $t => $data) if (time() - $data['timestamp'] > 6*60*60) unset($this->tokencache[$t]);
244 - if (isset($this->tokencache[$title]) && (!$flush)) {
245 - return $this->tokencache[$title]['tokens'];
246 - } else {
247 - $tokens = array();
248 - $x = $this->http->get($this->apiurl.'?action=query&format=php&prop=info&intoken=edit|delete|protect|move|block|unblock|email&titles='.urlencode($title));
249 - $x = unserialize($x);
250 - foreach ($x['query']['pages'] as $y) {
251 - $tokens['edittoken'] = $y['edittoken'];
252 - $tokens['deletetoken'] = $y['deletetoken'];
253 - $tokens['protecttoken'] = $y['protecttoken'];
254 - $tokens['movetoken'] = $y['movetoken'];
255 - $tokens['blocktoken'] = $y['blocktoken'];
256 - $tokens['unblocktoken'] = $y['unblocktoken'];
257 - $tokens['emailtoken'] = $y['emailtoken'];
258 - $this->tokencache[$title] = array(
259 - 'timestamp' => time(),
260 - 'tokens' => $tokens
261 - );
262 - return $tokens;
263 - }
264 - }
265 - }
266 -
267 - /**
268 - * This function returns the recent changes for the wiki.
269 - * @param $count The number of items to return. (Default 10)
270 - * @param $namespace The namespace ID to filter items on. Null for no filtering. (Default null)
271 - * @param $dir The direction to pull items. "older" or "newer". (Default 'older')
272 - * @param $ts The timestamp to start at. Null for the beginning/end (depending on direction). (Default null)
273 - * @return Associative array of recent changes metadata.
274 - **/
275 - function recentchanges ($count = 10,$namespace = null,$dir = 'older',$ts = null) {
276 - $append = '';
277 - if ($ts !== null) { $append .= '&rcstart='.urlencode($ts); }
278 - $append .= '&rcdir='.urlencode($dir);
279 - if ($namespace !== null) { $append .= '&rcnamespace='.urlencode($namespace); }
280 - $x = $this->http->get($this->apiurl.'?action=query&list=recentchanges&rcprop=user|comment|flags|timestamp|title|ids|sizes&format=php&rclimit='.$count.$append);
281 - $x = unserialize($x);
282 - return $x['query']['recentchanges'];
283 - }
284 -
285 - /**
286 - * This function returns search results from Wikipedia's internal search engine.
287 - * @param $search The query string to search for.
288 - * @param $limit The number of results to return. (Default 10)
289 - * @param $offset The number to start at. (Default 0)
290 - * @param $namespace The namespace ID to filter by. Null means no filtering. (Default 0)
291 - * @param $what What to search, 'text' or 'title'. (Default 'text')
292 - * @param $redirs Whether or not to list redirects. (Default false)
293 - * @return Associative array of search result metadata.
294 - **/
295 - function search ($search,$limit = 10,$offset = 0,$namespace = 0,$what = 'text',$redirs = false) {
296 - $append = '';
297 - if ($limit != null) $append .= '&srlimit='.urlencode($limit);
298 - if ($offset != null) $append .= '&sroffset='.urlencode($offset);
299 - if ($namespace != null) $append .= '&srnamespace='.urlencode($namespace);
300 - if ($what != null) $append .= '&srwhat='.urlencode($what);
301 - if ($redirs == true) $append .= '&srredirects=1';
302 - else $append .= '&srredirects=0';
303 - $x = $this->http->get($this->apiurl.'?action=query&list=search&format=php&srsearch='.urlencode($search).$append);
304 - $x = unserialize($x);
305 - return $x['query']['search'];
306 - }
307 -
308 - /**
309 - * Retrieve entries from the WikiLog.
310 - * @param $user Username who caused the entry. Null means anyone. (Default null)
311 - * @param $title Object to which the entry refers. Null means anything. (Default null)
312 - * @param $limit Number of entries to return. (Default 50)
313 - * @param $type Type of logs. Null means any type. (Default null)
314 - * @param $start Date to start enumerating logs. Null means beginning/end depending on $dir. (Default null)
315 - * @param $end Where to stop enumerating logs. Null means whenever limit is satisfied or there are no more logs. (Default null)
316 - * @param $dir Direction to enumerate logs. "older" or "newer". (Default 'older')
317 - * @return Associative array of logs metadata.
318 - **/
319 - function logs ($user = null,$title = null,$limit = 50,$type = null,$start = null,$end = null,$dir = 'older') {
320 - $append = '';
321 - if ($user != null) $append.= '&leuser='.urlencode($user);
322 - if ($title != null) $append.= '&letitle='.urlencode($title);
323 - if ($limit != null) $append.= '&lelimit='.urlencode($limit);
324 - if ($type != null) $append.= '&letype='.urlencode($type);
325 - if ($start != null) $append.= '&lestart='.urlencode($start);
326 - if ($end != null) $append.= '&leend='.urlencode($end);
327 - if ($dir != null) $append.= '&ledir='.urlencode($dir);
328 - $x = $this->http->get($this->apiurl.'?action=query&format=php&list=logevents&leprop=ids|title|type|user|timestamp|comment|details'.$append);
329 - $x = unserialize($x);
330 - return $x['query']['logevents'];
331 - }
332 -
333 - /**
334 - * Retrieves metadata about a user's contributions.
335 - * @param $user Username whose contributions we want to retrieve.
336 - * @param $count Number of entries to return. (Default 50)
337 - * @param[in,out] $continue Where to continue enumerating if part of a larger, split request. This is filled with the next logical continuation value. (Default null)
338 - * @param $dir Which direction to enumerate from, "older" or "newer". (Default 'older')
339 - * @return Associative array of contributions metadata.
340 - **/
341 - function usercontribs ($user,$count = 50,&$continue = null,$dir = 'older') {
342 - if ($continue != null) {
343 - $append = '&ucstart='.urlencode($continue);
344 - } else {
345 - $append = '';
346 - }
347 - $x = $this->http->get($this->apiurl.'?action=query&format=php&list=usercontribs&ucuser='.urlencode($user).'&uclimit='.urlencode($count).'&ucdir='.urlencode($dir).$append);
348 - $x = unserialize($x);
349 - $continue = $x['query-continue']['usercontribs']['ucstart'];
350 - return $x['query']['usercontribs'];
351 - }
352 -
353 - /**
354 - * Returns revision data (meta and/or actual).
355 - * @param $page Page for which to return revision data for.
356 - * @param $count Number of revisions to return. (Default 1)
357 - * @param $dir Direction to start enumerating multiple revisions from, "older" or "newer". (Default 'older')
358 - * @param $content Whether to return actual revision content, true or false. (Default false)
359 - * @param $revid Revision ID to start at. (Default null)
360 - * @param $wait Whether or not to wait a few seconds for the specific revision to become available. (Default true)
361 - * @param $getrbtok Whether or not to retrieve a rollback token for the revision. (Default false)
362 - * @param $dieonerror Whether or not to kill the process with an error if an error occurs. (Default false)
363 - * @param $redirects Whether or not to follow redirects. (Default false)
364 - * @return Associative array of revision data.
365 - **/
366 - function revisions ($page,$count = 1,$dir = 'older',$content = false,$revid = null,$wait = true,$getrbtok = false,$dieonerror = true,$redirects = false) {
367 - $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':''));
368 - $x = unserialize($x);
369 - if ($revid !== null) {
370 - $found = false;
371 - if (!isset($x['query']['pages']) or !is_array($x['query']['pages'])) {
372 - if ($dieonerror == true) die('No such page.'."\n");
373 - else return false;
374 - }
375 - foreach ($x['query']['pages'] as $data) {
376 - if (!isset($data['revisions']) or !is_array($data['revisions'])) {
377 - if ($dieonerror == true) die('No such page.'."\n");
378 - else return false;
379 - }
380 - foreach ($data['revisions'] as $data2) if ($data2['revid'] == $revid) $found = true;
381 - unset($data,$data2);
382 - break;
383 - }
384 -
385 - if ($found == false) {
386 - if ($wait == true) {
387 - sleep(1);
388 - return $this->revisions($page,$count,$dir,$content,$revid,false,$getrbtok,$dieonerror);
389 - } else {
390 - if ($dieonerror == true) die('Revision error.'."\n");
391 - }
392 - }
393 - }
394 - foreach ($x['query']['pages'] as $key => $data) {
395 - $data['revisions']['ns'] = $data['ns'];
396 - $data['revisions']['title'] = $data['title'];
397 - $data['revisions']['currentuser'] = $x['query']['userinfo']['name'];
398 -// $data['revisions']['currentuser'] = $x['query']['userinfo']['currentuser']['name'];
399 - $data['revisions']['continue'] = $x['query-continue']['revisions']['rvstartid'];
400 - $data['revisions']['pageid'] = $key;
401 - return $data['revisions'];
402 - }
403 - }
404 -
405 - /**
406 - * Enumerates user metadata.
407 - * @param $start The username to start enumerating from. Null means from the beginning. (Default null)
408 - * @param $limit The number of users to enumerate. (Default 1)
409 - * @param $group The usergroup to filter by. Null means no filtering. (Default null)
410 - * @param $requirestart Whether or not to require that $start be a valid username. (Default false)
411 - * @param[out] $continue This is filled with the name to continue from next query. (Default null)
412 - * @return Associative array of user metadata.
413 - **/
414 - function users ($start = null,$limit = 1,$group = null,$requirestart = false,&$continue = null) {
415 - $append = '';
416 - if ($start != null) $append .= '&aufrom='.urlencode($start);
417 - if ($group != null) $append .= '&augroup='.urlencode($group);
418 - $x = $this->http->get($this->apiurl.'?action=query&list=allusers&format=php&auprop=blockinfo|editcount|registration|groups&aulimit='.urlencode($limit).$append);
419 - $x = unserialize($x);
420 - $continue = $x['query-continue']['allusers']['aufrom'];
421 - if (($requirestart == true) and ($x['query']['allusers'][0]['name'] != $start)) return false;
422 - return $x['query']['allusers'];
423 - }
424 -
425 - /**
426 - * Get members of a category.
427 - * @param $category Category to enumerate from.
428 - * @param $count Number of members to enumerate. (Default 500)
429 - * @param[in,out] $continue Where to continue enumerating from. This is automatically filled in when run. (Default null)
430 - * @return Associative array of category member metadata.
431 - **/
432 - function categorymembers ($category,$count = 500,&$continue = null) {
433 - if ($continue != null) {
434 - $append = '&cmcontinue='.urlencode($continue);
435 - } else {
436 - $append = '';
437 - }
438 - $category = 'Category:'.str_ireplace('category:','',$category);
439 - $x = $this->http->get($this->apiurl.'?action=query&list=categorymembers&cmtitle='.urlencode($category).'&format=php&cmlimit='.$count.$append);
440 - $x = unserialize($x);
441 - $continue = $x['query-continue']['categorymembers']['cmcontinue'];
442 - return $x['query']['categorymembers'];
443 - }
444 -
445 - /**
446 - * Enumerate all categories.
447 - * @param[in,out] $start Where to start enumerating. This is updated automatically with the value to continue from. (Default null)
448 - * @param $limit Number of categories to enumerate. (Default 50)
449 - * @param $dir Direction to enumerate in. 'ascending' or 'descending'. (Default 'ascending')
450 - * @param $prefix Only enumerate categories with this prefix. (Default null)
451 - * @return Associative array of category list metadata.
452 - **/
453 - function listcategories (&$start = null,$limit = 50,$dir = 'ascending',$prefix = null) {
454 - $append = '';
455 - if ($start != null) $append .= '&acfrom='.urlencode($start);
456 - if ($limit != null) $append .= '&aclimit='.urlencode($limit);
457 - if ($dir != null) $append .= '&acdir='.urlencode($dir);
458 - if ($prefix != null) $append .= '&acprefix='.urlencode($prefix);
459 -
460 - $x = $this->http->get($this->apiurl.'?action=query&list=allcategories&acprop=size&format=php'.$append);
461 - $x = unserialize($x);
462 -
463 - $start = $x['query-continue']['allcategories']['acfrom'];
464 -
465 - return $x['query']['allcategories'];
466 - }
467 -
468 - /**
469 - * Enumerate all backlinks to a page.
470 - * @param $page Page to search for backlinks to.
471 - * @param $count Number of backlinks to list. (Default 500)
472 - * @param[in,out] $continue Where to start enumerating from. This is automatically filled in. (Default null)
473 - * @param $filter Whether or not to include redirects. Acceptible values are 'all', 'redirects', and 'nonredirects'. (Default null)
474 - * @return Associative array of backlink metadata.
475 - **/
476 - function backlinks ($page,$count = 500,&$continue = null,$filter = null) {
477 - if ($continue != null) {
478 - $append = '&blcontinue='.urlencode($continue);
479 - } else {
480 - $append = '';
481 - }
482 - if ($filter != null) {
483 - $append .= '&blfilterredir='.urlencode($filter);
484 - }
485 -
486 - $x = $this->http->get($this->apiurl.'?action=query&list=backlinks&bltitle='.urlencode($page).'&format=php&bllimit='.$count.$append);
487 - $x = unserialize($x);
488 - $continue = $x['query-continue']['backlinks']['blcontinue'];
489 - return $x['query']['backlinks'];
490 - }
491 -
492 - /**
493 - * Gets a list of transcludes embedded in a page.
494 - * @param $page Page to look for transcludes in.
495 - * @param $count Number of transcludes to list. (Default 500)
496 - * @param[in,out] $continue Where to start enumerating from. This is automatically filled in. (Default null)
497 - * @return Associative array of transclude metadata.
498 - **/
499 - function embeddedin ($page,$count = 500,&$continue = null) {
500 - if ($continue != null) {
501 - $append = '&eicontinue='.urlencode($continue);
502 - } else {
503 - $append = '';
504 - }
505 - $x = $this->http->get($this->apiurl.'?action=query&list=embeddedin&eititle='.urlencode($page).'&format=php&eilimit='.$count.$append);
506 - $x = unserialize($x);
507 - $continue = $x['query-continue']['embeddedin']['eicontinue'];
508 - return $x['query']['embeddedin'];
509 - }
510 -
511 - /**
512 - * Gets a list of pages with a common prefix.
513 - * @param $prefix Common prefix to search for.
514 - * @param $namespace Numeric namespace to filter on. (Default 0)
515 - * @param $count Number of pages to list. (Default 500)
516 - * @param[in,out] $continue Where to start enumerating from. This is automatically filled in. (Default null)
517 - * @return Associative array of page metadata.
518 - **/
519 - function listprefix ($prefix,$namespace = 0,$count = 500,&$continue = null) {
520 - $append = '&apnamespace='.urlencode($namespace);
521 - if ($continue != null) {
522 - $append .= '&apfrom='.urlencode($continue);
523 - }
524 - $x = $this->http->get($this->apiurl.'?action=query&list=allpages&apprefix='.urlencode($prefix).'&format=php&aplimit='.$count.$append);
525 - $x = unserialize($x);
526 - $continue = $x['query-continue']['allpages']['apfrom'];
527 - return $x['query']['allpages'];
528 - }
529 -
530 - /**
531 - * Edits a page.
532 - * @param $page Page name to edit.
533 - * @param $data Data to post to page.
534 - * @param $summary Edit summary to use.
535 - * @param $minor Whether or not to mark edit as minor. (Default false)
536 - * @param $bot Whether or not to mark edit as a bot edit. (Default true)
537 - * @param $wpStarttime Time in MW TS format of beginning of edit. (Default now)
538 - * @param $wpEdittime Time in MW TS format of last edit to that page. (Default correct)
539 - * @return boolean True on success, false on failure.
540 - **/
541 - function edit ($page,$data,$summary = '',$minor = false,$bot = true,$wpStarttime = null,$wpEdittime = null,$checkrun = true) {
542 - global $run, $user;
543 -
544 - $wpq = new wikipediaquery; $wpq->queryurl = str_replace('api.php','query.php',$this->apiurl);
545 -
546 - if ($checkrun == true)
547 - if (!preg_match('/(yes|enable|true)/iS',((isset($run))?$run:$wpq->getpage('User:'.$user.'/Run'))))
548 - return false; /* Check /Run page */
549 -
550 - $params = Array(
551 - 'action' => 'edit',
552 - 'format' => 'php',
553 - 'assert' => 'bot',
554 - 'title' => $page,
555 - 'text' => $data,
556 - 'token' => $this->getedittoken(),
557 - 'summary' => $summary,
558 - ($minor?'minor':'notminor') => '1',
559 - ($bot?'bot':'notbot') => '1'
560 - );
561 -
562 - if ($wpStarttime !== null) $params['starttimestamp'] = $wpStarttime;
563 - if ($wpEdittime !== null) $params['basetimestamp'] = $wpEdittime;
564 -
565 - $x = $this->http->post($this->apiurl,$params);
566 - $x = unserialize($x);
567 - var_export($x);
568 - if ($x['edit']['result'] == 'Success') return true;
569 - else return false;
570 - }
571 -
572 - /**
573 - * Moves a page.
574 - * @param $old Name of page to move.
575 - * @param $new New page title.
576 - * @param $reason Move summary to use.
577 - * @return void
578 - **/
579 - function move ($old,$new,$reason) {
580 - $tokens = $this->gettokens($old);
581 - $params = array(
582 - 'action' => 'move',
583 - 'format' => 'php',
584 - 'from' => $old,
585 - 'to' => $new,
586 - 'token' => $tokens['movetoken'],
587 - 'reason' => $reason
588 - );
589 -
590 - $x = $this->http->post($this->apiurl,$params);
591 - $x = unserialize($x);
592 - var_export($x);
593 - }
594 -
595 - /**
596 - * Rollback an edit.
597 - * @param $title Title of page to rollback.
598 - * @param $user Username of last edit to the page to rollback.
599 - * @param $reason Edit summary to use for rollback.
600 - * @param $token Rollback token. If not given, it will be fetched. (Default null)
601 - * @return void
602 - **/
603 - function rollback ($title,$user,$reason,$token = null) {
604 - if (($token == null) or ($token == '')) {
605 - $token = $this->revisions($title,1,'older',false,null,true,true);
606 - print_r($token);
607 - if ($token[0]['user'] == $user) {
608 - $token = $token[0]['rollbacktoken'];
609 - } else {
610 - return false;
611 - }
612 - }
613 - $params = array(
614 - 'action' => 'rollback',
615 - 'format' => 'php',
616 - 'title' => $title,
617 - 'user' => $user,
618 - 'summary' => $reason,
619 - 'token' => $token,
620 - 'markbot' => 0
621 - );
622 -
623 - echo 'Posting to API: ';
624 - var_export($params);
625 -
626 - $x = $this->http->post($this->apiurl,$params);
627 - $x = unserialize($x);
628 - var_export($x);
629 - return (isset($x['rollback']['summary'])?true:false);
630 - }
631 - }
632 -
633 - /**
634 - * This class is for interacting with Wikipedia's browser interface, index.php.
635 - * Many of these functions are deprecated.
636 - **/
637 - class wikipediaindex {
638 - private $http;
639 - public $indexurl = 'http://rped.org/beta2/index.php';
640 - private $postinterval = 0;
641 - private $lastpost;
642 - private $edittoken;
643 -
644 - /**
645 - * This is our constructor.
646 - * @return void
647 - **/
648 - function __construct () {
649 - global $__wp__http;
650 - if (!isset($__wp__http)) {
651 - $__wp__http = new http;
652 - }
653 - $this->http = &$__wp__http;
654 - }
655 -
656 - /**
657 - * Post data to a page, nicely.
658 - * @param $page Page title.
659 - * @param $data Data to post to page.
660 - * @param $summery Edit summary. (Default '')
661 - * @param $minor Whether to mark edit as minor. (Default false)
662 - * @param $rv Revision data. If not given, it will be fetched. (Default null)
663 - * @param $bot Whether to mark edit as bot. (Default true)
664 - * @return HTML data from the page.
665 - * @deprecated
666 - * @see wikipediaapi::edit
667 - **/
668 - function post ($page,$data,$summery = '',$minor = false,$rv = null,$bot = true) {
669 - global $user;
670 - global $maxlag;
671 - global $irc;
672 - global $irctechchannel;
673 - global $run;
674 - global $maxlagkeepgoing;
675 -
676 - $wpq = new wikipediaquery; $wpq->queryurl = str_replace('index.php','query.php',$this->indexurl);
677 - $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
678 -
679 - if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
680 - if ($rv == null) $rv = $wpapi->revisions($page,1,'older',true);
681 - if (!$rv[0]['*']) $rv[0]['*'] = $wpq->getpage($page);
682 -
683 - //Fake the edit form.
684 - $now = gmdate('YmdHis', time());
685 - $token = htmlspecialchars($this->edittoken);
686 - $tmp = date_parse($rv[0]['timestamp']);
687 - $edittime = gmdate('YmdHis', gmmktime($tmp['hour'],$tmp['minute'],$tmp['second'],$tmp['month'],$tmp['day'],$tmp['year']));
688 - $html = "<input type='hidden' value=\"{$now}\" name=\"wpStarttime\" />\n";
689 - $html.= "<input type='hidden' value=\"{$edittime}\" name=\"wpEdittime\" />\n";
690 - $html.= "<input type='hidden' value=\"{$token}\" name=\"wpEditToken\" />\n";
691 - $html.= '<input name="wpAutoSummary" type="hidden" value="'.md5('').'" />'."\n";
692 -
693 - if (preg_match('/'.preg_quote('{{nobots}}','/').'/iS',$rv[0]['*'])) { return false; } /* Honor the bots flags */
694 - if (preg_match('/'.preg_quote('{{bots|allow=none}}','/').'/iS',$rv[0]['*'])) { return false; }
695 - if (preg_match('/'.preg_quote('{{bots|deny=all}}','/').'/iS',$rv[0]['*'])) { return false; }
696 - if (preg_match('/'.preg_quote('{{bots|deny=','/').'(.*)'.preg_quote('}}','/').'/iS',$rv[0]['*'],$m)) { if (in_array(explode(',',$m[1]),$user)) { return false; } } /* /Honor the bots flags */
697 - if (!preg_match('/'.preg_quote($user,'/').'/iS',$rv['currentuser'])) { return false; } /* We need to be logged in */
698 -// if (preg_match('/'.preg_quote('You have new messages','/').'/iS',$rv[0]['*'])) { return false; } /* Check talk page */
699 - if (!preg_match('/(yes|enable|true)/iS',((isset($run))?$run:$wpq->getpage('User:'.$user.'/Run')))) { return false; } /* Check /Run page */
700 -
701 - $x = $this->forcepost($page,$data,$summery,$minor,$html,$maxlag,$maxlagkeepgoing,$bot); /* Go ahead and post. */
702 - $this->lastpost = time();
703 - return $x;
704 - }
705 -
706 - /**
707 - * Post data to a page.
708 - * @param $page Page title.
709 - * @param $data Data to post to page.
710 - * @param $summery Edit summary. (Default '')
711 - * @param $minor Whether to mark edit as minor. (Default false)
712 - * @param $edithtml HTML from the edit form. If not given, it will be fetched. (Default null)
713 - * @param $maxlag Maxlag for posting. (Default null)
714 - * @param $mlkg Whether to keep going after encountering a maxlag error and sleeping or not. (Default null)
715 - * @param $bot Whether to mark edit as bot. (Default true)
716 - * @return HTML data from the page.
717 - * @deprecated
718 - * @see wikipediaapi::edit
719 - **/
720 - function forcepost ($page,$data,$summery = '',$minor = false,$edithtml = null,$maxlag = null,$mlkg = null,$bot = true) {
721 - $post['wpSection'] = '';
722 - $post['wpScrolltop'] = '';
723 - if ($minor == true) { $post['wpMinoredit'] = 1; }
724 - $post['wpTextbox1'] = $data;
725 - $post['wpSummary'] = $summery;
726 - if ($edithtml == null) {
727 - $html = $this->http->get($this->indexurl.'?title='.urlencode($page).'&action=edit');
728 - } else {
729 - $html = $edithtml;
730 - }
731 - preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpStarttime\" /\>|U',$html,$m);
732 - $post['wpStarttime'] = $m[1];
733 - preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpEdittime\" /\>|U',$html,$m);
734 - $post['wpEdittime'] = $m[1];
735 - preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpEditToken\" /\>|U',$html,$m);
736 - $post['wpEditToken'] = $m[1];
737 - preg_match('|\<input name\=\"wpAutoSummary\" type\=\"hidden\" value\=\"(.*)\" /\>|U',$html,$m);
738 - $post['wpAutoSummary'] = $m[1];
739 - if ($maxlag != null) {
740 - $x = $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&maxlag='.urlencode($maxlag).'&bot='.(($bot == true)?'1':'0'),$post);
741 - if (preg_match('/Waiting for ([^ ]*): ([0-9.-]+) seconds lagged/S',$x,$lagged)) {
742 - global $irc;
743 - if (is_resource($irc)) {
744 - global $irctechchannel;
745 - foreach(explode(',',$irctechchannel) as $y) {
746 - #fwrite($irc,'PRIVMSG '.$y.' :'.$lagged[1].' is lagged out by '.$lagged[2].' seconds. ('.$lagged[0].')'."\n");
747 - }
748 - }
749 - sleep(10);
750 - if ($mlkg != true) { return false; }
751 - else { $x = $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&bot='.(($bot == true)?'1':'0'),$post); }
752 - }
753 - return $x;
754 - } else {
755 - return $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&bot='.(($bot == true)?'1':'0'),$post);
756 - }
757 - }
758 -
759 - /**
760 - * Get a diff.
761 - * @param $title Page title to get the diff of.
762 - * @param $oldid Old revision ID.
763 - * @param $id New revision ID.
764 - * @param $wait Whether or not to wait for the diff to become available. (Default true)
765 - * @return Array of added data, removed data, and a rollback token if one was fetchable.
766 - **/
767 - function diff ($title,$oldid,$id,$wait = true) {
768 - $deleted = '';
769 - $added = '';
770 -
771 - $html = $this->http->get($this->indexurl.'?title='.urlencode($title).'&action=render&diff='.urlencode($id).'&oldid='.urlencode($oldid).'&diffonly=1');
772 -
773 - if (preg_match_all('/\&amp\;(oldid\=)(\d*)\\\'\>(Revision as of|Current revision as of)/USs', $html, $m, PREG_SET_ORDER)) {
774 - //print_r($m);
775 - if ((($oldid != $m[0][2]) and (is_numeric($oldid))) or (($id != $m[1][2]) and (is_numeric($id)))) {
776 - if ($wait == true) {
777 - sleep(1);
778 - return $this->diff($title,$oldid,$id,false);
779 - } else {
780 - echo 'OLDID as detected: '.$m[0][2].' Wanted: '.$oldid."\n";
781 - echo 'NEWID as detected: '.$m[1][2].' Wanted: '.$id."\n";
782 - echo $html;
783 - die('Revision error.'."\n");
784 - }
785 - }
786 - }
787 -
788 - if (preg_match_all('/\<td class\=(\"|\\\')diff-addedline\1\>\<div\>(.*)\<\/div\>\<\/td\>/USs', $html, $m, PREG_SET_ORDER)) {
789 - //print_r($m);
790 - foreach ($m as $x) {
791 - $added .= htmlspecialchars_decode(strip_tags($x[2]))."\n";
792 - }
793 - }
794 -
795 - if (preg_match_all('/\<td class\=(\"|\\\')diff-deletedline\1\>\<div\>(.*)\<\/div\>\<\/td\>/USs', $html, $m, PREG_SET_ORDER)) {
796 - //print_r($m);
797 - foreach ($m as $x) {
798 - $deleted .= htmlspecialchars_decode(strip_tags($x[2]))."\n";
799 - }
800 - }
801 -
802 - //echo $added."\n".$deleted."\n";
803 -
804 - if (preg_match('/action\=rollback\&amp\;from\=.*\&amp\;token\=(.*)\"/US', $html, $m)) {
805 - $rbtoken = $m[1];
806 - $rbtoken = urldecode($rbtoken);
807 -// echo 'rbtoken: '.$rbtoken.' -- '; print_r($m); echo "\n\n";
808 - return array($added,$deleted,$rbtoken);
809 - }
810 -
811 - return array($added,$deleted);
812 - }
813 -
814 - /**
815 - * Rollback an edit.
816 - * @param $title Page title to rollback.
817 - * @param $user Username of last edit to the page to rollback.
818 - * @param $reason Reason to rollback. If null, default is generated. (Default null)
819 - * @param $token Rollback token to use. If null, it is fetched. (Default null)
820 - * @param $bot Whether or not to mark as bot. (Default true)
821 - * @return HTML or false if failure.
822 - * @deprecated
823 - * @see wikipediaapi::rollback
824 - **/
825 - function rollback ($title,$user,$reason = null,$token = null,$bot = true) {
826 - if (($token == null) or (!$token)) {
827 - $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
828 - $token = $wpapi->revisions($title,1,'older',false,null,true,true);
829 - if ($token[0]['user'] == $user) {
830 -// echo 'Token: '; print_r($token); echo "\n\n";
831 - $token = $token[0]['rollbacktoken'];
832 - } else {
833 - return false;
834 - }
835 - }
836 - $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'));
837 - #global $logfd; if (!is_resource($logfd)) $logfd = fopen('php://stderr','w'); fwrite($logfd,'Rollback return: '.$x."\n");
838 - if (!preg_match('/action complete/iS',$x)) return false;
839 - return $x;
840 - }
841 -
842 - /**
843 - * Move a page.
844 - * @param $old Page title to move.
845 - * @param $new New title to move to.
846 - * @param $reason Move page summary.
847 - * @return HTML page.
848 - * @deprecated
849 - * @see wikipediaapi::move
850 - **/
851 - function move ($old,$new,$reason) {
852 - $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
853 - if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
854 -
855 - $token = htmlspecialchars($this->edittoken);
856 -
857 - $post = array
858 - (
859 - 'wpOldTitle' => $old,
860 - 'wpNewTitle' => $new,
861 - 'wpReason' => $reason,
862 - 'wpWatch' => '0',
863 - 'wpEditToken' => $token,
864 - 'wpMove' => 'Move page'
865 - );
866 - return $this->http->post($this->indexurl.'?title=Special:Movepage&action=submit',$post);
867 - }
868 -
869 - /**
870 - * Uploads a file.
871 - * @param $page Name of page on the wiki to upload as.
872 - * @param $file Name of local file to upload.
873 - * @param $desc Content of the file description page.
874 - * @return HTML content.
875 - **/
876 - function upload ($page,$file,$desc) {
877 - $post = array
878 - (
879 - 'wpUploadFile' => '@'.$file,
880 - 'wpSourceType' => 'file',
881 - 'wpDestFile' => $page,
882 - 'wpUploadDescription' => $desc,
883 - 'wpLicense' => '',
884 - 'wpWatchthis' => '0',
885 - 'wpIgnoreWarning' => '1',
886 - 'wpUpload' => 'Upload file'
887 - );
888 - return $this->http->post($this->indexurl.'?title=Special:Upload&action=submit',$post);
889 - }
890 -
891 - /**
892 - * Check if a user has email enabled.
893 - * @param $user Username to check whether or not the user has email enabled.
894 - * @return True or false depending on whether or not the user has email enabled.
895 - **/
896 - function hasemail ($user) {
897 - $tmp = $this->http->get($this->indexurl.'?title=Special:EmailUser&target='.urlencode($user));
898 - if (stripos($tmp,"No e-mail address") !== false) return false;
899 - return true;
900 - }
901 -
902 - /**
903 - * Sends an email to a user.
904 - * @param $user Username to send email to.
905 - * @param $subject Subject of email to send.
906 - * @param $body Body of email to send.
907 - * @return HTML content.
908 - **/
909 - function email ($user,$subject,$body) {
910 - $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
911 - if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
912 -
913 - $post = array
914 - (
915 - 'wpSubject' => $subject,
916 - 'wpText' => $body,
917 - 'wpCCMe' => 0,
918 - 'wpSend' => 'Send',
919 - 'wpEditToken' => $this->edittoken
920 - );
921 -
922 - return $this->http->post($this->indexurl.'?title=Special:EmailUser&target='.urlencode($user).'&action=submit',$post);
923 - }
924 - }
925 -?>
926 -
927 -
928 -[edit] Diff function (diff.function.php)
929 -
930 -<?PHP
931 - function diff ($old,$new,$nret = true,$inline = false) {
932 -// if ($inline) {
933 -// 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));
934 -// }
935 - $file1 = tempnam('/tmp','diff_');
936 - $file2 = tempnam('/tmp','diff_');
937 - file_put_contents($file1,$old);
938 - file_put_contents($file2,$new);
939 - $out = array();
940 - if ($inline) {
941 -// echo 'EXEC: wdiff -3'.(($nret)?'1':'2').' '.escapeshellarg($file1).' '.escapeshellarg($file2)."\n";
942 - @exec('wdiff -3'.(($nret)?'1':'2').' '.escapeshellarg($file1).' '.escapeshellarg($file2),$out);
943 - foreach ($out as $key => $line) {
944 - if ($line == '======================================================================') unset($out[$key]);
945 - elseif ($nret) $out[$key] = '> '.$line;
946 - else $out[$key] = '< '.$line;
947 - }
948 - } else {
949 - @exec('diff -d --suppress-common-lines '.escapeshellarg($file1).' '.escapeshellarg($file2),$out);
950 - }
951 - $out2 = array();
952 - foreach ($out as $line) {
953 - if (
954 - (
955 - ($nret)
956 - and (preg_match('/^\> .*$/',$line))
957 - )
958 - or (
959 - (!$nret)
960 - and (preg_match('/^\< .*$/',$line))
961 - )
962 - ) {
963 - $out2[] = substr($line,2);
964 - }
965 - }
966 - $out = $out2;
967 - unset($out2);
968 - unlink($file1);
969 - unlink($file2);
970 - return implode("\n",$out);
971 - }
972 -?>
\ No newline at end of file

Status & tagging log