forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			286 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			286 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * StatusNet, the distributed open-source microblogging tool
 | 
						|
 *
 | 
						|
 * Plugin to push RSS/Atom updates to a PubSubHubBub hub
 | 
						|
 *
 | 
						|
 * 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    Craig Andrews <candrews@integralblue.com>
 | 
						|
 * @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://pubsubhubbub.appspot.com');
 | 
						|
 | 
						|
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 <candrews@integralblue.com>
 | 
						|
 * @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
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * URL of the hub to advertise and publish to.
 | 
						|
     */
 | 
						|
 | 
						|
    public $hub = DEFAULT_HUB;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Default constructor.
 | 
						|
     */
 | 
						|
 | 
						|
    function __construct()
 | 
						|
    {
 | 
						|
        parent::__construct();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 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;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 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;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 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;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 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('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('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('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('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
 | 
						|
 | 
						|
        $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'));
 | 
						|
        }
 | 
						|
 | 
						|
        $replies = $notice->getReplies();
 | 
						|
 | 
						|
        //feed of user replied to
 | 
						|
        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 <a href = "'.
 | 
						|
                    'http://pubsubhubbub.googlecode.com/'.
 | 
						|
                    '">PubSubHubBub</a> hub.');
 | 
						|
        if (!$this->enabled()) {
 | 
						|
            $about = '<span class="disabled" style="color:gray">' . $about . '</span> ' .
 | 
						|
                     _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;
 | 
						|
    }
 | 
						|
}
 |