define('RSSCLOUDPLUGIN_VERSION', '0.1');
+/**
+ * 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/
+ **/
+
class RSSCloudPlugin extends Plugin
{
+ /**
+ * Our friend, the constructor
+ *
+ * @return void
+ */
function __construct()
{
parent::__construct();
}
- function onInitializePlugin(){
-
- common_debug("RSSCloudPlugin onInitializePlugin()");
+ /**
+ * Setup the info for the subscription handler. Allow overriding
+ * to point at another cloud hub (not currently used).
+ *
+ * @return void
+ */
+ function onInitializePlugin()
+ {
$this->domain = common_config('rsscloud', 'domain');
$this->port = common_config('rsscloud', 'port');
$this->path = common_config('rsscloud', 'path');
// set defaults
+ $local_server = parse_url(common_path('main/rsscloud/request_notify'));
+
if (empty($this->domain)) {
- $this->domain = 'rpc.rsscloud.org';
+ $this->domain = $local_server['host'];
}
if (empty($this->port)) {
- $this->port = '5337';
+ $this->port = '80';
}
if (empty($this->path)) {
- $this->path = '/rsscloud/pleaseNotify';
+ $this->path = $local_server['path'];
}
if (empty($this->funct)) {
*
* Hook for RouterInitialized event.
*
+ * @param Mapper $m URL parser and mapper
+ *
* @return boolean hook return
*/
- function onRouterInitialized(&$m)
+ function onRouterInitialized($m)
{
- $m->connect('rsscloud/request_notify', array('action' => 'RSSCloudRequestNotify'));
- $m->connect('rsscloud/notify', array('action' => 'LoggingAggregator'));
+ $m->connect('/main/rsscloud/request_notify',
+ array('action' => 'RSSCloudRequestNotify'));
+
+ // XXX: This is just for end-to-end testing. Uncomment if you need to pretend
+ // to be a cloud hub for some reason.
+ //$m->connect('/main/rsscloud/notify',
+ // array('action' => 'LoggingAggregator'));
return true;
}
+ /**
+ * Automatically load the actions and libraries used by
+ * the RSSCloud plugin
+ *
+ * @param Class $cls the class
+ *
+ * @return boolean hook return
+ *
+ */
+
function onAutoload($cls)
{
- common_debug("onAutoload() $cls");
-
switch ($cls)
{
-
- case 'RSSCloudNotifier':
- require_once(INSTALLDIR . '/plugins/RSSCloud/RSSCloudNotifier.php');
+ case 'RSSCloudSubscription':
+ include_once INSTALLDIR . '/plugins/RSSCloud/RSSCloudSubscription.php';
+ return false;
+ case 'RSSCloudNotifier':
+ include_once INSTALLDIR . '/plugins/RSSCloud/RSSCloudNotifier.php';
return false;
- case 'RSSCloudRequestNotifyAction':
- case 'LoggingAggregatorAction':
- common_debug(mb_substr($cls, 0, -6) . '.php');
- require_once(INSTALLDIR . '/plugins/RSSCloud/' . mb_substr($cls, 0, -6) . '.php');
+ case 'RSSCloudQueueHandler':
+ include_once INSTALLDIR . '/plugins/RSSCloud/RSSCloudQueueHandler.php';
return false;
- default:
+ case 'RSSCloudRequestNotifyAction':
+ case 'LoggingAggregatorAction':
+ include_once INSTALLDIR . '/plugins/RSSCloud/' .
+ mb_substr($cls, 0, -6) . '.php';
+ return false;
+ default:
return true;
}
}
- function onStartApiRss($action){
+ /**
+ * Add a <cloud> element to the RSS feed (after the rss <channel>
+ * element is started).
+ *
+ * @param Action $action the ApiAction
+ *
+ * @return void
+ */
+
+ function onStartApiRss($action)
+ {
+ if (get_class($action) == 'ApiTimelineUserAction') {
- // XXX: No sure we want every feed to be cloud enabled
+ $attrs = array('domain' => $this->domain,
+ 'port' => $this->port,
+ 'path' => $this->path,
+ 'registerProcedure' => $this->funct,
+ 'protocol' => $this->protocol);
- $attrs = array('domain' => $this->domain,
- 'port' => $this->port,
- 'path' => $this->path,
- 'registerProcedure' => $this->funct,
- 'protocol' => $this->protocol);
+ // Dipping into XMLWriter to avoid a full end element (</cloud>).
- // Dipping into XMLWriter to avoid a full end element (</cloud>).
+ $action->xw->startElement('cloud');
+ foreach ($attrs as $name => $value) {
+ $action->xw->writeAttribute($name, $value);
+ }
- $action->xw->startElement('cloud');
- foreach ($attrs as $name => $value) {
- $action->xw->writeAttribute($name, $value);
+ $action->xw->endElement();
}
- $action->xw->endElement('cloud');
+ }
+ /**
+ * 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
+ */
+
+ function onStartEnqueueNotice($notice, &$transports)
+ {
+ array_push($transports, 'rsscloud');
+ return true;
}
- function onEndNoticeSave($notice){
+ /**
+ * Determine whether the notice was locally created
+ *
+ * @param Notice $notice the notice in question
+ *
+ * @return boolean locality
+ */
- common_debug("RSSCloudPlugin oneEndNoticeSave()");
+ function _isLocal($notice)
+ {
+ return ($notice->is_local == Notice::LOCAL_PUBLIC ||
+ $notice->is_local == Notice::LOCAL_NONPUBLIC);
+ }
- $user = User::staticGet('id', $notice->profile_id);
- $feed = common_local_url('api', array('apiaction' => 'statuses',
- 'method' => 'user_timeline',
- 'argument' => $user->nickname . '.rss'));
+ /**
+ * Create the rsscloud_subscription table if it's not
+ * already in the DB
+ *
+ * @return boolean hook return
+ */
- // XXX: Dave's hub for testing
+ function onCheckSchema()
+ {
+ $schema = Schema::get();
+ $schema->ensureTable('rsscloud_subscription',
+ array(new ColumnDef('subscribed', 'integer',
+ null, false, 'PRI'),
+ new ColumnDef('url', 'varchar',
+ '255', false, 'PRI'),
+ new ColumnDef('failures', 'integer',
+ null, false, null, 0),
+ new ColumnDef('created', 'datetime',
+ null, false),
+ new ColumnDef('modified', 'timestamp',
+ null, false, null,
+ 'CURRENT_TIMESTAMP',
+ 'on update CURRENT_TIMESTAMP')
+ ));
+ return true;
+ }
- $endpoint = 'http://rpc.rsscloud.org:5337/rsscloud/ping';
+ /**
+ * Register RSSCloud notice queue handler
+ *
+ * @param QueueManager $manager
+ *
+ * @return boolean hook return
+ */
+ function onEndInitializeQueueManager($manager)
+ {
+ $manager->connect('rsscloud', 'RSSCloudQueueHandler');
+ return true;
+ }
- $notifier = new RSSCloudNotifier();
- $notifier->postUpdate($endpoint, $feed);
+ function onPluginVersion(&$versions)
+ {
+ $versions[] = array('name' => 'RSSCloud',
+ 'version' => RSSCLOUDPLUGIN_VERSION,
+ 'author' => 'Zach Copley',
+ 'homepage' => 'http://status.net/wiki/Plugin:RSSCloud',
+ 'rawdescription' =>
+ _m('The RSSCloud plugin enables your StatusNet instance to publish ' .
+ 'real-time updates for profile RSS feeds using the ' .
+ '<a href="http://rsscloud.org/">RSSCloud protocol</a>".'));
+
+ return true;
}
}