]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Moving Ostatus_profile processShare to SharePlugin
authorMikael Nordfeldth <mmn@hethane.se>
Thu, 12 Mar 2015 14:47:21 +0000 (15:47 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Thu, 12 Mar 2015 14:47:21 +0000 (15:47 +0100)
lib/activityhandlerplugin.php
plugins/OStatus/classes/Ostatus_profile.php
plugins/Share/SharePlugin.php

index cf4e4f0e220c6e3f15e4afd7d11e119cfa05b43c..f1ea953f44cbe8cb771443a3ccf8a2c8685c373a 100644 (file)
@@ -163,7 +163,8 @@ abstract class ActivityHandlerPlugin extends Plugin
     * @param Notice   $stored       The notice in our database for this certain object
     * @param array $options=array()
     *
-    * @return object    If the verb handling plugin creates an object, it can be returned here.
+    * @return object    If the verb handling plugin creates an object, it can be returned here (otherwise true)
+    * @throws exception On any error.
     */
     protected function saveObjectFromActivity(Activity $activity, Notice $stored, array $options=array())
     {
@@ -186,7 +187,7 @@ abstract class ActivityHandlerPlugin extends Plugin
             // of objects which are returned from saveObjectFromActivity.
             if ($object instanceof Managed_DataObject) {
                 // If the verb handling plugin figured out some more attention URIs, add them here to the
-                // original activity.
+                // original activity. This is only done if a separate object is actually needed to be saved.
                 $act->context->attention = array_merge($act->context->attention, $object->getAttentionArray());
             }
         } catch (Exception $e) {
index ddecc45013d33b7ce68cdae66b26bb1f9a26029d..07c9d1c182a59e38eec64f93c652838db3fa4497 100644 (file)
@@ -513,9 +513,6 @@ class Ostatus_profile extends Managed_DataObject
                     throw new ClientException(_m('Cannot handle that kind of post.'));
                 }
                 break;
-            case ActivityVerb::SHARE:
-                $notice = $this->processShare($activity, $source);
-                break;
             default:
                 common_log(LOG_INFO, "Ignoring activity with unrecognized verb $activity->verb");
             }
@@ -527,214 +524,6 @@ class Ostatus_profile extends Managed_DataObject
         return $notice;
     }
 
-    public function processShare($activity, $method)
-    {
-        $notice = null;
-
-        try {
-            $profile = ActivityUtils::checkAuthorship($activity, $this->localProfile());
-        } catch (ServerException $e) {
-            return null;
-        }
-
-        // The id URI will be used as a unique identifier for the notice,
-        // protecting against duplicate saves. It isn't required to be a URL;
-        // tag: URIs for instance are found in Google Buzz feeds.
-        $dupe = Notice::getKV('uri', $activity->id);
-        if ($dupe instanceof Notice) {
-            common_log(LOG_INFO, "OStatus: ignoring duplicate post: {$activity->id}");
-            return $dupe;
-        }
-
-        if (count($activity->objects) != 1) {
-            // TRANS: Client exception thrown when trying to share multiple activities at once.
-            throw new ClientException(_m('Can only handle share activities with exactly one object.'));
-        }
-
-        $shared = $activity->objects[0];
-
-        if (!$shared instanceof Activity) {
-            // TRANS: Client exception thrown when trying to share a non-activity object.
-            throw new ClientException(_m('Can only handle shared activities.'));
-        }
-
-        $sharedId = $shared->id;
-        if (!empty($shared->objects[0]->id)) {
-            // Because StatusNet since commit 8cc4660 sets $shared->id to a TagURI which
-            // fucks up federation, because the URI is no longer recognised by the origin.
-            // So we set it to the object ID if it exists, otherwise we trust $shared->id
-            $sharedId = $shared->objects[0]->id;
-        }
-        if (empty($sharedId)) {
-            throw new ClientException(_m('Shared activity does not have an id'));
-        }
-
-        // First check if we have the shared activity. This has to be done first, because
-        // we can't use these functions to "ensureActivityObjectProfile" of a local user,
-        // who might be the creator of the shared activity in question.
-        $sharedNotice = Notice::getKV('uri', $sharedId);
-        if (!$sharedNotice instanceof Notice) {
-            // If no locally stored notice is found, process it!
-            // TODO: Remember to check Deleted_notice!
-            // TODO: If a post is shared that we can't retrieve - what to do?
-            try {
-                $other = self::ensureActivityObjectProfile($shared->actor);
-                $sharedNotice = $other->processActivity($shared, $method);
-                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.'), $sharedId));
-                }
-            } catch (FeedSubException $e) {
-                // Remote feed could not be found or verified, should we
-                // transform this into an "RT @user Blah, blah, blah..."?
-                common_log(LOG_INFO, __METHOD__ . ' got a ' . get_class($e) . ': ' . $e->getMessage());
-                return null;
-            }
-        }
-
-        // We'll want to save a web link to the original notice, if provided.
-
-        $sourceUrl = null;
-        if ($activity->link) {
-            $sourceUrl = $activity->link;
-        } else if ($activity->link) {
-            $sourceUrl = $activity->link;
-        } else if (preg_match('!^https?://!', $activity->id)) {
-            $sourceUrl = $activity->id;
-        }
-
-        // Use summary as fallback for content
-
-        if (!empty($activity->content)) {
-            $sourceContent = $activity->content;
-        } else if (!empty($activity->summary)) {
-            $sourceContent = $activity->summary;
-        } else if (!empty($activity->title)) {
-            $sourceContent = $activity->title;
-        } else {
-            // @todo FIXME: Fetch from $sourceUrl?
-            // TRANS: Client exception. %s is a source URI.
-            throw new ClientException(sprintf(_m('No content for notice %s.'), $activity->id));
-        }
-
-        // Get (safe!) HTML and text versions of the content
-
-        $rendered = common_purify($sourceContent);
-        $content = common_strip_html($rendered);
-
-        $shortened = common_shorten_links($content);
-
-        // If it's too long, try using the summary, and make the
-        // HTML an attachment.
-
-        $attachment = null;
-
-        if (Notice::contentTooLong($shortened)) {
-            $attachment = $this->saveHTMLFile($activity->title, $rendered);
-            $summary = common_strip_html($activity->summary);
-            if (empty($summary)) {
-                $summary = $content;
-            }
-            $shortSummary = common_shorten_links($summary);
-            if (Notice::contentTooLong($shortSummary)) {
-                $url = common_shorten_url($sourceUrl);
-                $shortSummary = substr($shortSummary,
-                                       0,
-                                       Notice::maxContent() - (mb_strlen($url) + 2));
-                $content = $shortSummary . ' ' . $url;
-
-                // We mark up the attachment link specially for the HTML output
-                // so we can fold-out the full version inline.
-
-                // @todo FIXME i18n: This tooltip will be saved with the site's default language
-                // TRANS: Shown when a notice is longer than supported and/or when attachments are present. At runtime
-                // TRANS: this will usually be replaced with localised text from StatusNet core messages.
-                $showMoreText = _m('Show more');
-                $attachUrl = common_local_url('attachment',
-                                              array('attachment' => $attachment->id));
-                $rendered = common_render_text($shortSummary) .
-                            '<a href="' . htmlspecialchars($attachUrl) .'"'.
-                            ' class="attachment more"' .
-                            ' title="'. htmlspecialchars($showMoreText) . '">' .
-                            '&#8230;' .
-                            '</a>';
-            }
-        }
-
-        $options = array('is_local' => Notice::REMOTE,
-                         'url' => $sourceUrl,
-                         'uri' => $activity->id,
-                         'rendered' => $rendered,
-                         'replies' => array(),
-                         'groups' => array(),
-                         'peopletags' => array(),
-                         'tags' => array(),
-                         'urls' => array(),
-                         'repeat_of' => $sharedNotice->id,
-                         'scope' => $sharedNotice->scope);
-
-        // Check for optional attributes...
-
-        if (!empty($activity->time)) {
-            $options['created'] = common_sql_date($activity->time);
-        }
-
-        if ($activity->context) {
-            // TODO: context->attention
-            list($options['groups'], $options['replies'])
-                = self::filterAttention($profile, $activity->context->attention);
-
-            // Maintain direct reply associations
-            // @todo FIXME: What about conversation ID?
-            if (!empty($activity->context->replyToID)) {
-                $orig = Notice::getKV('uri',
-                                          $activity->context->replyToID);
-                if ($orig instanceof Notice) {
-                    $options['reply_to'] = $orig->id;
-                }
-            }
-
-            $location = $activity->context->location;
-            if ($location) {
-                $options['lat'] = $location->lat;
-                $options['lon'] = $location->lon;
-                if ($location->location_id) {
-                    $options['location_ns'] = $location->location_ns;
-                    $options['location_id'] = $location->location_id;
-                }
-            }
-        }
-
-        if ($this->isPeopletag()) {
-            $options['peopletags'][] = $this->localPeopletag();
-        }
-
-        // Atom categories <-> hashtags
-        foreach ($activity->categories as $cat) {
-            if ($cat->term) {
-                $term = common_canonical_tag($cat->term);
-                if ($term) {
-                    $options['tags'][] = $term;
-                }
-            }
-        }
-
-        // Atom enclosures -> attachment URLs
-        foreach ($activity->enclosures as $href) {
-            // @todo FIXME: Save these locally or....?
-            $options['urls'][] = $href;
-        }
-
-        $notice = Notice::saveNew($profile->id,
-                                  $content,
-                                  'ostatus',
-                                  $options);
-
-        return $notice;
-    }
-
     /**
      * Process an incoming post activity from this remote feed.
      * @param Activity $activity
index 7f71adfd8367cf37cce41225eb172769c036e6cb..14c0c2ad2ac4d2d939b7843ffa88ba6fee7e2262 100644 (file)
@@ -74,6 +74,55 @@ class SharePlugin extends ActivityVerbHandlerPlugin
     {
         assert($this->isMyActivity($act));
 
+        // The below algorithm is mainly copied from the previous Ostatus_profile->processShare()
+
+        if (count($act->objects) !== 1) {
+            // TRANS: Client exception thrown when trying to share multiple activities at once.
+            throw new ClientException(_m('Can only handle share activities with exactly one object.'));
+        }
+
+        $shared = $act->objects[0];
+        if (!$shared instanceof Activity) {
+            // TRANS: Client exception thrown when trying to share a non-activity object.
+            throw new ClientException(_m('Can only handle shared activities.'));
+        }
+
+        $sharedUri = $shared->id;
+        if (!empty($shared->objects[0]->id)) {
+            // Because StatusNet since commit 8cc4660 sets $shared->id to a TagURI which
+            // fucks up federation, because the URI is no longer recognised by the origin.
+            // So we set it to the object ID if it exists, otherwise we trust $shared->id
+            $sharedUri = $shared->objects[0]->id;
+        }
+        if (empty($sharedUri)) {
+            throw new ClientException(_m('Shared activity does not have an id'));
+        }
+
+        // First check if we have the shared activity. This has to be done first, because
+        // we can't use these functions to "ensureActivityObjectProfile" of a local user,
+        // who might be the creator of the shared activity in question.
+        $sharedNotice = Notice::getKV('uri', $sharedId);
+        if (!$sharedNotice instanceof Notice) {
+            // If no locally stored notice is found, process it!
+            // TODO: Remember to check Deleted_notice!
+            // TODO: If a post is shared that we can't retrieve - what to do?
+            try {
+                $other = self::ensureActivityObjectProfile($shared->actor);
+                $sharedNotice = $other->processActivity($shared, $method);
+                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.'), $sharedId));
+                }
+            } catch (FeedSubException $e) {
+                // Remote feed could not be found or verified, should we
+                // transform this into an "RT @user Blah, blah, blah..."?
+                common_log(LOG_INFO, __METHOD__ . ' got a ' . get_class($e) . ': ' . $e->getMessage());
+                return null;
+            }
+        }
+
         // 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.