]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Working on some RSVP code stuff
authorMikael Nordfeldth <mmn@hethane.se>
Thu, 21 Jan 2016 01:10:34 +0000 (02:10 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Thu, 21 Jan 2016 01:10:34 +0000 (02:10 +0100)
classes/Notice.php
lib/activityhandlerplugin.php
lib/activityutils.php
plugins/ActivityModeration/classes/Deleted_notice.php
plugins/Event/EventPlugin.php
plugins/Event/actions/rsvp.php
plugins/Event/classes/Happening.php
plugins/Event/classes/RSVP.php
plugins/Event/forms/rsvp.php
plugins/Favorite/classes/Fave.php

index 2a387d55399f5fdd7e29db6506344c6ac6872045..bbf543e5a610727f08d67c91a640116525007bce 100644 (file)
@@ -282,6 +282,11 @@ class Notice extends Managed_DataObject
         return ActivityUtils::resolveUri($this->verb, $make_relative);
     }
 
+    public function isVerb(array $verbs)
+    {
+        return ActivityUtils::compareVerbs($this->getVerb(), $verbs);
+    }
+
     /*
      * Get the original representation URL of this notice.
      *
@@ -314,6 +319,15 @@ class Notice extends Managed_DataObject
         return ActivityUtils::resolveUri($this->object_type, $canonical);
     }
 
+    public function isObjectType(array $types)
+    {
+        try {
+            return ActivityUtils::compareTypes($this->getObjectType(), $types);
+        } catch (NoObjectTypeException $e) {
+            return false;
+        }
+    }
+
     public static function getByUri($uri)
     {
         $notice = new Notice();
index b0931987033421f9f40256de5518face8e2b1b38..8f28da85d67bbb42f8f9c9912eb4f42954e14cfc 100644 (file)
@@ -108,6 +108,7 @@ abstract class ActivityHandlerPlugin extends Plugin
     }
 
     function isMyType($type) {
+        // Third argument to compareTypes is true, to allow for notices with empty object_type for example (verb-only)
         return count($this->types())===0 || ActivityUtils::compareTypes($type, $this->types());
     }
 
index 8a2be350225140d6198128ad33d97a42a305c39b..94cf8544b1a476c247f5ca955ee70617965680c7 100644 (file)
@@ -350,7 +350,7 @@ class ActivityUtils
 
     static function compareTypes($type, $objects)
     {
-        $type = self::resolveUri($type);
+        $type = self::resolveUri($type, false);
         foreach ((array)$objects as $object) {
             if ($type === self::resolveUri($object)) {
                 return true;
@@ -367,6 +367,7 @@ class ActivityUtils
     static function resolveUri($uri, $make_relative=false)
     {
         if (empty($uri)) {
+            common_debug(_ve(debug_backtrace()));
             throw new ServerException('No URI to resolve in ActivityUtils::resolveUri');
         }
 
index 76674d9bec63d31dc60dd1f77c9ba10477eae9f0..4ffc0c895fe804f3c9229f986ea6b990aa5dded0 100644 (file)
@@ -78,7 +78,12 @@ class Deleted_notice extends Managed_DataObject
         $act->actor = $actor->asActivityObject();
         $act->target = new ActivityObject();    // We don't save the notice object, as it's supposed to be removed!
         $act->target->id = $notice->getUri();
-        $act->target->type = $notice->getObjectType();
+        try {
+            $act->target->type = $notice->getObjectType();
+        } catch (NoObjectTypeException $e) {
+            // This could be for example an RSVP which is a verb and carries no object-type
+            $act->target->type = null;
+        }
         $act->objects = array(clone($act->target));
 
         $url = $notice->getUrl();
index d22a5e91350e8147d1da960d81e1a7467ae70bec..ed78b156e1f7d20d4427407068bed4d35730dd9c 100644 (file)
@@ -129,6 +129,13 @@ class EventPlugin extends ActivityVerbHandlerPlugin
                      RSVP::POSSIBLE);
     }
 
+    function isMyNotice(Notice $notice) {
+        if (!empty($notice->object_type)) {
+            return parent::isMyNotice($notice);
+        }
+        return $this->isMyVerb($notice->verb);
+    }
+
     public function newFormAction() {
         // such as 'newbookmark' or 'newevent' route
         return 'new'.$this->tag();
@@ -191,57 +198,22 @@ class EventPlugin extends ActivityVerbHandlerPlugin
         $happening = null;
 
         switch (true) {
-        case ActivityUtils::compareVerbs($stored->verb, array(ActivityVerb::POST)) &&
-                ActivityUtils::compareTypes($stored->object_type, array(Happening::OBJECT_TYPE)):
-            $happening = Happening::fromStored($stored);
+        case $stored->isVerb([ActivityVerb::POST]) && $stored->isObjectType([Happening::OBJECT_TYPE]):
+            $obj = Happening::fromStored($stored)->asActivityObject();
             break;
-        // FIXME: Why are these object_type??
-        case ActivityUtils::compareTypes($stored->object_type, array(RSVP::POSITIVE, RSVP::NEGATIVE, RSVP::POSSIBLE)):
-            $rsvp  = RSVP::fromNotice($stored);
-            $happening = $rsvp->getEvent();
+        // isObjectType here is because we had the verb stored in object_type previously for unknown reasons
+        case $stored->isObjectType([RSVP::POSITIVE, RSVP::NEGATIVE, RSVP::POSSIBLE]):
+        case $stored->isVerb([RSVP::POSITIVE, RSVP::NEGATIVE, RSVP::POSSIBLE]):
+            $obj = RSVP::fromStored($stored)->asActivityObject();
             break;
         default:
             // TRANS: Exception thrown when event plugin comes across a unknown object type.
             throw new Exception(_m('Unknown object type.'));
         }
 
-        $obj = new ActivityObject();
-
-        $obj->id      = $happening->getUri();
-        $obj->type    = Happening::OBJECT_TYPE;
-        $obj->title   = $happening->title;
-        $obj->summary = $happening->description;
-        $obj->link    = $happening->getStored()->getUrl();
-
-        $obj->extra[] = array('dtstart',
-                              array('xmlns' => 'urn:ietf:params:xml:ns:xcal'),
-                              common_date_iso8601($happening->start_time));
-        $obj->extra[] = array('dtend',
-                              array('xmlns' => 'urn:ietf:params:xml:ns:xcal'),
-                              common_date_iso8601($happening->end_time));
-        $obj->extra[] = array('location', false, $happening->location);
-        $obj->extra[] = array('url', false, $happening->url);
-
         return $obj;
     }
 
-    /**
-     * Change the verb on RSVP notices
-     *
-     * @param Notice $notice
-     *
-     * @return ActivityObject
-     */
-    protected function extendActivity(Notice $stored, Activity $act, Profile $scoped=null) {
-        switch (true) {
-        // FIXME: Why are these object_type??
-        case ActivityUtils::compareTypes($stored->object_type, array(RSVP::POSITIVE, RSVP::NEGATIVE, RSVP::POSSIBLE)):
-            $act->verb = $stored->object_type;
-            break;
-        }
-        return true;
-    }
-
     /**
      * Form for our app
      *
@@ -253,33 +225,29 @@ class EventPlugin extends ActivityVerbHandlerPlugin
         return new EventForm($out);
     }
 
-    /**
-     * When a notice is deleted, clean up related tables.
-     *
-     * @param Notice $notice
-     */
-    function deleteRelated(Notice $notice)
+    function deleteRelated(Notice $stored)
     {
-        switch ($notice->object_type) {
-        case Happening::OBJECT_TYPE:
+        switch (true) {
+        case $stored->isObjectType([Happening::OBJECT_TYPE]):
             common_log(LOG_DEBUG, "Deleting event from notice...");
             try {
-                $happening = Happening::fromStored($notice);
+                $happening = Happening::fromStored($stored);
                 $happening->delete();
             } catch (NoResultException $e) {
                 // already gone
             }
             break;
-        case RSVP::POSITIVE:
-        case RSVP::NEGATIVE:
-        case RSVP::POSSIBLE:
+        // isObjectType here is because we had the verb stored in object_type previously for unknown reasons
+        case $stored->isObjectType([RSVP::POSITIVE, RSVP::NEGATIVE, RSVP::POSSIBLE]):
+        case $stored->isVerb([RSVP::POSITIVE, RSVP::NEGATIVE, RSVP::POSSIBLE]):
             common_log(LOG_DEBUG, "Deleting rsvp from notice...");
-            $rsvp = RSVP::fromNotice($notice);
-            common_log(LOG_DEBUG, "to delete: $rsvp->id");
-            $rsvp->delete();
+            try {
+                $rsvp = RSVP::fromStored($stored);
+                $rsvp->delete();
+            } catch (NoResultException $e) {
+                // already gone
+            }
             break;
-        default:
-            common_log(LOG_DEBUG, "Not deleting related, wtf...");
         }
     }
 
@@ -442,9 +410,9 @@ class EventPlugin extends ActivityVerbHandlerPlugin
 
     protected function showRSVP(Notice $stored, HTMLOutputter $out, Profile $scoped=null)
     {
-        $rsvp = RSVP::fromNotice($stored);
-
-        if (empty($rsvp)) {
+        try {
+            $rsvp = RSVP::fromStored($stored);
+        } catch (NoResultException $e) {
             // TRANS: Content for a deleted RSVP list item (RSVP stands for "please respond").
             $out->element('p', null, _m('Deleted.'));
             return;
index ec0267a8fba464c31b258983b25df0aa0191114f..59cc07027877f6dc32226d4432eb9f96e6a6cd49 100644 (file)
@@ -54,7 +54,12 @@ class RsvpAction extends FormAction
 
     protected function doPreparation()
     {
-        $this->event = Happening::getByKeys(['uri'=>$this->trimmed('event')]);
+        if ($this->trimmed('notice')) {
+            $stored = Notice::getByID($this->trimmed('notice'));
+            $this->event = Happening::fromStored($stored);
+        } else {
+            $this->event = Happening::getByKeys(['uri'=>$this->trimmed('event')]);
+        }
 
         $this->formOpts['event'] = $this->event;
     }
@@ -86,6 +91,9 @@ class RsvpAction extends FormAction
         $act->objects = array(clone($act->target));
         $act->content = RSVP::toHTML($this->scoped, $this->event, RSVP::codeFor($verb));
 
+        $act->context = new ActivityContext();
+        $act->context->replyToID = $this->event->getUri();
+
         $stored = Notice::saveActivity($act, $this->scoped, $options);
 
         return _m('Saved RSVP');
index cb04c281d96069b7d4967d44c4769003ef2e6370..d74ae081b476141ebbf03c55f16c2a3f0a01895f 100644 (file)
@@ -211,6 +211,9 @@ class Happening extends Managed_DataObject
 
     static function fromStored(Notice $stored)
     {
+        if (!ActivityUtils::compareTypes($stored->getObjectType(), [self::OBJECT_TYPE])) {
+            throw new ServerException('Notice is not of type '.self::OBJECT_TYPE);
+        }
         return self::getByKeys(array('uri'=>$stored->getUri()));
     }
 
@@ -224,4 +227,43 @@ class Happening extends Managed_DataObject
         return RSVP::pkeyGet(array('profile_id' => $profile->getID(),
                                    'event_uri' => $this->getUri()));
     }
+
+    static public function getObjectType()
+    {
+        return self::OBJECT_TYPE;
+    }
+
+    public function asActivityObject()
+    {
+        $actobj = new ActivityObject();
+        $actobj->id = $this->getUri();
+        $actobj->type = self::getObjectType();
+        $actobj->title = $this->title;
+        $actobj->summary = $this->description;
+        $actobj->extra[] = array('dtstart',
+                                array('xmlns' => 'urn:ietf:params:xml:ns:xcal'),
+                                common_date_iso8601($this->start_time));
+        $actobj->extra[] = array('dtend',
+                                array('xmlns' => 'urn:ietf:params:xml:ns:xcal'),
+                                common_date_iso8601($this->end_time));
+        $actobj->extra[] = array('location',
+                                array('xmlns' => 'urn:ietf:params:xml:ns:xcal'),
+                                $this->location);
+        $actobj->extra[] = array('url',
+                                array('xmlns' => 'urn:ietf:params:xml:ns:xcal'),
+                                $this->getUrl());
+
+        /* We don't use these ourselves, but we add them to be nice RSS/XML citizens */
+        $actobj->extra[] = array('startdate',
+                                array('xmlns' => 'http://purl.org/rss/1.0/modules/event/'),
+                                common_date_iso8601($this->start_time));
+        $actobj->extra[] = array('enddate',
+                                array('xmlns' => 'http://purl.org/rss/1.0/modules/event/'),
+                                common_date_iso8601($this->end_time));
+        $actobj->extra[] = array('location',
+                                array('xmlns' => 'http://purl.org/rss/1.0/modules/event/'),
+                                $this->location);
+
+        return $actobj;
+    }
 }
index bda502b8d015392e9153d395ba61db74c6e70b1e..3eba0e95bece65df81bb5f72821caf8febd3d2fd 100644 (file)
@@ -128,6 +128,7 @@ class RSVP extends Managed_DataObject
     static function saveActivityObject(Activity $act, Notice $stored)
     {
         $target = Notice::getByKeys(array('uri'=>$act->target->id));
+        common_debug(_ve('TARGET: '.$target));
         if (!ActivityUtils::compareTypes($target->getObjectType(), [ Happening::OBJECT_TYPE ])) {
             throw new ClientException('RSVP not aimed at a Happening');
         }
@@ -159,6 +160,25 @@ class RSVP extends Managed_DataObject
         return $rsvp;
     }
 
+    static public function getObjectType()
+    {
+        return ActivityObject::ACTIVITY;
+    }
+
+    public function asActivityObject()
+    {
+        $happening = $this->getEvent();
+
+        $actobj = new ActivityObject();
+        $actobj->id = $rsvp->getUri();
+        $actobj->type = self::getObjectType();
+        $actobj->title = $this->asString();
+        $actobj->content = $this->asString();
+        $actobj->target = array($happening->asActivityObject());
+
+        return $actobj;
+    }
+
     static function codeFor($verb)
     {
         switch (true) {
index d4769955abd867d2d48c072105a1acccd546ea41..72cadc0de6557625e9e6730276b267a3543f572a 100644 (file)
@@ -97,7 +97,8 @@ class RSVPForm extends Form
         // TRANS: Field label on form to RSVP ("please respond") for an event.
         $this->out->text(_m('RSVP:'));
 
-        $this->out->hidden('event-id', $this->event->getUri(), 'event');
+        $this->out->hidden('notice', $this->event->getStored()->getID(), 'event');
+        $this->out->hidden('event', $this->event->getUri(), 'event');   // not used
         $this->out->hidden('rsvp', '');
 
         $this->out->elementEnd('fieldset');
index 67726108bbdddd3563a04ebd67a21cbc333ff232..826d34a36c7ee1964c04ac25f400bf47f9a386ca 100644 (file)
@@ -330,7 +330,7 @@ class Fave extends Managed_DataObject
 
     static public function getObjectType()
     {
-        return 'activity';
+        return ActivityObject::ACTIVITY;
     }
 
     public function asActivityObject(Profile $scoped=null)