]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/microappplugin.php
Add urlshortenerplugin2.php to solve some @todo's and adding exceptions
[quix0rs-gnu-social.git] / lib / microappplugin.php
index 1dfc44634fdb2017fa6c55253a62faff2c0c1f32..4da3bef935a7e60c7a6c6da3e00511df18f4c2f3 100644 (file)
@@ -137,21 +137,6 @@ abstract class MicroAppPlugin extends Plugin
      */
     abstract function activityObjectFromNotice($notice);
 
-    /**
-     * Custom HTML output for your special notice; called when a
-     * matching notice turns up in a NoticeListItem.
-     *
-     * All micro-app classes must override this method.
-     *
-     * @param Notice $notice
-     * @param HTMLOutputter $out
-     *
-     * @fixme WARNING WARNING WARNING base plugin stuff below tries to close
-     * a div that this function opens in the BookmarkPlugin child class.
-     * This is probably wrong.
-     */
-    abstract function showNotice($notice, $out);
-
     /**
      * When building the primary notice form, we'll fetch also some
      * alternate forms for specialized types -- that's you!
@@ -177,6 +162,14 @@ abstract class MicroAppPlugin extends Plugin
      */
     abstract function deleteRelated($notice);
 
+    /**
+     *
+     */
+    public function newFormAction() {
+        // such as 'newbookmark' or 'newevent' route
+        return 'new'.$this->tag();
+    }
+
     /**
      * Check if a given notice object should be handled by this micro-app
      * plugin.
@@ -190,7 +183,7 @@ abstract class MicroAppPlugin extends Plugin
      */
     function isMyNotice($notice) {
         $types = $this->types();
-        return in_array($notice->object_type, $types);
+        return ($notice->verb == ActivityVerb::POST) && in_array($notice->object_type, $types);
     }
 
     /**
@@ -208,6 +201,8 @@ abstract class MicroAppPlugin extends Plugin
     function isMyActivity($activity) {
         $types = $this->types();
         return (count($activity->objects) == 1 &&
+                ($activity->objects[0] instanceof ActivityObject) &&
+                ($activity->verb == ActivityVerb::POST) &&
                 in_array($activity->objects[0]->type, $types));
     }
 
@@ -281,6 +276,35 @@ abstract class MicroAppPlugin extends Plugin
             return true;
         }
 
+        $adapter = $this->adaptNoticeListItem($nli);
+
+        if (!empty($adapter)) {
+            $adapter->showNotice();
+            $adapter->showNoticeAttachments();
+            $adapter->showNoticeInfo();
+            $adapter->showNoticeOptions();
+        } else {
+            $this->oldShowNotice($nli);
+        }
+
+        return false;
+    }
+
+    /**
+     * Given a notice list item, returns an adapter specific
+     * to this plugin.
+     *
+     * @param NoticeListItem $nli item to adapt
+     *
+     * @return NoticeListItemAdapter adapter or null
+     */
+    function adaptNoticeListItem($nli)
+    {
+      return null;
+    }
+
+    function oldShowNotice($nli)
+    {
         $out = $nli->out;
         $notice = $nli->notice;
 
@@ -303,8 +327,6 @@ abstract class MicroAppPlugin extends Plugin
         $out->elementEnd('div');
 
         $nli->showNoticeOptions();
-
-        return false;
     }
 
     /**
@@ -333,13 +355,13 @@ abstract class MicroAppPlugin extends Plugin
      *
      * @return boolean hook value
      */
-    function onStartHandleFeedEntryWithProfile($activity, $oprofile)
+    function onStartHandleFeedEntryWithProfile($activity, $oprofile, &$notice)
     {
         if ($this->isMyActivity($activity)) {
 
             $actor = $oprofile->checkAuthorship($activity);
 
-            if (empty($actor)) {
+            if (!$actor instanceof Ostatus_profile) {
                 // TRANS: Client exception thrown when no author for an activity was found.
                 throw new ClientException(_('Cannot get author for activity.'));
             }
@@ -348,11 +370,11 @@ abstract class MicroAppPlugin extends Plugin
 
             $options = array('uri' => $object->id,
                              'url' => $object->link,
-                             'is_local' => Notice::REMOTE_OMB,
+                             'is_local' => Notice::REMOTE,
                              'source' => 'ostatus');
 
             // $actor is an ostatus_profile
-            $this->saveNoticeFromActivity($activity, $actor->localProfile(), $options);
+            $notice = $this->saveNoticeFromActivity($activity, $actor->localProfile(), $options);
 
             return false;
         }
@@ -376,23 +398,23 @@ abstract class MicroAppPlugin extends Plugin
 
             if ($target instanceof User_group) {
                 $uri = $target->getUri();
-                if (!in_array($uri, $activity->context->attention)) {
+                if (!array_key_exists($uri, $activity->context->attention)) {
                     // @todo FIXME: please document (i18n).
-                    // TRANS: Client exception.
-                    throw new ClientException(_('Bookmark not posted to this group.'));
+                    // TRANS: Client exception thrown when ...
+                    throw new ClientException(_('Object not posted to this group.'));
                 }
             } else if ($target instanceof User) {
                 $uri      = $target->uri;
                 $original = null;
                 if (!empty($activity->context->replyToID)) {
-                    $original = Notice::staticGet('uri',
+                    $original = Notice::getKV('uri',
                                                   $activity->context->replyToID);
                 }
-                if (!in_array($uri, $activity->context->attention) &&
+                if (!array_key_exists($uri, $activity->context->attention) &&
                     (empty($original) ||
                      $original->profile_id != $target->id)) {
                     // @todo FIXME: Please document (i18n).
-                    // TRANS: Client exception.
+                    // TRANS: Client exception when ...
                     throw new ClientException(_('Object not posted to this user.'));
                 }
             } else {
@@ -406,7 +428,7 @@ abstract class MicroAppPlugin extends Plugin
 
             $options = array('uri' => $object->id,
                              'url' => $object->link,
-                             'is_local' => Notice::REMOTE_OMB,
+                             'is_local' => Notice::REMOTE,
                              'source' => 'ostatus');
 
             // $actor is an ostatus_profile
@@ -434,9 +456,9 @@ abstract class MicroAppPlugin extends Plugin
             $options = array('source' => 'atompub');
 
             // $user->getProfile() is a Profile
-            $this->saveNoticeFromActivity($activity,
-                                          $user->getProfile(),
-                                          $options);
+            $notice = $this->saveNoticeFromActivity($activity,
+                                                    $user->getProfile(),
+                                                    $options);
 
             return false;
         }
@@ -522,7 +544,9 @@ abstract class MicroAppPlugin extends Plugin
 
     function onStartShowEntryForms(&$tabs)
     {
-        $tabs[$this->tag()] = $this->appTitle();
+        $tabs[$this->tag()] = array('title' => $this->appTitle(),
+                                    'href'  => common_local_url($this->newFormAction()),
+                                   );
         return true;
     }
 
@@ -535,4 +559,10 @@ abstract class MicroAppPlugin extends Plugin
 
         return true;
     }
+
+    function showNotice($notice, $out)
+    {
+        // TRANS: Server exception thrown when a micro app plugin developer has not done his job too well.
+        throw new ServerException(_('You must implement either adaptNoticeListItem() or showNotice().'));
+    }
 }