From 72a60d63814188c7e282d678e281070070be5df2 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 28 Aug 2009 14:43:31 -0400 Subject: Added a PubSubHubBub plugin --- plugins/PubSubHubBub/PubSubHubBubPlugin.php | 122 ++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 plugins/PubSubHubBub/PubSubHubBubPlugin.php (limited to 'plugins/PubSubHubBub/PubSubHubBubPlugin.php') diff --git a/plugins/PubSubHubBub/PubSubHubBubPlugin.php b/plugins/PubSubHubBub/PubSubHubBubPlugin.php new file mode 100644 index 000000000..013a234d7 --- /dev/null +++ b/plugins/PubSubHubBub/PubSubHubBubPlugin.php @@ -0,0 +1,122 @@ +. + * + * @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 GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +define('DEFAULT_HUB','http://2pubsubhubbub.appspot.com'); + +require_once(INSTALLDIR.'/plugins/PubSubHubBub/publisher.php'); + +class PubSubHubBubPlugin extends Plugin +{ + private $hub; + + function __construct() + { + parent::__construct(); + } + + function onInitializePlugin(){ + $this->hub = common_config('PubSubHubBub', 'hub'); + if(empty($this->hub)){ + $this->hub = DEFAULT_HUB; + } + } + + function onStartApiAtom($action){ + $action->element('link',array('rel'=>'hub','href'=>$this->hub),null); + } + + function onStartApiRss($action){ + $action->element('atom:link',array('rel'=>'hub','href'=>$this->hub),null); + } + + function onEndNoticeSave($notice){ + $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')); + + //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')); + + //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')); + } + } + + //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')); + } + } + + //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')); + } + } + + /* TODO: when the reply page gets RSS and ATOM feeds, implement this + //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()); + } + } + } +} -- cgit v1.2.3-54-g00ecf