X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FPubSubHubBub%2FPubSubHubBubPlugin.php;h=a880dc8666f5bc2b2f912917bcd9d66d90f72b2e;hb=9fadf8da1164d620284917b829329e195aa2a226;hp=e1e82e352c58e56ed704387daf490e78be6a639f;hpb=f719720e8ad3b09d664e33172bafef2b0fb91eea;p=quix0rs-gnu-social.git diff --git a/plugins/PubSubHubBub/PubSubHubBubPlugin.php b/plugins/PubSubHubBub/PubSubHubBubPlugin.php index e1e82e352c..a880dc8666 100644 --- a/plugins/PubSubHubBub/PubSubHubBubPlugin.php +++ b/plugins/PubSubHubBub/PubSubHubBubPlugin.php @@ -31,92 +31,255 @@ if (!defined('STATUSNET')) { exit(1); } -define('DEFAULT_HUB','http://pubsubhubbub.appspot.com'); +define('DEFAULT_HUB', 'http://pubsubhubbub.appspot.com'); -require_once(INSTALLDIR.'/plugins/PubSubHubBub/publisher.php'); +require_once INSTALLDIR.'/plugins/PubSubHubBub/publisher.php'; + +/** + * Plugin to provide publisher side of PubSubHubBub (PuSH) + * relationship. + * + * PuSH is a real-time or near-real-time protocol for Atom + * and RSS feeds. More information here: + * + * http://code.google.com/p/pubsubhubbub/ + * + * To enable, add the following line to your config.php: + * + * addPlugin('PubSubHubBub'); + * + * This will use the Google default hub. If you'd like to use + * another, try: + * + * addPlugin('PubSubHubBub', + * array('hub' => 'http://yourhub.example.net/')); + * + * @category Plugin + * @package StatusNet + * @author Craig Andrews + * @copyright 2009 Craig Andrews http://candrews.integralblue.com + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ class PubSubHubBubPlugin extends Plugin { - private $hub; + /** + * URL of the hub to advertise and publish to. + */ + + public $hub = DEFAULT_HUB; + + /** + * Default constructor. + */ function __construct() { parent::__construct(); } - function onInitializePlugin(){ - $this->hub = common_config('PubSubHubBub', 'hub'); - if(empty($this->hub)){ - $this->hub = DEFAULT_HUB; + /** + * Check if plugin should be active; may be mass-enabled. + * @return boolean + */ + + function enabled() + { + if (common_config('site', 'private')) { + // PuSH relies on public feeds + return false; } + // @fixme check for being on a private network? + return true; } - function onStartApiAtom($action){ - $action->element('link',array('rel'=>'hub','href'=>$this->hub),null); + /** + * Hooks the StartApiAtom event + * + * Adds the necessary bits to advertise PubSubHubBub + * for the Atom feed. + * + * @param Action $action The API action being shown. + * + * @return boolean hook value + */ + + function onStartApiAtom($action) + { + if ($this->enabled()) { + $action->element('link', array('rel' => 'hub', 'href' => $this->hub), null); + } + return true; } - function onStartApiRss($action){ - $action->element('atom:link',array('rel'=>'hub','href'=>$this->hub),null); + /** + * Hooks the StartApiRss event + * + * Adds the necessary bits to advertise PubSubHubBub + * for the RSS 2.0 feeds. + * + * @param Action $action The API action being shown. + * + * @return boolean hook value + */ + + function onStartApiRss($action) + { + if ($this->enabled()) { + $action->element('atom:link', array('rel' => 'hub', + 'href' => $this->hub), + null); + } + return true; } - function onHandleQueuedNotice($notice){ + /** + * Hook for a queued notice. + * + * When a notice has been queued, will ping the + * PuSH hub for each Atom and RSS feed in which + * the notice appears. + * + * @param Notice $notice The notice that's been queued + * + * @return boolean hook value + */ + + function onHandleQueuedNotice($notice) + { + if (!$this->enabled()) { + return false; + } $publisher = new Publisher($this->hub); $feeds = array(); //public timeline feeds - $feeds[]=common_local_url('api',array('apiaction' => 'statuses','method' => 'public_timeline.rss')); - $feeds[]=common_local_url('api',array('apiaction' => 'statuses','method' => 'public_timeline.atom')); + $feeds[] = common_local_url('ApiTimelinePublic', array('format' => 'rss')); + $feeds[] = common_local_url('ApiTimelinePublic', array('format' => 'atom')); //author's own feeds - $user = User::staticGet('id',$notice->profile_id); - $feeds[]=common_local_url('api',array('apiaction' => 'statuses','method' => 'user_timeline','argument' => $user->nickname.'.rss')); - $feeds[]=common_local_url('api',array('apiaction' => 'statuses','method' => 'user_timeline','argument' => $user->nickname.'.atom')); + $user = User::staticGet('id', $notice->profile_id); + + $feeds[] = common_local_url('ApiTimelineUser', + array('id' => $user->nickname, + 'format' => 'rss')); + $feeds[] = common_local_url('ApiTimelineUser', + array('id' => $user->nickname, + 'format' => 'atom')); //tag feeds $tag = new Notice_tag(); + $tag->notice_id = $notice->id; if ($tag->find()) { while ($tag->fetch()) { - $feeds[]=common_local_url('api',array('apiaction' => 'tags','method' => 'timeline', 'argument'=>$tag->tag.'.atom')); - $feeds[]=common_local_url('api',array('apiaction' => 'tags','method' => 'timeline', 'argument'=>$tag->tag.'.rss')); + $feeds[] = common_local_url('ApiTimelineTag', + array('tag' => $tag->tag, + 'format' => 'rss')); + $feeds[] = common_local_url('ApiTimelineTag', + array('tag' => $tag->tag, + 'format' => 'atom')); } } //group feeds $group_inbox = new Group_inbox(); + $group_inbox->notice_id = $notice->id; if ($group_inbox->find()) { while ($group_inbox->fetch()) { - $group = User_group::staticGet('id',$group_inbox->group_id); - $feeds[]=common_local_url('api',array('apiaction' => 'groups','method' => 'timeline','argument' => $group->nickname.'.rss')); - $feeds[]=common_local_url('api',array('apiaction' => 'groups','method' => 'timeline','argument' => $group->nickname.'.atom')); + $group = User_group::staticGet('id', $group_inbox->group_id); + + $feeds[] = common_local_url('ApiTimelineGroup', + array('id' => $group->nickname, + 'format' => 'rss')); + $feeds[] = common_local_url('ApiTimelineGroup', + array('id' => $group->nickname, + 'format' => 'atom')); } } //feed of each user that subscribes to the notice's author - $notice_inbox = new Notice_inbox(); - $notice_inbox->notice_id = $notice->id; - if ($notice_inbox->find()) { - while ($notice_inbox->fetch()) { - $user = User::staticGet('id',$notice_inbox->user_id); - $feeds[]=common_local_url('api',array('apiaction' => 'statuses','method' => 'user_timeline','argument' => $user->nickname.'.rss')); - $feeds[]=common_local_url('api',array('apiaction' => 'statuses','method' => 'user_timeline','argument' => $user->nickname.'.atom')); + + $ni = $notice->whoGets(); + + foreach (array_keys($ni) as $user_id) { + $user = User::staticGet('id', $user_id); + if (empty($user)) { + continue; } + $feeds[] = common_local_url('ApiTimelineFriends', + array('id' => $user->nickname, + 'format' => 'rss')); + $feeds[] = common_local_url('ApiTimelineFriends', + array('id' => $user->nickname, + 'format' => 'atom')); } - /* TODO: when the reply page gets RSS and ATOM feeds, implement this + $replies = $notice->getReplies(); + //feed of user replied to - if($notice->reply_to){ - $user = User::staticGet('id',$notice->reply_to); - $feeds[]=common_local_url('api',array('apiaction' => 'statuses','method' => 'user_timeline','argument' => $user->nickname.'.rss')); - $feeds[]=common_local_url('api',array('apiaction' => 'statuses','method' => 'user_timeline','argument' => $user->nickname.'.atom')); - }*/ - - foreach(array_unique($feeds) as $feed){ - if(! $publisher->publish_update($feed)){ - common_log_line(LOG_WARNING,$feed.' was not published to hub at '.$this->hub.':'.$publisher->last_response()); + foreach ($replies as $recipient) { + $user = User::staticGet('id', $recipient); + if (!empty($user)) { + $feeds[] = common_local_url('ApiTimelineMentions', + array('id' => $user->nickname, + 'format' => 'rss')); + $feeds[] = common_local_url('ApiTimelineMentions', + array('id' => $user->nickname, + 'format' => 'atom')); } } + $feeds = array_unique($feeds); + + ob_start(); + $ok = $publisher->publish_update($feeds); + $push_last_response = ob_get_clean(); + + if (!$ok) { + common_log(LOG_WARNING, + 'Failure publishing ' . count($feeds) . ' feeds to hub at '. + $this->hub.': '.$push_last_response); + } else { + common_log(LOG_INFO, + 'Published ' . count($feeds) . ' feeds to hub at '. + $this->hub.': '.$push_last_response); + } + + return true; + } + + /** + * Provide version information + * + * Adds this plugin's version data to the global + * version array, for e.g. displaying on the version page. + * + * @param array &$versions array of array of versions + * + * @return boolean hook value + */ + + function onPluginVersion(&$versions) + { + $about = _m('The PubSubHubBub plugin pushes RSS/Atom updates '. + 'to a PubSubHubBub hub.'); + if (!$this->enabled()) { + $about = '' . $about . ' ' . + _m('(inactive on private site)'); + } + $versions[] = array('name' => 'PubSubHubBub', + 'version' => STATUSNET_VERSION, + 'author' => 'Craig Andrews', + 'homepage' => + 'http://status.net/wiki/Plugin:PubSubHubBub', + 'rawdescription' => + $about); + + return true; } }