]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
add ActivityContext class and test it
authorEvan Prodromou <evan@status.net>
Fri, 19 Feb 2010 03:18:14 +0000 (22:18 -0500)
committerEvan Prodromou <evan@status.net>
Fri, 19 Feb 2010 03:18:14 +0000 (22:18 -0500)
plugins/OStatus/actions/salmon.php
plugins/OStatus/classes/Ostatus_profile.php
plugins/OStatus/lib/activity.php
plugins/OStatus/tests/ActivityParseTests.php

index ea5b8e4ea86c43f0fc3372c02ab53c166d346d68..e9d6015f43bf13f5656231d6b0852a550a914cc5 100644 (file)
@@ -71,6 +71,7 @@ class SalmonAction extends Action
     /**
      * @fixme probably call Ostatus_profile::processFeed
      */
+
     function handle($args)
     {
         common_log(LOG_INFO, 'Salmon: incoming post for user '. $this->user->id);
index 1ce8ac4917127a9b2052145fa69d056d99883fca..e0cb467e5e3228b29b9dc3f2f51eabf0909e5abc 100644 (file)
@@ -488,36 +488,6 @@ class Ostatus_profile extends Memcached_DataObject
                                  $params);
     }
 
-    /**
-     * Parse location given as a GeoRSS-simple point, if provided.
-     * http://www.georss.org/simple
-     *
-     * @param feed item $entry
-     * @return mixed Location or false
-     */
-    function getLocation($dom)
-    {
-        $points = $dom->getElementsByTagNameNS('http://www.georss.org/georss', 'point');
-        
-        for ($i = 0; $i < $points->length; $i++) {
-            $point = $points->item(0)->textContent;
-            $point = str_replace(',', ' ', $point); // per spec "treat commas as whitespace"
-            $point = preg_replace('/\s+/', ' ', $point);
-            $point = trim($point);
-            $coords = explode(' ', $point);
-            if (count($coords) == 2) {
-                list($lat, $lon) = $coords;
-                if (is_numeric($lat) && is_numeric($lon)) {
-                    common_log(LOG_INFO, "Looking up location for $lat $lon from georss");
-                    return Location::fromLatLon($lat, $lon);
-                }
-            }
-            common_log(LOG_ERR, "Ignoring bogus georss:point value $point");
-        }
-
-        return false;
-    }
-
     /**
      * @param string $profile_url
      * @return Ostatus_profile
@@ -560,7 +530,7 @@ class Ostatus_profile extends Memcached_DataObject
         // ripped from oauthstore.php (for old OMB client)
         $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
         copy($url, $temp_filename);
-        
+
         // @fixme should we be using different ids?
         $imagefile = new ImageFile($this->id, $temp_filename);
         $filename = Avatar::filename($this->id,
index 3ed613dc7f3f167efa161f268b52df84e17abfbd..5bc8f78e52de2d5a2d32842749b3c24f2a5b831b 100644 (file)
@@ -311,6 +311,87 @@ class ActivityVerb
     const LEAVE      = 'http://ostatus.org/schema/1.0/leave';
 }
 
+class ActivityContext
+{
+    public $replyToID;
+    public $replyToUrl;
+    public $location;
+    public $attention = array();
+    public $conversation;
+
+    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 POINT     = 'point';
+
+    const ATTENTION    = 'ostatus:attention';
+    const CONVERSATION = 'ostatus:conversation';
+
+    function __construct($element)
+    {
+        $replyToEl = ActivityUtils::child($element, self::INREPLYTO, self::THR);
+
+        if (!empty($replyToEl)) {
+            $this->replyToID  = $replyToEl->getAttribute(self::REF);
+            $this->replyToUrl = $replyToEl->getAttribute(self::HREF);
+        }
+
+        $this->location = $this->getLocation($element);
+
+        $this->conversation = ActivityUtils::getLink($element, self::CONVERSATION);
+
+        // Multiple attention links allowed
+
+        $links = $element->getElementsByTagNameNS(ActivityUtils::ATOM, ActivityUtils::LINK);
+
+        for ($i = 0; $i < $links->length; $i++) {
+
+            $link = $links->item($i);
+
+            $linkRel = $link->getAttribute(ActivityUtils::REL);
+
+            if ($linkRel == self::ATTENTION) {
+                $this->attention[] = $link->getAttribute(self::HREF);
+            }
+        }
+    }
+
+    /**
+     * Parse location given as a GeoRSS-simple point, if provided.
+     * http://www.georss.org/simple
+     *
+     * @param feed item $entry
+     * @return mixed Location or false
+     */
+    function getLocation($dom)
+    {
+        $points = $dom->getElementsByTagNameNS(self::GEORSS, self::POINT);
+
+        for ($i = 0; $i < $points->length; $i++) {
+            $point = $points->item($i)->textContent;
+            $point = str_replace(',', ' ', $point); // per spec "treat commas as whitespace"
+            $point = preg_replace('/\s+/', ' ', $point);
+            $point = trim($point);
+            $coords = explode(' ', $point);
+            if (count($coords) == 2) {
+                list($lat, $lon) = $coords;
+                if (is_numeric($lat) && is_numeric($lon)) {
+                    common_log(LOG_INFO, "Looking up location for $lat $lon from georss");
+                    return Location::fromLatLon($lat, $lon);
+                }
+            }
+            common_log(LOG_ERR, "Ignoring bogus georss:point value $point");
+        }
+
+        return null;
+    }
+}
+
 /**
  * An activity in the ActivityStrea.ms world
  *
@@ -426,7 +507,9 @@ class Activity
         $contextEl = $this->_child($entry, self::CONTEXT);
 
         if (!empty($contextEl)) {
-            $this->context = new ActivityObject($contextEl);
+            $this->context = new ActivityContext($contextEl);
+        } else {
+            $this->context = new ActivityContext($entry);
         }
 
         $targetEl = $this->_child($entry, self::TARGET);
index fa8bcdda23c4c528021f2681b83ec04331bb0e7d..35b4b0f9d7dc17287bde9d45ad21d51d1199216c 100644 (file)
@@ -57,12 +57,35 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
         $this->assertEquals($act->object->summary, 'Some text.');
         $this->assertEquals($act->object->link, 'http://example.org/2003/12/13/atom03.html');
 
-        $this->assertTrue(empty($act->context));
+        $this->assertFalse(empty($act->context));
+
         $this->assertTrue(empty($act->target));
 
         $this->assertEquals($act->entry, $entry);
         $this->assertEquals($act->feed, $feed);
     }
+
+    public function testExample4()
+    {
+        global $_example4;
+        $dom = DOMDocument::loadXML($_example4);
+
+        $entry = $dom->documentElement;
+
+        $act = new Activity($entry);
+
+        $this->assertFalse(empty($act));
+        $this->assertEquals(1266547958, $act->time);
+        $this->assertEquals('http://example.net/notice/14', $act->link);
+
+        $this->assertFalse(empty($act->context));
+        $this->assertEquals('http://example.net/notice/12', $act->context->replyToID);
+        $this->assertEquals('http://example.net/notice/12', $act->context->replyToUrl);
+        $this->assertEquals('http://example.net/conversation/11', $act->context->conversation);
+        $this->assertEquals(array('http://example.net/user/1'), $act->context->attention);
+
+        $this->assertFalse(empty($act->actor));
+    }
 }
 
 $_example1 = <<<EXAMPLE1
@@ -145,3 +168,31 @@ $_example3 = <<<EXAMPLE3
 
 </feed>
 EXAMPLE3;
+
+$_example4 = <<<EXAMPLE4
+<?xml version='1.0' encoding='UTF-8'?>
+<entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:ostatus="http://ostatus.org/schema/1.0">
+ <title>@evan now is the time for all good men to come to the aid of their country. #thetime</title>
+ <summary>@evan now is the time for all good men to come to the aid of their country. #thetime</summary>
+<author>
+ <name>spock</name>
+ <uri>http://example.net/user/2</uri>
+</author>
+<activity:actor>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <id>http://example.net/user/2</id>
+ <title>spock</title>
+ <link type="image/png" rel="avatar" href="http://example.net/theme/identica/default-avatar-profile.png"></link>
+</activity:actor>
+ <link rel="alternate" type="text/html" href="http://example.net/notice/14"/>
+ <id>http://example.net/notice/14</id>
+ <published>2010-02-19T02:52:38+00:00</published>
+ <updated>2010-02-19T02:52:38+00:00</updated>
+ <link rel="related" href="http://example.net/notice/12"/>
+ <thr:in-reply-to ref="http://example.net/notice/12" href="http://example.net/notice/12"></thr:in-reply-to>
+ <link rel="ostatus:conversation" href="http://example.net/conversation/11"/>
+ <link rel="ostatus:attention" href="http://example.net/user/1"/>
+ <content type="html">@&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://example.net/user/1&quot; class=&quot;url&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;evan&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; now is the time for all good men to come to the aid of their country. #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://example.net/tag/thetime&quot; rel=&quot;tag&quot;&gt;thetime&lt;/a&gt;&lt;/span&gt;</content>
+ <category term="thetime"></category>
+</entry>
+EXAMPLE4;