]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/OStatus/actions/usersalmon.php
More modern coding, stuff related to subscriptions
[quix0rs-gnu-social.git] / plugins / OStatus / actions / usersalmon.php
index 5355aeba03fed5b2eca9c762709d3466aae00f4b..550c034e4921f8870a93cfaff178f8d2448bda2a 100644 (file)
@@ -17,9 +17,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-if (!defined('STATUSNET')) {
-    exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 /**
  * @package OStatusPlugin
@@ -27,19 +25,21 @@ if (!defined('STATUSNET')) {
  */
 class UsersalmonAction extends SalmonAction
 {
-    function prepare($args)
+    protected function prepare(array $args=array())
     {
         parent::prepare($args);
 
         $id = $this->trimmed('id');
 
         if (!$id) {
+            // TRANS: Client error displayed trying to perform an action without providing an ID.
             $this->clientError(_m('No ID.'));
         }
 
-        $this->user = User::staticGet('id', $id);
+        $this->user = User::getKV('id', $id);
 
-        if (empty($this->user)) {
+        if (!$this->user instanceof User) {
+            // TRANS: Client error displayed when referring to a non-existing user.
             $this->clientError(_m('No such user.'));
         }
 
@@ -67,42 +67,40 @@ class UsersalmonAction extends SalmonAction
         case ActivityObject::COMMENT:
             break;
         default:
-            throw new ClientException("Can't handle that kind of post.");
+            // TRANS: Client exception thrown when an undefied activity is performed.
+            throw new ClientException(_m('Cannot handle that kind of post.'));
         }
 
         // Notice must either be a) in reply to a notice by this user
-        // or b) to the attention of this user
-        // or c) in reply to a notice to the attention of this user
+        // or b) in reply to a notice to the attention of this user
+        // or c) to the attention of this user
 
         $context = $this->activity->context;
+        $notice = false;
 
         if (!empty($context->replyToID)) {
-            $notice = Notice::staticGet('uri', $context->replyToID);
-            if (empty($notice)) {
-                // TRANS: Client exception.
-                throw new ClientException(_m('In reply to unknown notice.'));
-            }
-            if ($notice->profile_id != $this->user->id &&
-                !in_array($this->user->id, $notice->getReplies())) {
-                // TRANS: Client exception.
-                throw new ClientException(_m('In reply to a notice not by this user and not mentioning this user.'));
-            }
-        } else if (!empty($context->attention)) {
-            if (!in_array($this->user->uri, $context->attention) &&
-                !in_array(common_profile_url($this->user->nickname), $context->attention)) {
-                common_log(LOG_ERR, "{$this->user->uri} not in attention list (".implode(',', $context->attention).")");
-                // TRANS: Client exception.
-                throw new ClientException('To the attention of user(s), not including this one.');
-            }
+            $notice = Notice::getKV('uri', $context->replyToID);
+        }
+
+        if ($notice instanceof Notice &&
+            ($notice->profile_id == $this->user->id ||
+             array_key_exists($this->user->id, $notice->getReplies())))
+        {
+            // In reply to a notice either from or mentioning this user.
+        } else if (!empty($context->attention) &&
+                   (array_key_exists($this->user->uri, $context->attention) ||
+                    array_key_exists($common_profile_url($this->user->nickname),
+                             $context->attention)))
+        {
+            // To the attention of this user.
         } else {
             // TRANS: Client exception.
-            throw new ClientException('Not to anyone in reply to anything.');
+            throw new ClientException(_m('Not to anyone in reply to anything.'));
         }
 
-        $existing = Notice::staticGet('uri', $this->activity->objects[0]->id);
-
-        if (!empty($existing)) {
-            common_log(LOG_ERR, "Not saving notice '{$existing->uri}'; already exists.");
+        $existing = Notice::getKV('uri', $this->activity->objects[0]->id);
+        if ($existing instanceof Notice) {
+            common_log(LOG_ERR, "Not saving notice with duplicate URI '".$existing->getUri()."' (seems it already exists).");
             return;
         }
 
@@ -116,8 +114,8 @@ class UsersalmonAction extends SalmonAction
     function handleFollow()
     {
         $oprofile = $this->ensureProfile();
-        if ($oprofile) {
-            common_log(LOG_INFO, "Setting up subscription from remote {$oprofile->uri} to local {$this->user->nickname}");
+        if ($oprofile instanceof Ostatus_profile) {
+            common_log(LOG_INFO, sprintf('Setting up subscription from remote %s to local %s', $oprofile->getUri(), $this->user->getNickname()));
             Subscription::start($oprofile->localProfile(),
                                 $this->user->getProfile());
         } else {
@@ -134,9 +132,13 @@ class UsersalmonAction extends SalmonAction
     function handleUnfollow()
     {
         $oprofile = $this->ensureProfile();
-        if ($oprofile) {
-            common_log(LOG_INFO, "Canceling subscription from remote {$oprofile->uri} to local {$this->user->nickname}");
-            Subscription::cancel($oprofile->localProfile(), $this->user->getProfile());
+        if ($oprofile instanceof Ostatus_profile) {
+            common_log(LOG_INFO, sprintf('Canceling subscription from remote %s to local %s', $oprofile->getUri(), $this->user->getNickname()));
+            try {
+                Subscription::cancel($oprofile->localProfile(), $this->user->getProfile());
+            } catch (AlreadyFulfilledException $e) {
+                common_debug('Subscription did not exist, so there was nothing to cancel');
+            }
         } else {
             common_log(LOG_ERR, "Can't cancel subscription from remote, didn't find the profile");
         }
@@ -155,9 +157,9 @@ class UsersalmonAction extends SalmonAction
         $old = Fave::pkeyGet(array('user_id' => $profile->id,
                                    'notice_id' => $notice->id));
 
-        if (!empty($old)) {
+        if ($old instanceof Fave) {
             // TRANS: Client exception.
-            throw new ClientException(_('This is already a favorite.'));
+            throw new ClientException(_m('This is already a favorite.'));
         }
 
         if (!Fave::addNew($profile, $notice)) {
@@ -177,26 +179,89 @@ class UsersalmonAction extends SalmonAction
 
         $fave = Fave::pkeyGet(array('user_id' => $profile->id,
                                    'notice_id' => $notice->id));
-        if (empty($fave)) {
+        if (!$fave instanceof Fave) {
             // TRANS: Client exception.
-            throw new ClientException(_('Notice wasn\'t favorited!'));
+            throw new ClientException(_m('Notice was not favorited!'));
         }
 
         $fave->delete();
     }
 
+    function handleTag()
+    {
+        if ($this->activity->target->type == ActivityObject::_LIST) {
+            if ($this->activity->objects[0]->type != ActivityObject::PERSON) {
+                // TRANS: Client exception.
+                throw new ClientException(_m('Not a person object.'));
+            }
+            // this is a peopletag
+            $tagged = User::getKV('uri', $this->activity->objects[0]->id);
+
+            if (!$tagged instanceof User) {
+                // TRANS: Client exception.
+                throw new ClientException(_m('Unidentified profile being listed.'));
+            }
+
+            if ($tagged->id !== $this->user->id) {
+                // TRANS: Client exception.
+                throw new ClientException(_m('This user is not the one being listed.'));
+            }
+
+            // save the list
+            $tagger = $this->ensureProfile();
+            $list   = Ostatus_profile::ensureActivityObjectProfile($this->activity->target);
+
+            $ptag = $list->localPeopletag();
+            $result = Profile_tag::setTag($ptag->tagger, $tagged->id, $ptag->tag);
+            if (!$result) {
+                // TRANS: Client exception.
+                throw new ClientException(_m('The listing could not be saved.'));
+            }
+        }
+    }
+
+    function handleUntag()
+    {
+        if ($this->activity->target->type == ActivityObject::_LIST) {
+            if ($this->activity->objects[0]->type != ActivityObject::PERSON) {
+                // TRANS: Client exception.
+                throw new ClientException(_m('Not a person object.'));
+                return false;
+            }
+            // this is a peopletag
+            $tagged = User::getKV('uri', $this->activity->objects[0]->id);
+
+            if (!$tagged instanceof User) {
+                // TRANS: Client exception.
+                throw new ClientException(_m('Unidentified profile being unlisted.'));
+            }
+
+            if ($tagged->id !== $this->user->id) {
+                // TRANS: Client exception.
+                throw new ClientException(_m('This user is not the one being unlisted.'));
+            }
+
+            // save the list
+            $tagger = $this->ensureProfile();
+            $list   = Ostatus_profile::ensureActivityObjectProfile($this->activity->target);
+
+            $ptag = $list->localPeopletag();
+            $result = Profile_tag::unTag($ptag->tagger, $tagged->id, $ptag->tag);
+
+            if (!$result) {
+                // TRANS: Client exception.
+                throw new ClientException(_m('The listing could not be deleted.'));
+            }
+        }
+    }
+
     /**
      * @param ActivityObject $object
      * @return Notice
      * @throws ClientException on invalid input
      */
-    function getNotice($object)
+    function getNotice(ActivityObject $object)
     {
-        if (!$object) {
-            // TRANS: Client exception.
-            throw new ClientException(_m('Can\'t favorite/unfavorite without an object.'));
-        }
-
         switch ($object->type) {
         case ActivityObject::ARTICLE:
         case ActivityObject::BLOGENTRY:
@@ -206,12 +271,12 @@ class UsersalmonAction extends SalmonAction
             break;
         default:
             // TRANS: Client exception.
-            throw new ClientException(_m('Can\'t handle that kind of object for liking/faving.'));
+            throw new ClientException(_m('Cannot handle that kind of object for liking/faving.'));
         }
 
-        $notice = Notice::staticGet('uri', $object->id);
+        $notice = Notice::getKV('uri', $object->id);
 
-        if (empty($notice)) {
+        if (!$notice instanceof Notice) {
             // TRANS: Client exception. %s is an object ID.
             throw new ClientException(sprintf(_m('Notice with ID %s unknown.'),$object->id));
         }