]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/Share/SharePlugin.php
Merge remote-tracking branch 'upstream/master' into social-master
[quix0rs-gnu-social.git] / plugins / Share / SharePlugin.php
index 582f7d3e2e0de4e2a4b1d893230e59ba97052a97..84174a0440895d597e657d99f014b04bf66e573b 100644 (file)
@@ -40,6 +40,14 @@ class SharePlugin extends ActivityVerbHandlerPlugin
         return array(ActivityVerb::SHARE);
     }
 
+    // Share is a bit special and $act->objects[0] should be an Activity
+    // instead of ActivityObject! Therefore also $act->objects[0]->type is not set.
+    public function isMyActivity(Activity $act) {
+        return (count($act->objects) == 1
+            && ($act->objects[0] instanceof Activity)
+            && $this->isMyVerb($act->verb));
+    }
+
     public function onRouterInitialized(URLMapper $m)
     {
         // Web UI actions
@@ -108,13 +116,7 @@ class SharePlugin extends ActivityVerbHandlerPlugin
             // TODO: Remember to check Deleted_notice!
             // TODO: If a post is shared that we can't retrieve - what to do?
             $other = Ostatus_profile::ensureActivityObjectProfile($shared->actor);
-            $sharedNotice = $other->processActivity($shared, 'push');   // FIXME: push/salmon/what?
-            if (!$sharedNotice instanceof Notice) {
-                // And if we apparently can't get the shared notice, we'll abort the whole thing.
-                // TRANS: Client exception thrown when saving an activity share fails.
-                // TRANS: %s is a share ID.
-                throw new ClientException(sprintf(_m('Failed to save activity %s.'), $sharedUri));
-            }
+            $sharedNotice = Notice::saveActivity($shared, $other->localProfile(), array('source'=>'share'));
         } catch (FeedSubException $e) {
             // Remote feed could not be found or verified, should we
             // transform this into an "RT @user Blah, blah, blah..."?
@@ -122,6 +124,12 @@ class SharePlugin extends ActivityVerbHandlerPlugin
             return false;
         }
 
+        // Setting this here because when the algorithm gets back to
+        // Notice::saveActivity it will update the Notice object.
+        $stored->repeat_of = $sharedNotice->getID();
+        $stored->conversation = $sharedNotice->conversation;
+        $stored->object_type = ActivityUtils::resolveUri(ActivityObject::ACTIVITY, true);
+
         // We don't have to save a repeat in a separate table, we can
         // find repeats by just looking at the notice.repeat_of field.
 
@@ -147,7 +155,7 @@ class SharePlugin extends ActivityVerbHandlerPlugin
     public function extendActivity(Notice $stored, Activity $act, Profile $scoped=null)
     {
         // TODO: How to handle repeats of deleted notices?
-        $target = Notice::getById($stored->repeat_of);
+        $target = Notice::getByID($stored->repeat_of);
         // TRANS: A repeat activity's title. %1$s is repeater's nickname
         //        and %2$s is the repeated user's nickname.
         $act->title = sprintf(_('%1$s repeated a notice by %2$s'),
@@ -156,14 +164,15 @@ class SharePlugin extends ActivityVerbHandlerPlugin
         $act->objects[] = $target->asActivity($scoped);
     }
 
-    public function activityObjectFromNotice(Notice $notice)
+    public function activityObjectFromNotice(Notice $stored)
     {
         // Repeat is a little bit special. As it's an activity, our
         // ActivityObject is instead turned into an Activity
         $object          = new Activity();
+        $object->actor   = $stored->getProfile()->asActivityObject();
         $object->verb    = ActivityVerb::SHARE;
-        $object->content = $notice->rendered;
-        $this->extendActivity($stored, $act);
+        $object->content = $stored->rendered;
+        $this->extendActivity($stored, $object);
 
         return $object;
     }
@@ -176,6 +185,31 @@ class SharePlugin extends ActivityVerbHandlerPlugin
 
     // Layout stuff
 
+    /**
+     * show a link to the author of repeat
+     *
+     * FIXME: Some repeat stuff still in lib/noticelistitem.php! ($nli->repeat etc.)
+     */
+    public function onEndShowNoticeInfo(NoticeListItem $nli)
+    {
+        if (!empty($nli->repeat)) {
+            $repeater = $nli->repeat->getProfile();
+
+            $attrs = array('href' => $repeater->getUrl(),
+                           'class' => 'h-card p-author',
+                           'title' => $repeater->getFancyName());
+
+            $nli->out->elementStart('span', 'repeat');
+
+            // TRANS: Addition in notice list item if notice was repeated. Followed by a span with a nickname.
+            $nli->out->raw(_('Repeated by').' ');
+
+            $nli->out->element('a', $attrs, $repeater->getNickname());
+
+            $nli->out->elementEnd('span');
+        }
+    }
+
     public function onEndShowThreadedNoticeTailItems(NoticeListItem $nli, Notice $notice, &$threadActive)
     {
         if ($nli instanceof ThreadedNoticeListSubItem) {
@@ -197,8 +231,9 @@ class SharePlugin extends ActivityVerbHandlerPlugin
     public function onEndShowNoticeOptionItems($nli)
     {
         // FIXME: Use bitmasks (but be aware that PUBLIC_SCOPE is 0!)
-        if ($nli->notice->scope == Notice::PUBLIC_SCOPE ||
-                $nli->notice->scope == Notice::SITE_SCOPE) {
+        // Also: AHHH, $scope and $scoped are scarily similar looking.
+        $scope = $nli->notice->getScope();
+        if ($scope === Notice::PUBLIC_SCOPE || $scope === Notice::SITE_SCOPE) {
             $scoped = Profile::current();
             if ($scoped instanceof Profile &&
                     $scoped->getID() !== $nli->notice->getProfile()->getID()) {
@@ -217,7 +252,7 @@ class SharePlugin extends ActivityVerbHandlerPlugin
         }
     }
 
-    public function showNoticeListItem(NoticeListItem $nli)
+    protected function showNoticeListItem(NoticeListItem $nli)
     {
         // pass
     }
@@ -230,6 +265,35 @@ class SharePlugin extends ActivityVerbHandlerPlugin
         // pass
     }
 
+    // API stuff
+
+    /**
+     * Typically just used to fill out Twitter-compatible API status data.
+     *
+     * FIXME: Make all the calls before this end up with a Notice instead of ArrayWrapper please...
+     */
+    public function onNoticeSimpleStatusArray($notice, array &$status, Profile $scoped=null, array $args=array())
+    {
+        $status['repeated'] = $scoped instanceof Profile
+                            ? $scoped->hasRepeated($notice)
+                            : false;
+
+        if ($status['repeated'] === true) {
+            // Qvitter API wants the "repeated_id" value set too.
+            $repeated = Notice::pkeyGet(array('profile_id' => $scoped->getID(),
+                                              'repeat_of' => $notice->getID(),
+                                              'verb' => ActivityVerb::SHARE));
+            $status['repeated_id'] = $repeated->getID();
+        }
+    }
+
+    public function onTwitterUserArray(Profile $profile, array &$userdata, Profile $scoped=null, array $args=array())
+    {
+        $userdata['favourites_count'] = Fave::countByProfile($profile);
+    }
+
+    // Command stuff
+
     /**
      * EndInterpretCommand for RepeatPlugin will handle the 'repeat' command
      * using the class RepeatCommand.