]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/OStatus/OStatusPlugin.php
Merge branch '0.9.x' into 1.0.x
[quix0rs-gnu-social.git] / plugins / OStatus / OStatusPlugin.php
index c61e2cc5f3984234940b694ea74132ece1d6b9db..e38d52d3d78cc5ef6b16919d754be1b7a75fe21f 100644 (file)
  * @maintainer Brion Vibber <brion@status.net>
  */
 
-if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
+if (!defined('STATUSNET')) {
+    exit(1);
+}
 
 set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/');
 
 class FeedSubException extends Exception
 {
+    function __construct($msg=null)
+    {
+        $type = get_class($this);
+        if ($msg) {
+            parent::__construct("$type: $msg");
+        } else {
+            parent::__construct($type);
+        }
+    }
 }
 
 class OStatusPlugin extends Plugin
@@ -41,8 +52,6 @@ class OStatusPlugin extends Plugin
     function onRouterInitialized($m)
     {
         // Discovery actions
-        $m->connect('.well-known/host-meta',
-                    array('action' => 'hostmeta'));
         $m->connect('main/xrd',
                     array('action' => 'userxrd'));
         $m->connect('main/ownerxrd',
@@ -158,6 +167,9 @@ class OStatusPlugin extends Plugin
 
             // Also, we'll add in the salmon link
             $salmon = common_local_url($salmonAction, array('id' => $id));
+            $feed->addLink($salmon, array('rel' => Salmon::REL_SALMON));
+
+            // XXX: these are deprecated
             $feed->addLink($salmon, array('rel' => Salmon::NS_REPLIES));
             $feed->addLink($salmon, array('rel' => Salmon::NS_MENTIONS));
         }
@@ -211,6 +223,7 @@ class OStatusPlugin extends Plugin
                                     array('nickname' => $profile->nickname));
             $output->element('a', array('href' => $url,
                                         'class' => 'entity_remote_subscribe'),
+                                // TRANS: Link description for link to subscribe to a remote user.
                                 _m('Subscribe'));
 
             $output->elementEnd('li');
@@ -229,23 +242,13 @@ class OStatusPlugin extends Plugin
                                     array('group' => $group->nickname));
             $output->element('a', array('href' => $url,
                                         'class' => 'entity_remote_subscribe'),
+                                // TRANS: Link description for link to join a remote group.
                                 _m('Join'));
         }
 
         return true;
     }
 
-    /**
-     * Check if we've got remote replies to send via Salmon.
-     *
-     * @fixme push webfinger lookup & sending to a background queue
-     * @fixme also detect short-form name for remote subscribees where not ambiguous
-     */
-
-    function onEndNoticeSave($notice)
-    {
-    }
-
     /**
      * Find any explicit remote mentions. Accepted forms:
      *   Webfinger: @user@example.com
@@ -452,6 +455,7 @@ class OStatusPlugin extends Plugin
                 }
 
                 $url = $notice->url;
+                // TRANSLATE: %s is a domain.
                 $title = sprintf(_m("Sent from %s via OStatus"), $domain);
                 return false;
             }
@@ -476,6 +480,24 @@ class OStatusPlugin extends Plugin
         }
     }
 
+    /**
+     * Tell the FeedSub infrastructure whether we have any active OStatus
+     * usage for the feed; if not it'll be able to garbage-collect the
+     * feed subscription.
+     *
+     * @param FeedSub $feedsub
+     * @param integer $count in/out
+     * @return mixed hook return code
+     */
+    function onFeedSubSubscriberCount($feedsub, &$count)
+    {
+        $oprofile = Ostatus_profile::staticGet('feeduri', $feedsub->uri);
+        if ($oprofile) {
+            $count += $oprofile->subscriberCount();
+        }
+        return true;
+    }
+
     /**
      * When about to subscribe to a remote user, start a server-to-server
      * PuSH subscription if needed. If we can't establish that, abort.
@@ -505,6 +527,7 @@ class OStatusPlugin extends Plugin
         }
 
         if (!$oprofile->subscribe()) {
+            // TRANS: Exception.
             throw new Exception(_m('Could not set up remote subscription.'));
         }
     }
@@ -534,23 +557,10 @@ class OStatusPlugin extends Plugin
             return true;
         }
 
-        $act = new Activity();
-
-        $act->verb = ActivityVerb::FOLLOW;
-
-        $act->id   = TagURI::mint('follow:%d:%d:%s',
-                                  $subscriber->id,
-                                  $other->id,
-                                  common_date_iso8601(time()));
+        $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id,
+                                           'subscribed' => $other->id));
 
-        $act->time    = time();
-        $act->title   = _("Follow");
-        $act->content = sprintf(_("%s is now following %s."),
-                               $subscriber->getBestName(),
-                               $other->getBestName());
-
-        $act->actor   = ActivityObject::fromProfile($subscriber);
-        $act->object  = ActivityObject::fromProfile($other);
+        $act = $sub->asActivity();
 
         $oprofile->notifyActivity($act, $subscriber);
 
@@ -592,8 +602,10 @@ class OStatusPlugin extends Plugin
                                   common_date_iso8601(time()));
 
         $act->time    = time();
-        $act->title   = _("Unfollow");
-        $act->content = sprintf(_("%s stopped following %s."),
+        $act->title   = _m('Unfollow');
+        // TRANS: Success message for unsubscribe from user attempt through OStatus.
+        // TRANS: %1$s is the unsubscriber's name, %2$s is the unsubscribed user's name.
+        $act->content = sprintf(_m('%1$s stopped following %2$s.'),
                                $profile->getBestName(),
                                $other->getBestName());
 
@@ -624,6 +636,9 @@ class OStatusPlugin extends Plugin
                 throw new Exception(_m('Could not set up remote group membership.'));
             }
 
+            // NOTE: we don't use Group_member::asActivity() since that record
+            // has not yet been created.
+
             $member = Profile::staticGet($user->id);
 
             $act = new Activity();
@@ -638,7 +653,9 @@ class OStatusPlugin extends Plugin
 
             $act->time = time();
             $act->title = _m("Join");
-            $act->content = sprintf(_m("%s has joined group %s."),
+            // TRANS: Success message for subscribe to group attempt through OStatus.
+            // TRANS: %1$s is the member name, %2$s is the subscribed group's name.
+            $act->content = sprintf(_m('%1$s has joined group %2$s.'),
                                     $member->getBestName(),
                                     $oprofile->getBestName());
 
@@ -646,6 +663,7 @@ class OStatusPlugin extends Plugin
                 return true;
             } else {
                 $oprofile->garbageCollect();
+                // TRANS: Exception.
                 throw new Exception(_m("Failed joining remote group."));
             }
         }
@@ -687,7 +705,9 @@ class OStatusPlugin extends Plugin
 
             $act->time = time();
             $act->title = _m("Leave");
-            $act->content = sprintf(_m("%s has left group %s."),
+            // TRANS: Success message for unsubscribe from group attempt through OStatus.
+            // TRANS: %1$s is the member name, %2$s is the unsubscribed group's name.
+            $act->content = sprintf(_m('%1$s has left group %2$s.'),
                                     $member->getBestName(),
                                     $oprofile->getBestName());
 
@@ -702,7 +722,6 @@ class OStatusPlugin extends Plugin
      * @param Notice $notice being favored
      * @return hook return value
      */
-
     function onEndFavorNotice(Profile $profile, Notice $notice)
     {
         $user = User::staticGet('id', $profile->id);
@@ -717,22 +736,15 @@ class OStatusPlugin extends Plugin
             return true;
         }
 
-        $act = new Activity();
-
-        $act->verb = ActivityVerb::FAVORITE;
-        $act->id   = TagURI::mint('favor:%d:%d:%s',
-                                  $profile->id,
-                                  $notice->id,
-                                  common_date_iso8601(time()));
+        $fav = Fave::pkeyGet(array('user_id' => $user->id,
+                                   'notice_id' => $notice->id));
 
-        $act->time    = time();
-        $act->title   = _("Favor");
-        $act->content = sprintf(_("%s marked notice %s as a favorite."),
-                               $profile->getBestName(),
-                               $notice->uri);
+        if (empty($fav)) {
+            // That's weird.
+            return true;
+        }
 
-        $act->actor   = ActivityObject::fromProfile($profile);
-        $act->object  = ActivityObject::fromNotice($notice);
+        $act = $fav->asActivity();
 
         $oprofile->notifyActivity($act, $profile);
 
@@ -770,8 +782,10 @@ class OStatusPlugin extends Plugin
                                   $notice->id,
                                   common_date_iso8601(time()));
         $act->time    = time();
-        $act->title   = _("Disfavor");
-        $act->content = sprintf(_("%s marked notice %s as no longer a favorite."),
+        $act->title   = _m('Disfavor');
+        // TRANS: Success message for remove a favorite notice through OStatus.
+        // TRANS: %1$s is the unfavoring user's name, %2$s is URI to the no longer favored notice.
+        $act->content = sprintf(_m('%1$s marked notice %2$s as no longer a favorite.'),
                                $profile->getBestName(),
                                $notice->uri);
 
@@ -845,8 +859,9 @@ class OStatusPlugin extends Plugin
             $action->elementStart('p', array('id' => 'entity_remote_subscribe',
                                              'class' => 'entity_subscribe'));
             $action->element('a', array('href' => common_local_url($target),
-                                        'class' => 'entity_remote_subscribe')
-                                , _m('Remote'));
+                                        'class' => 'entity_remote_subscribe'),
+                                // TRANS: Link text for link to remote subscribe.
+                                _m('Remote'));
             $action->elementEnd('p');
             $action->elementEnd('div');
         }
@@ -885,7 +900,10 @@ class OStatusPlugin extends Plugin
                                   $profile->id,
                                   common_date_iso8601(time()));
         $act->time    = time();
+        // TRANS: Title for activity.
         $act->title   = _m("Profile update");
+        // TRANS: Ping text for remote profile update through OStatus.
+        // TRANS: %s is user that updated their profile.
         $act->content = sprintf(_m("%s has updated their profile page."),
                                $profile->getBestName());
 
@@ -915,6 +933,7 @@ class OStatusPlugin extends Plugin
                                         array('nickname' => $profileUser->nickname));
                 $output->element('a', array('href' => $url,
                                             'class' => 'entity_remote_subscribe'),
+                                  // TRANS: Link text for a user to subscribe to an OStatus user.
                                  _m('Subscribe'));
                 $output->elementEnd('li');
             }
@@ -929,15 +948,15 @@ class OStatusPlugin extends Plugin
                             'version' => STATUSNET_VERSION,
                             'author' => 'Evan Prodromou, James Walker, Brion Vibber, Zach Copley',
                             'homepage' => 'http://status.net/wiki/Plugin:OStatus',
-                            'rawdescription' =>
-                            _m('Follow people across social networks that implement '.
+                            // TRANS: Plugin description.
+                            'rawdescription' => _m('Follow people across social networks that implement '.
                                '<a href="http://ostatus.org/">OStatus</a>.'));
 
         return true;
     }
 
     /**
-     * Utility function to check if the given URL is a canonical group profile
+     * Utility function to check if the given URI is a canonical group profile
      * page, and if so return the ID number.
      *
      * @param string $url
@@ -945,12 +964,57 @@ class OStatusPlugin extends Plugin
      */
     public static function localGroupFromUrl($url)
     {
-        $template = common_local_url('groupbyid', array('id' => '31337'));
-        $template = preg_quote($template, '/');
-        $template = str_replace('31337', '(\d+)', $template);
-        if (preg_match("/$template/", $url, $matches)) {
-            return intval($matches[1]);
+        $group = User_group::staticGet('uri', $url);
+        if ($group) {
+            $local = Local_group::staticGet('group_id', $group->id);
+            if ($local) {
+                return $group->id;
+            }
+        } else {
+            // To find local groups which haven't had their uri fields filled out...
+            // If the domain has changed since a subscriber got the URI, it'll
+            // be broken.
+            $template = common_local_url('groupbyid', array('id' => '31337'));
+            $template = preg_quote($template, '/');
+            $template = str_replace('31337', '(\d+)', $template);
+            if (preg_match("/$template/", $url, $matches)) {
+                return intval($matches[1]);
+            }
         }
         return false;
     }
+
+    public function onStartProfileGetAtomFeed($profile, &$feed)
+    {
+        $oprofile = Ostatus_profile::staticGet('profile_id', $profile->id);
+
+        if (empty($oprofile)) {
+            return true;
+        }
+
+        $feed = $oprofile->feeduri;
+        return false;
+    }
+
+    function onStartGetProfileFromURI($uri, &$profile) {
+
+        // XXX: do discovery here instead (OStatus_profile::ensureProfileURI($uri))
+
+        $oprofile = Ostatus_profile::staticGet('uri', $uri);
+
+        if (!empty($oprofile) && !$oprofile->isGroup()) {
+            $profile = $oprofile->localProfile();
+            return false;
+        }
+
+        return true;
+    }
+
+    function onStartHostMetaLinks(&$links) {
+        $url = common_local_url('userxrd');
+        $url.= '?uri={uri}';
+        $links[] = array('rel' => Discovery::LRDD_REL,
+                              'template' => $url,
+                              'title' => array('Resource Descriptor'));
+    }
 }