]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/Notice.php
[OStatus] Wrong exception was being caught
[quix0rs-gnu-social.git] / classes / Notice.php
index d5a0e5f6d2588448dc5c775048300e23a9096b41..b70dd97dc36f7bf8b05521607e9addc899496f17 100644 (file)
@@ -320,6 +320,21 @@ class Notice extends Managed_DataObject
         }
     }
 
+    public function getSelfLink()
+    {
+        if ($this->isLocal()) {
+            return common_local_url('ApiStatusesShow', array('id' => $this->getID(), 'format' => 'atom'));
+        }
+
+        $selfLink = $this->getPref('ostatus', 'self');
+
+        if (!common_valid_http_url($selfLink)) {
+            throw new InvalidUrlException($selfLink);
+        }
+
+        return $selfLink;
+    }
+
     public function getObjectType($canonical=false) {
         if (is_null($this->object_type) || $this->object_type==='') {
             throw new NoObjectTypeException($this);
@@ -442,6 +457,7 @@ class Notice extends Managed_DataObject
     static function saveNew($profile_id, $content, $source, array $options=null) {
         $defaults = array('uri' => null,
                           'url' => null,
+                          'self' => null,
                           'conversation' => null,   // URI of conversation
                           'reply_to' => null,       // This will override convo URI if the parent is known
                           'repeat_of' => null,      // This will override convo URI if the repeated notice is known
@@ -624,8 +640,13 @@ class Notice extends Managed_DataObject
                 } else {
                     // Conversation entry with specified URI was not found, so we must create it.
                     common_debug('Conversation URI not found, so we will create it with the URI given in the options to Notice::saveNew: '.$options['conversation']);
+                    $convctx = new ActivityContext();
+                    $convctx->conversation = $options['conversation'];
+                    if (array_key_exists('conversation_url', $options)) {
+                        $convctx->conversation_url = $options['conversation_url'];
+                    }
                     // The insert in Conversation::create throws exception on failure
-                    $conv = Conversation::create($options['conversation'], $notice->created);
+                    $conv = Conversation::create($convctx, $notice->created);
                 }
                 $notice->conversation = $conv->getID();
                 unset($conv);
@@ -706,6 +727,10 @@ class Notice extends Managed_DataObject
             }
         }
 
+        if ($self && common_valid_http_url($self)) {
+            $notice->setPref('ostatus', 'self', $self);
+        }
+
         // Only save 'attention' and metadata stuff (URLs, tags...) stuff if
         // the activityverb is a POST (since stuff like repeat, favorite etc.
         // reasonably handle notifications themselves.
@@ -765,6 +790,9 @@ class Notice extends Managed_DataObject
             // implied object
             $options['uri'] = $act->id;
             $options['url'] = $act->link;
+            if ($act->selfLink) {
+                $options['self'] = $act->selfLink;
+            }
         } else {
             $actobj = count($act->objects)===1 ? $act->objects[0] : null;
             if (!is_null($actobj) && !empty($actobj->id)) {
@@ -775,6 +803,9 @@ class Notice extends Managed_DataObject
                     $options['url'] = $actobj->id;
                 }
             }
+            if ($actobj->selfLink) {
+                $options['self'] = $actobj->selfLink;
+            }
         }
 
         $defaults = array(
@@ -784,6 +815,7 @@ class Notice extends Managed_DataObject
                           'reply_to' => null,
                           'repeat_of' => null,
                           'scope' => null,
+                          'self' => null,
                           'source' => 'unknown',
                           'tags' => array(),
                           'uri' => null,
@@ -921,7 +953,7 @@ class Notice extends Managed_DataObject
                     // Conversation entry with specified URI was not found, so we must create it.
                     common_debug('Conversation URI not found, so we will create it with the URI given in the context of the activity: '.$act->context->conversation);
                     // The insert in Conversation::create throws exception on failure
-                    $conv = Conversation::create($act->context->conversation, $stored->created);
+                    $conv = Conversation::create($act->context, $stored->created);
                 }
                 $stored->conversation = $conv->getID();
                 unset($conv);
@@ -1020,6 +1052,14 @@ class Notice extends Managed_DataObject
             throw new ServerException('Supposedly saved Notice has no ID.');
         }
 
+        if ($self && common_valid_http_url($self)) {
+            $stored->setPref('ostatus', 'self', $self);
+        }
+
+        if ($self && common_valid_http_url($self)) {
+            $stored->setPref('ostatus', 'self', $self);
+        }
+
         // Only save 'attention' and metadata stuff (URLs, tags...) stuff if
         // the activityverb is a POST (since stuff like repeat, favorite etc.
         // reasonably handle notifications themselves.
@@ -1578,12 +1618,12 @@ class Notice extends Managed_DataObject
 
                 if (common_config('group', 'addtag')) {
                     // we automatically add a tag for every group name, too
-
-                    $tag = Notice_tag::pkeyGet(array('tag' => common_canonical_tag($group->nickname),
-                                                     'notice_id' => $this->id));
+                    common_debug('Adding hashtag matching group nickname: '._ve($group->getNickname()));
+                    $tag = Notice_tag::pkeyGet(array('tag' => common_canonical_tag($group->getNickname()),
+                                                     'notice_id' => $this->getID()));
 
                     if (is_null($tag)) {
-                        $this->saveTag($group->nickname);
+                        $this->saveTag($group->getNickname());
                     }
                 }
 
@@ -1922,9 +1962,11 @@ class Notice extends Managed_DataObject
     /**
      * Convert a notice into an activity for export.
      *
-     * @param Profile $scoped   The currently logged in/scoped profile
+     * @param Profile $scoped The currently logged in/scoped profile
      *
      * @return Activity activity object representing this Notice.
+     * @throws ClientException
+     * @throws ServerException
      */
 
     function asActivity(Profile $scoped=null)
@@ -2008,6 +2050,7 @@ class Notice extends Managed_DataObject
                 $conv = Conversation::getKV('id', $this->conversation);
                 if ($conv instanceof Conversation) {
                     $ctx->conversation = $conv->uri;
+                    $ctx->conversation_url = $conv->url;
                 }
             }
 
@@ -2070,9 +2113,12 @@ class Notice extends Managed_DataObject
                 }
             }
 
+            try {
+                $act->selfLink = $this->getSelfLink();
+            } catch (InvalidUrlException $e) {
+                $act->selfLink = null;
+            }
             if ($this->isLocal()) {
-                $act->selfLink = common_local_url('ApiStatusesShow', array('id' => $this->id,
-                                                                           'format' => 'atom'));
                 $act->editLink = $act->selfLink;
             }
 
@@ -2170,8 +2216,13 @@ class Notice extends Managed_DataObject
             $object->title   = sprintf('New %1$s by %2$s', ActivityObject::canonicalType($object->type), $this->getProfile()->getNickname());
             $object->content = $this->getRendered();
             $object->link    = $this->getUrl();
+            try {
+                $object->selfLink = $this->getSelfLink();
+            } catch (InvalidUrlException $e) {
+                $object->selfLink = null;
+            }
 
-            $object->extra[] = array('status_net', array('notice_id' => $this->id));
+            $object->extra[] = array('statusnet:notice_id', null, $this->id);
 
             Event::handle('EndActivityObjectFromNotice', array($this, &$object));
         }
@@ -3195,4 +3246,27 @@ class Notice extends Managed_DataObject
             }
         }
     }
+
+    public function delPref($namespace, $topic) {
+        return Notice_prefs::setData($this, $namespace, $topic, null);
+    }
+
+    public function getPref($namespace, $topic, $default=null) {
+        // If you want an exception to be thrown, call Notice_prefs::getData directly
+        try {
+            return Notice_prefs::getData($this, $namespace, $topic, $default);
+        } catch (NoResultException $e) {
+            return null;
+        }
+    }
+
+    // The same as getPref but will fall back to common_config value for the same namespace/topic
+    public function getConfigPref($namespace, $topic)
+    {
+        return Notice_prefs::getConfigData($this, $namespace, $topic);
+    }
+
+    public function setPref($namespace, $topic, $data) {
+        return Notice_prefs::setData($this, $namespace, $topic, $data);
+    }
 }