]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/activitycontext.php
Avoid having to check for notices without rendered copies in upgrade.php
[quix0rs-gnu-social.git] / lib / activitycontext.php
index 09a457924963a22d3bb3bafeaf34c67a2ce00d2a..32f15c1e9f963d8afa48d4e852b2067fafce2a44 100644 (file)
@@ -37,25 +37,34 @@ class ActivityContext
     public $replyToID;
     public $replyToUrl;
     public $location;
-    public $attention = array();
+    public $attention = array();    // 'uri' => 'type'
     public $conversation;
+    public $scope;
 
     const THR     = 'http://purl.org/syndication/thread/1.0';
     const GEORSS  = 'http://www.georss.org/georss';
     const OSTATUS = 'http://ostatus.org/schema/1.0';
 
-    const INREPLYTO = 'in-reply-to';
-    const REF       = 'ref';
-    const HREF      = 'href';
+    const INREPLYTO  = 'in-reply-to';
+    const REF        = 'ref';
+    const HREF       = 'href';
+
+    // OStatus element names with prefixes
+    const OBJECTTYPE = 'ostatus:object-type';   // FIXME: Undocumented!
+    const CONVERSATION = 'ostatus:conversation';
 
     const POINT     = 'point';
 
-    const ATTENTION    = 'ostatus:attention';
     const MENTIONED    = 'mentioned';
-    const CONVERSATION = 'ostatus:conversation';
 
-    function __construct($element)
+    const ATTN_PUBLIC  = 'http://activityschema.org/collection/public';
+
+    function __construct($element = null)
     {
+        if (empty($element)) {
+            return;
+        }
+
         $replyToEl = ActivityUtils::child($element, self::INREPLYTO, self::THR);
 
         if (!empty($replyToEl)) {
@@ -65,28 +74,28 @@ class ActivityContext
 
         $this->location = $this->getLocation($element);
 
-        $this->conversation = ActivityUtils::getLink($element, self::CONVERSATION);
+        $convs = $element->getElementsByTagNameNS(self::OSTATUS, self::CONVERSATION);
+        foreach ($convs as $conv) {
+            $this->conversation = $conv->textContent;
+        }
+        if (empty($this->conversation)) {
+            // fallback to the atom:link rel="ostatus:conversation" element
+            $this->conversation = ActivityUtils::getLink($element, self::CONVERSATION);
+        }
 
         // Multiple attention links allowed
 
         $links = $element->getElementsByTagNameNS(ActivityUtils::ATOM, ActivityUtils::LINK);
 
-        $attention = array();
         for ($i = 0; $i < $links->length; $i++) {
-
             $link = $links->item($i);
 
-            $linkRel = $link->getAttribute(ActivityUtils::REL);
-
-            // XXX: Deprecate this in favour of "mentioned" from Salmon spec
-            // http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html#SALR
-            if ($linkRel == self::ATTENTION) {
-                $attention[] = $link->getAttribute(self::HREF);
-            } elseif ($linkRel == self::MENTIONED) {
-                $attention[] = $link->getAttribute(self::HREF);
+            $linkRel  = $link->getAttribute(ActivityUtils::REL);
+            $linkHref = $link->getAttribute(self::HREF);
+            if ($linkRel == self::MENTIONED && $linkHref !== '') {
+                $this->attention[$linkHref] = $link->getAttribute(ActivityContext::OBJECTTYPE);
             }
         }
-        $this->attention = array_unique($attention);
     }
 
     /**
@@ -125,4 +134,77 @@ class ActivityContext
         common_log(LOG_ERR, "Ignoring bogus georss:point value $point");
         return null;
     }
+
+    /**
+     * Returns context (StatusNet stuff) as an array suitable for serializing
+     * in JSON. Right now context stuff is an extension to Activity.
+     *
+     * @return array the context
+     */
+
+    function asArray()
+    {
+        $context = array();
+
+        $context['inReplyTo']    = $this->getInReplyToArray();
+        $context['conversation'] = $this->conversation;
+
+        return array_filter($context);
+    }
+
+    /**
+     * Returns an array of arrays representing Activity Objects (intended to be
+     * serialized in JSON) that represent WHO the Activity is supposed to
+     * be received by. This is not really specified but appears in an example
+     * of the current spec as an extension. We might want to figure out a JSON
+     * serialization for OStatus and use that to express mentions instead.
+     *
+     * XXX: People's ideas on how to do this are all over the place
+     *
+     * @return array the array of recipients
+     */
+
+    function getToArray()
+    {
+        $tos = array();
+
+        foreach ($this->attention as $attnUrl => $attnType) {
+            $to = array(
+                'objectType' => $attnType,  // can be empty
+                'id'         => $attnUrl,
+            );
+            $tos[] = $to;
+        }
+
+        return $tos;
+    }
+
+    /**
+     * Return an array for the notices this notice is a reply to 
+     * suitable for serializing as JSON note objects.
+     *
+     * @return array the array of notes
+     */
+
+     function getInReplyToArray()
+     {
+         if (empty($this->replyToID) && empty($this->replyToUrl)) {
+             return null;
+         }
+
+         $replyToObj = array('objectType' => 'note');
+
+         // XXX: Possibly shorten this to just the numeric ID?
+         //      Currently, it's the full URI of the notice.
+         if (!empty($this->replyToID)) {
+             $replyToObj['id'] = $this->replyToID;
+         }
+         if (!empty($this->replyToUrl)) {
+             $replyToObj['url'] = $this->replyToUrl;
+         }
+
+         return $replyToObj;
+     }
+
 }
+