| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Plugin to support RSSCloud | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Plugin | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @copyright 2009 StatusNet, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-08 00:09:23 -08:00
										 |  |  | define('RSSCLOUDPLUGIN_VERSION', '0.1'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Plugin class for adding RSSCloud capabilities to StatusNet | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Plugin | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							| 
									
										
										
										
											2011-06-05 20:15:01 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | class RSSCloudPlugin extends Plugin | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Our friend, the constructor | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  |     function __construct() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::__construct(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Setup the info for the subscription handler. Allow overriding | 
					
						
							|  |  |  |      * to point at another cloud hub (not currently used). | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |     function onInitializePlugin() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  |         $this->domain   = common_config('rsscloud', 'domain'); | 
					
						
							|  |  |  |         $this->port     = common_config('rsscloud', 'port'); | 
					
						
							|  |  |  |         $this->path     = common_config('rsscloud', 'path'); | 
					
						
							|  |  |  |         $this->funct    = common_config('rsscloud', 'function'); | 
					
						
							|  |  |  |         $this->protocol = common_config('rsscloud', 'protocol'); | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  |         // set defaults
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-29 03:52:02 +00:00
										 |  |  |         $local_server = parse_url(common_path('main/rsscloud/request_notify')); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  |         if (empty($this->domain)) { | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |             $this->domain = $local_server['host']; | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  |         if (empty($this->port)) { | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |             $this->port = '80'; | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  |         if (empty($this->path)) { | 
					
						
							| 
									
										
										
										
											2009-12-29 03:52:02 +00:00
										 |  |  |             $this->path = $local_server['path']; | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($this->funct)) { | 
					
						
							|  |  |  |             $this->funct = ''; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($this->protocol)) { | 
					
						
							|  |  |  |             $this->protocol = 'http-post'; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Add RSSCloud-related paths to the router table | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Hook for RouterInitialized event. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-04-21 18:11:29 -07:00
										 |  |  |      * @param Mapper $m URL parser and mapper | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-04-21 18:11:29 -07:00
										 |  |  |     function onRouterInitialized($m) | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |         $m->connect('/main/rsscloud/request_notify', | 
					
						
							|  |  |  |                     array('action' => 'RSSCloudRequestNotify')); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-14 05:32:37 +00:00
										 |  |  |         // XXX: This is just for end-to-end testing. Uncomment if you need to pretend
 | 
					
						
							|  |  |  |         //      to be a cloud hub for some reason.
 | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |         //$m->connect('/main/rsscloud/notify',
 | 
					
						
							|  |  |  |         //            array('action' => 'LoggingAggregator'));
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add a <cloud> element to the RSS feed (after the rss <channel> | 
					
						
							|  |  |  |      * element is started). | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |      * @param Action $action the ApiAction | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-12-01 01:24:39 +00:00
										 |  |  |     function onStartApiRss($action) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-11-03 16:51:40 -08:00
										 |  |  |         if (get_class($action) == 'ApiTimelineUserAction') { | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |             $attrs = array('domain'            => $this->domain, | 
					
						
							|  |  |  |                            'port'              => $this->port, | 
					
						
							|  |  |  |                            'path'              => $this->path, | 
					
						
							|  |  |  |                            'registerProcedure' => $this->funct, | 
					
						
							|  |  |  |                            'protocol'          => $this->protocol); | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |             // Dipping into XMLWriter to avoid a full end element (</cloud>).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $action->xw->startElement('cloud'); | 
					
						
							|  |  |  |             foreach ($attrs as $name => $value) { | 
					
						
							|  |  |  |                 $action->xw->writeAttribute($name, $value); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 01:24:39 +00:00
										 |  |  |             $action->xw->endElement(); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-03 17:53:17 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add an RSSCloud queue item for each notice | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice $notice      the notice | 
					
						
							|  |  |  |      * @param array  &$transports the list of transports (queues) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-03 17:53:17 -08:00
										 |  |  |     function onStartEnqueueNotice($notice, &$transports) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-06-03 16:58:45 -07:00
										 |  |  |         if ($notice->isLocal()) { | 
					
						
							|  |  |  |             array_push($transports, 'rsscloud'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-11-03 17:53:17 -08:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-11 21:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Create the rsscloud_subscription table if it's not | 
					
						
							|  |  |  |      * already in the DB | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |     function onCheckSchema() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         $schema = Schema::get(); | 
					
						
							|  |  |  |         $schema->ensureTable('rsscloud_subscription', | 
					
						
							| 
									
										
										
										
											2010-10-29 15:36:42 -07:00
										 |  |  |             array( | 
					
						
							|  |  |  |                 'fields' => array( | 
					
						
							|  |  |  |                     'subscribed' => array('type' => 'int', 'not null' => true), | 
					
						
							| 
									
										
										
										
											2015-02-21 16:43:21 +01:00
										 |  |  |                     'url' => array('type' => 'varchar', 'length' => '191', 'not null' => true), | 
					
						
							| 
									
										
										
										
											2010-10-29 15:36:42 -07:00
										 |  |  |                     'failures' => array('type' => 'int', 'not null' => true, 'default' => 0), | 
					
						
							|  |  |  |                     'created' => array('type' => 'datetime', 'not null' => true), | 
					
						
							|  |  |  |                     'modified' => array('type' => 'timestamp', 'not null' => true), | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 'primary key' => array('subscribed', 'url'), | 
					
						
							|  |  |  |             )); | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |          return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-01-22 12:52:36 -08:00
										 |  |  |      * Register RSSCloud notice queue handler | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-01-22 12:52:36 -08:00
										 |  |  |      * @param QueueManager $manager | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-01-22 12:52:36 -08:00
										 |  |  |     function onEndInitializeQueueManager($manager) | 
					
						
							| 
									
										
										
										
											2009-12-08 21:04:26 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-01-22 12:52:36 -08:00
										 |  |  |         $manager->connect('rsscloud', 'RSSCloudQueueHandler'); | 
					
						
							| 
									
										
										
										
											2009-12-08 21:04:26 +00:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-06 22:04:01 +02:00
										 |  |  |     function onPluginVersion(array &$versions) | 
					
						
							| 
									
										
										
										
											2010-01-08 00:09:23 -08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $versions[] = array('name' => 'RSSCloud', | 
					
						
							|  |  |  |                             'version' => RSSCLOUDPLUGIN_VERSION, | 
					
						
							|  |  |  |                             'author' => 'Zach Copley', | 
					
						
							| 
									
										
										
										
											2016-01-22 16:38:42 +00:00
										 |  |  |                             'homepage' => 'https://git.gnu.io/gnu/gnu-social/tree/master/plugins/RSSCloud', | 
					
						
							| 
									
										
										
										
											2010-01-08 00:09:23 -08:00
										 |  |  |                             'rawdescription' => | 
					
						
							| 
									
										
										
										
											2011-06-05 20:15:01 +02:00
										 |  |  |                             // TRANS: Plugin description.
 | 
					
						
							| 
									
										
										
										
											2010-01-08 00:09:23 -08:00
										 |  |  |                             _m('The RSSCloud plugin enables your StatusNet instance to publish ' . | 
					
						
							|  |  |  |                                'real-time updates for profile RSS feeds using the ' . | 
					
						
							| 
									
										
										
										
											2010-09-18 11:25:11 +02:00
										 |  |  |                                '<a href="http://rsscloud.org/">RSSCloud protocol</a>.')); | 
					
						
							| 
									
										
										
										
											2010-01-08 00:09:23 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | } |