4 * Send weblog updates ping
5 * plugin for NucleusCMS(version 3.30 or lator)
6 * Note: based on NP_PingPong, adapt for the new ping mechanism
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 * (see nucleus/documentation/index.html#license for more info)
15 * @author admun (Edmond Hui)
16 * @license http://www.gnu.org/licenses/gpl.txt GNU GENERAL PUBLIC LICENSE Version 2, June 1991
18 * @link http://edmondhui.homeip.net/nudn
21 * v1.0 - Initial version
22 * v1.1 - Add JustPosted event support
23 * v1.2 - JustPosted event handling in background
24 * v1.3 - pinged variable support
25 * v1.4 - language file support
26 * v1.5 - remove arg1 in exec() call
27 * v1.6 - move send update ping override option to plugin
28 * v1.7 - move send ping option from blog to plugin/blog level
29 * - remove ping override option
30 * v1.8 - remove sendPing event handle, switch to use PostAddItem and PostUpdateItem event for new item ping
31 * v1.81 - fix bug in _sendPingCheck() where ITEM class not found when creating new weblog
34 class NP_Ping extends NucleusPlugin
36 public function getName() { return 'Ping'; }
37 public function getAuthor() { return 'admun (Edmond Hui)'; }
38 public function getURL() { return 'http://edmondhui.homeip.net/nudn'; }
39 public function getVersion() { return '1.81'; }
40 public function getMinNucleusVersion() { return '330'; }
41 public function getDescription() { return _PING_DESC; }
42 public function supportsFeature($what) { return ( $what == 'SqlTablePrefix' ); }
43 public function getEventList(){ return array('JustPosted', 'PostAddItem', 'PostUpdateItem'); }
44 public function init()
46 // include translation file for this plugin
47 if ( file_exists($this->getDirectory() . i18n::get_current_locale() . '.' . i18n::get_current_charset() . '.php') )
49 include_once($this->getDirectory() . i18n::get_current_locale() . '.' . i18n::get_current_charset() . '.php');
53 include_once($this->getDirectory().'en_Latn_US.UTF-8.php');
58 public function install()
60 // Default, http://pingomatic.com
61 $this->createOption('pingpong_pingomatic', _PING_PINGOM, 'yesno', 'yes');
63 $this->createOption('pingpong_weblogs', _PING_WEBLOGS, 'yesno', 'no');
64 // http://www.technorati.com
65 $this->createOption('pingpong_technorati', _PING_TECHNOR, 'yesno', 'no');
66 // http://www.blogrolling.com
67 $this->createOption('pingpong_blogrolling', _PING_BLOGR, 'yesno', 'no');
69 $this->createOption('pingpong_blogs', _PING_BLOGS, 'yesno', 'no');
70 // http://weblogues.com/
71 $this->createOption('pingpong_weblogues', _PING_WEBLOGUES, 'yesno', 'no');
73 $this->createOption('pingpong_bloggde', _PING_BLOGGDE, 'yesno', 'no');
74 // Pinging on background
75 $this->createOption('ping_background', _PING_BG, 'yesno', 'no');
77 /* plugin weblog option */
78 $this->createBlogOption('ping_sendping', _PING_SENDPING, 'yesno', 'yes');
82 public function event_JustPosted($data)
84 global $DIR_PLUGINS, $DIR_NUCLEUS;
86 // exit is another plugin already send ping
87 if ( $data['pinged'] == true )
92 $bid = intval($data['blogid']);
93 if ($this->getBlogOption($bid, 'ping_sendping') == "yes")
95 if ( $this->getOption('ping_background') == "yes" )
97 exec("php $DIR_PLUGINS/ping/ping.php " . $data['blogid'] . " &");
101 $this->sendPings($data['blogid']);
104 // mark the ping has been sent
105 $data['pinged'] = true;
109 public function event_PostAddItem($data)
111 $this->_sendPingCheck($data['itemid']);
115 public function event_PostUpdateItem($data)
117 $this->_sendPingCheck($data['itemid']);
121 public function _sendPingCheck($itemid)
123 $iid = intval($itemid);
125 $item = $manager->getItem($iid,0,0);
127 $bid = intval(getBlogIDFromItemID($iid));
128 if ($this->getBlogOption($bid, 'ping_sendping') == "yes" ) {
129 $this->sendPings(array('blogid' => $bid));
135 public function sendPings($data)
137 if ( !class_exists('xmlrpcmsg') )
139 include_libs('xmlrpc.inc.php');
141 $this->myBlogId = $data['blogid'];
145 if ( $this->getOption('pingpong_pingomatic') == 'yes' )
147 $ping_result .= _PINGING . "Ping-o-matic:\n";
148 $ping_result .= $this->pingPingomatic();
149 $ping_result .= " | ";
152 if ( $this->getOption('pingpong_weblogs') == 'yes' )
154 $ping_result .= _PINGING . "Weblogs.com:\n";
155 $ping_result .= $this->pingWeblogs();
156 $ping_result .= " | ";
159 if ( $this->getOption('pingpong_technorati') == 'yes' )
161 $ping_result .= _PINGING . "Technorati:\n";
162 $ping_result .= $this->pingTechnorati();
163 $ping_result .= " | ";
166 if ( $this->getOption('pingpong_blogrolling') == 'yes' )
168 $ping_result .= _PINGING . "Blogrolling.com:\n";
169 $ping_result .= $this->pingBlogRollingDotCom();
170 $ping_result .= " | ";
173 if ( $this->getOption('pingpong_blogs') == 'yes' )
175 $ping_result .= _PINGING . "Blog.gs:\n";
176 $ping_result .= $this->pingBloGs();
177 $ping_result .= " | ";
180 if ( $this->getOption('pingpong_weblogues') == 'yes' )
182 $ping_result .= _PINGING . "Weblogues.com:\n";
183 $ping_result .= $this->pingWebloguesDotCom();
184 $ping_result .= " | ";
187 if ( $this->getOption('pingpong_bloggde') == 'yes' )
189 $ping_result .= _PINGING . "Blog.de:\n";
190 $ping_result .= $this->pingBloggDe();
191 $ping_result .= " | ";
194 ActionLog::add(INFO, $ping_result);
198 public function pingPingomatic()
200 $b = new Blog($this->myBlogId);
201 $message = new xmlrpcmsg(
202 'weblogUpdates.ping',
204 new xmlrpcval($b->getName(), 'string'),
205 new xmlrpcval($b->getURL(), 'string')
209 $c = new xmlrpc_client('/', 'rpc.pingomatic.com', 80);
210 /* 30 seconds timeout... */
211 $r = $c->send($message,30);
212 return $this->processPingResult($r);
215 public function pingWeblogs()
217 $b = new Blog($this->myBlogId);
218 $message = new xmlrpcmsg(
219 'weblogupdates.ping',
221 new xmlrpcval($b->getName(), 'string'),
222 new xmlrpcval($b->getURL(), 'string')
226 $c = new xmlrpc_client('/rpc2', 'rpc.weblogs.com', 80);
227 /* 30 seconds timeout... */
228 $r = $c->send($message,30);
229 return $this->processPingResult($r);
232 public function pingTechnorati()
234 $b = new Blog($this->myBlogId);
235 $message = new xmlrpcmsg(
236 'weblogUpdates.ping',
238 new xmlrpcval($b->getName(),'string'),
239 new xmlrpcval($b->getURL(),'string')
243 $c = new xmlrpc_client('/rpc/ping/', 'rpc.technorati.com', 80);
244 /* 30 seconds timeout... */
245 $r = $c->send($message,30);
246 return $this->processPingResult($r);
249 public function pingBlogRollingDotCom()
251 $b = new Blog($this->myBlogId);
252 $message = new xmlrpcmsg(
253 'weblogUpdates.ping',
255 new xmlrpcval($b->getName(),'string'),
256 new xmlrpcval($b->getURL(),'string')
260 $c = new xmlrpc_client('/pinger/', 'rpc.blogrolling.com', 80);
261 /* 30 seconds timeout... */
262 $r = $c->send($message,30);
263 return $this->processPingResult($r);
266 public function pingBloGs()
268 $b = new Blog($this->myBlogId);
269 $message = new xmlrpcmsg(
270 'weblogUpdates.extendedPing',
272 new xmlrpcval($b->getName(),'string'),
273 new xmlrpcval($b->getURL(),'string')
277 $c = new xmlrpc_client('/', 'ping.blo.gs', 80);
278 /* 30 seconds timeout... */
279 $r = $c->send($message,30);
280 return $this->processPingResult($r);
283 public function pingWebloguesDotCom()
285 $b = new Blog($this->myBlogId);
286 $message = new xmlrpcmsg(
287 'weblogUpdates.extendedPing',
289 new xmlrpcval($b->getName(),'string'),
290 new xmlrpcval($b->getURL(),'string')
294 $c = new xmlrpc_client('/RPC/', 'www.weblogues.com', 80);
295 /* 30 seconds timeout... */
296 $r = $c->send($message,30);
297 return $this->processPingResult($r);
300 public function pingBloggDe()
302 $b = new Blog($this->myBlogId);
303 $message = new xmlrpcmsg(
306 new xmlrpcval($b->getName(),'string'),
307 new xmlrpcval($b->getURL(),'string')
311 $c = new xmlrpc_client('/', 'xmlrpc.blogg.de', 80);
312 /* 30 seconds timeout... */
313 $r = $c->send($message,30);
314 return $this->processPingResult($r);
317 public function processPingResult($r)
319 global $php_errormsg;
321 if ( ($r == 0) && ($r->errno || $r->errstring) )
323 return _PING_ERROR . " " . $r->errno . ' : ' . $r->errstring;
325 elseif ( ($r == 0) && ($php_errormsg) )
327 return _PING_PHP_ERROR . $php_errormsg;
331 return _PING_PHP_PING_ERROR;
333 elseif ( $r->faultCode() != 0 )
335 return _PING_ERROR . ': ' . $r->faultString();
339 // get response struct
343 $flerror = $r->structmem('flerror');
344 $flerror = $flerror->scalarval();
346 $message = $r->structmem('message');
347 $message = $message->scalarval();
351 return _PING_ERROR . ' (flerror=1): ' . $message;
355 return _PING_SUCCESS . ': ' . $message;