]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/Notice.php
try different ways to get a profile from a feed
[quix0rs-gnu-social.git] / classes / Notice.php
index 73b22d58a030cea41a8afbd67121e755f26954ad..7e524cacd4467ceab100f4e88e5bb7b726a207b5 100644 (file)
@@ -194,6 +194,7 @@ class Notice extends Memcached_DataObject
      */
     static function saveNew($profile_id, $content, $source, $options=null) {
         $defaults = array('uri' => null,
+                          'url' => null,
                           'reply_to' => null,
                           'repeat_of' => null);
 
@@ -256,9 +257,16 @@ class Notice extends Memcached_DataObject
         }
 
         $notice->content = $final;
-        $notice->rendered = common_render_content($final, $notice);
+
+        if (!empty($rendered)) {
+            $notice->rendered = $rendered;
+        } else {
+            $notice->rendered = common_render_content($final, $notice);
+        }
+
         $notice->source = $source;
         $notice->uri = $uri;
+        $notice->url = $url;
 
         // Handle repeat case
 
@@ -309,7 +317,8 @@ class Notice extends Memcached_DataObject
             // the beginning of a new conversation.
 
             if (empty($notice->conversation)) {
-                $notice->conversation = $notice->id;
+                $conv = Conversation::create();
+                $notice->conversation = $conv->id;
                 $changed = true;
             }
 
@@ -331,14 +340,15 @@ class Notice extends Memcached_DataObject
         return $notice;
     }
 
-    function blowOnInsert()
+    function blowOnInsert($conversation = false)
     {
         self::blow('profile:notice_ids:%d', $this->profile_id);
         self::blow('public');
 
-        if ($this->conversation != $this->id) {
-            self::blow('notice:conversation_ids:%d', $this->conversation);
-        }
+        // XXX: Before we were blowing the casche only if the notice id
+        // was not the root of the conversation.  What to do now?
+
+        self::blow('notice:conversation_ids:%d', $this->conversation);
 
         if (!empty($this->repeat_of)) {
             self::blow('notice:repeats:%d', $this->repeat_of);
@@ -679,7 +689,20 @@ class Notice extends Memcached_DataObject
     {
         $ni = $this->whoGets($groups, $recipients);
 
-        Inbox::bulkInsert($this->id, array_keys($ni));
+        $ids = array_keys($ni);
+
+        // We remove the author (if they're a local user),
+        // since we'll have already done this in distribute()
+
+        $i = array_search($this->profile_id, $ids);
+
+        if ($i !== false) {
+            unset($ids[$i]);
+        }
+
+        // Bulk insert
+
+        Inbox::bulkInsert($this->id, $ids);
 
         return;
     }
@@ -997,6 +1020,7 @@ class Notice extends Memcached_DataObject
         $xs->raw($profile->asActivityActor());
 
         $xs->element('link', array('rel' => 'alternate',
+                                   'type' => 'text/html',
                                    'href' => $this->bestUrl()));
 
         $xs->element('id', null, $this->uri);
@@ -1015,28 +1039,29 @@ class Notice extends Memcached_DataObject
             }
         }
 
-        if (!empty($this->conversation)
-            && $this->conversation != $this->id) {
-            $xs->element(
-                'link', array(
-                    'rel' => 'ostatus:conversation',
-                    'href' => common_local_url(
-                        'conversation',
-                        array('id' => $this->conversation)
-                        )
+        if (!empty($this->conversation)) {
+
+            $conv = Conversation::staticGet('id', $this->conversation);
+
+            if (!empty($conv)) {
+                $xs->element(
+                    'link', array(
+                        'rel' => 'ostatus:conversation',
+                        'href' => $conv->uri
                     )
                 );
+            }
         }
 
         $reply_ids = $this->getReplies();
 
         foreach ($reply_ids as $id) {
             $profile = Profile::staticGet('id', $id);
-            if (!empty($profile)) {
+           if (!empty($profile)) {
                 $xs->element(
                     'link', array(
                         'rel' => 'ostatus:attention',
-                        'href' => $profile->getAcctUri()
+                        'href' => $profile->getUri()
                     )
                 );
             }
@@ -1087,6 +1112,38 @@ class Notice extends Memcached_DataObject
         return $xs->getString();
     }
 
+    /**
+     * Returns an XML string fragment with a reference to a notice as an
+     * Activity Streams noun object with the given element type.
+     *
+     * Assumes that 'activity' namespace has been previously defined.
+     *
+     * @param string $element one of 'subject', 'object', 'target'
+     * @return string
+     */
+    function asActivityNoun($element)
+    {
+        $xs = new XMLStringer(true);
+
+        $xs->elementStart('activity:' . $element);
+        $xs->element('activity:object-type',
+                     null,
+                     'http://activitystrea.ms/schema/1.0/note');
+        $xs->element('id',
+                     null,
+                     $this->uri);
+        $xs->element('content',
+                     array('type' => 'text/html'),
+                     $this->rendered);
+        $xs->element('link',
+                     array('type' => 'text/html',
+                           'rel'  => 'alternate',
+                           'href' => $this->bestUrl()));
+        $xs->elementEnd('activity:' . $element);
+
+        return $xs->getString();
+    }
+
     function bestUrl()
     {
         if (!empty($this->url)) {
@@ -1484,6 +1541,14 @@ class Notice extends Memcached_DataObject
 
     function distribute()
     {
+        // We always insert for the author so they don't
+        // have to wait
+
+        $user = User::staticGet('id', $this->profile_id);
+        if (!empty($user)) {
+            Inbox::insertNotice($user->id, $this->id);
+        }
+
         if (common_config('queue', 'inboxes')) {
             // If there's a failure, we want to _force_
             // distribution at this point.