]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Add support for favor and disfavor notification
authorEvan Prodromou <evan@status.net>
Sun, 21 Feb 2010 00:58:20 +0000 (19:58 -0500)
committerEvan Prodromou <evan@status.net>
Sun, 21 Feb 2010 00:58:20 +0000 (19:58 -0500)
Added support for favoring and disfavoring in OStatusPlugin.

Needed to represent the Notice as an activity:object, so added
some code for that in lib/activity.php.

Also, made some small changes to OStatusPlugin so it handled
having a non-default argument $object correctly.

plugins/OStatus/OStatusPlugin.php
plugins/OStatus/classes/Ostatus_profile.php
plugins/OStatus/lib/activity.php

index 9e6d03177fd56d9f7518e83c5eae94fbb999d783..98e048c14c0c2d2c3e106621b03c636eafaca285 100644 (file)
@@ -255,7 +255,7 @@ class OStatusPlugin extends Plugin
     {
         if ($user instanceof Profile) {
             $profile = $user;
-        } else if ($user instanceof Profile) {
+        } else if ($user instanceof User) {
             $profile = $user->getProfile();
         }
         $oprofile = Ostatus_profile::staticGet('profile_id', $other->id);
@@ -353,30 +353,64 @@ class OStatusPlugin extends Plugin
         // We have a local user subscribing to a remote profile; make the
         // magic happen!
 
-        $oprofile->notify($subscriber, ActivityVerb::FOLLOW);
+        $oprofile->notify($subscriber, ActivityVerb::FOLLOW, $oprofile);
 
         return true;
     }
 
-    function onEndUnsubscribe($subscriber, $other)
+    function onEndFavor($profile, $notice)
     {
-        $user = User::staticGet('id', $subscriber->id);
+        // is the favorer a local user?
+
+        $user = User::staticGet('id', $profile->id);
 
         if (empty($user)) {
             return true;
         }
 
-        $oprofile = Ostatus_profile::staticGet('profile_id', $other->id);
+        // is the author an OStatus remote user?
+
+        $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id);
 
         if (empty($oprofile)) {
             return true;
         }
 
-        // We have a local user subscribing to a remote profile; make the
-        // magic happen!
+        // Local user faved an Ostatus profile's notice; notify them!
+
+        $obj = ActivityObject::fromNotice($notice);
+
+        $oprofile->notify($profile,
+                          ActivityVerb::FAVORITE,
+                          $obj->asString());
+        return true;
+    }
+
+    function onEndDisfavor($profile, $notice)
+    {
+        // is the favorer a local user?
+
+        $user = User::staticGet('id', $profile->id);
+
+        if (empty($user)) {
+            return true;
+        }
+
+        // is the author an OStatus remote user?
+
+        $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id);
+
+        if (empty($oprofile)) {
+            return true;
+        }
+
+        // Local user faved an Ostatus profile's notice; notify them!
 
-        $oprofile->notify($subscriber, ActivityVerb::UNFOLLOW);
+        $obj = ActivityObject::fromNotice($notice);
 
+        $oprofile->notify($profile,
+                          ActivityVerb::UNFAVORITE,
+                          $obj->asString());
         return true;
     }
 }
index 4dd565288696c47559f704188f6bc55b834941fa..5bd899bc46ab38500c02bcb38211184bed0b2390 100644 (file)
@@ -307,7 +307,7 @@ class Ostatus_profile extends Memcached_DataObject
      *
      * @param Profile $actor
      * @param $verb eg Activity::SUBSCRIBE or Activity::JOIN
-     * @param $object object of the action; if null, the remote entity itself is assumed
+     * @param string $object object of the action; if null, the remote entity itself is assumed
      */
     public function notify($actor, $verb, $object=null)
     {
@@ -319,7 +319,7 @@ class Ostatus_profile extends Memcached_DataObject
             throw new ServerException("Invalid actor passed to " . __METHOD__ . ": " . $type);
         }
         if ($object == null) {
-            $object = $this;
+            $object = $this->asActivityNoun('object');
         }
         if ($this->salmonuri) {
             $text = 'update'; // @fixme
@@ -345,7 +345,7 @@ class Ostatus_profile extends Memcached_DataObject
             $entry->element('activity:verb', null, $verb);
             $entry->raw($actor->asAtomAuthor());
             $entry->raw($actor->asActivityActor());
-            $entry->raw($object->asActivityNoun('object'));
+            $entry->raw($object);
             $entry->elementEnd('entry');
 
             $xml = $entry->getString();
index 5bc8f78e52de2d5a2d32842749b3c24f2a5b831b..6d15f85b0d4f70f0763cf6a27d5424dddcf8601c 100644 (file)
@@ -199,7 +199,7 @@ class ActivityObject
     public $link;
     public $source;
 
-    /**
+   /**
      * Constructor
      *
      * This probably needs to be refactored
@@ -209,8 +209,12 @@ class ActivityObject
      * @param DOMElement $element DOM thing to turn into an Activity thing
      */
 
-    function __construct($element)
+    function __construct($element = null)
     {
+        if (empty($element)) {
+            return;
+        }
+
         $this->element = $element;
 
         if ($element->tagName == 'author') {
@@ -279,6 +283,53 @@ class ActivityObject
             }
         }
     }
+
+    static fromNotice($notice)
+    {
+        $object = new ActivityObject();
+
+        $object->type    = ActivityObject::NOTE;
+
+        $object->id      = $notice->uri;
+        $object->title   = $notice->content;
+        $object->content = $notice->rendered;
+        $object->link    = $notice->bestUrl();
+
+        return $object;
+    }
+
+    function asString($tag='activity:object')
+    {
+        $xs = new XMLStringer(true);
+
+        $xs->elementStart($tag);
+
+        $xs->element('activity:object-type', null, $this->type);
+
+        $xs->element(self::ID, null, $this->id);
+
+        if (!empty($this->title)) {
+            $xs->element(self::TITLE, null, $this->title);
+        }
+
+        if (!empty($this->summary)) {
+            $xs->element(self::SUMMARY, null, $this->summary);
+        }
+
+        if (!empty($this->content)) {
+            // XXX: assuming HTML content here
+            $xs->element(self::CONTENT, array('type' => 'html'), $this->content);
+        }
+
+        if (!empty($this->link)) {
+            $xs->element('link', array('rel' => 'alternate', 'type' => 'text/html'),
+                         $this->content);
+        }
+
+        $xs->elementEnd($tag);
+
+        return $xs->getString();
+    }
 }
 
 /**