From 1bf7521af87c017ef4fbae192ee4b7cd76c896e7 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 11 Oct 2018 20:08:04 +0000 Subject: [PATCH] Store conversation data directly from the AP receiver --- src/Protocol/ActivityPub/Processor.php | 23 +++++----------- src/Protocol/ActivityPub/Receiver.php | 36 +++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 69da8b7e5c..5d2d7fe116 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -107,9 +107,8 @@ class Processor * Prepares data for a message * * @param array $activity Activity array - * @param string $body original source */ - public static function createItem($activity, $body) + public static function createItem($activity) { $item = []; $item['verb'] = ACTIVITY_POST; @@ -128,16 +127,15 @@ class Processor self::fetchMissingActivity($activity['reply-to-id'], $activity); } - self::postItem($activity, $item, $body); + self::postItem($activity, $item); } /** * Prepare the item array for a "like" * * @param array $activity Activity array - * @param string $body original source */ - public static function likeItem($activity, $body) + public static function likeItem($activity) { $item = []; $item['verb'] = ACTIVITY_LIKE; @@ -145,7 +143,7 @@ class Processor $item['gravity'] = GRAVITY_ACTIVITY; $item['object-type'] = ACTIVITY_OBJ_NOTE; - self::postItem($activity, $item, $body); + self::postItem($activity, $item); } /** @@ -165,9 +163,8 @@ class Processor * Prepare the item array for a "dislike" * * @param array $activity Activity array - * @param string $body original source */ - public static function dislikeItem($activity, $body) + public static function dislikeItem($activity) { $item = []; $item['verb'] = ACTIVITY_DISLIKE; @@ -175,7 +172,7 @@ class Processor $item['gravity'] = GRAVITY_ACTIVITY; $item['object-type'] = ACTIVITY_OBJ_NOTE; - self::postItem($activity, $item, $body); + self::postItem($activity, $item); } /** @@ -183,9 +180,8 @@ class Processor * * @param array $activity Activity data * @param array $item item array - * @param string $body original source */ - private static function postItem($activity, $item, $body) + private static function postItem($activity, $item) { /// @todo What to do with $activity['context']? @@ -226,11 +222,6 @@ class Processor $item['body'] = $activity['source']; } - $item['protocol'] = Conversation::PARCEL_ACTIVITYPUB; - $item['source'] = $body; - $item['conversation-href'] = $activity['context']; - $item['conversation-uri'] = $activity['conversation']; - foreach ($activity['receiver'] as $receiver) { $item['uid'] = $receiver; $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, true); diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index f371eede7f..f54503708b 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -14,6 +14,8 @@ use Friendica\Model\User; use Friendica\Util\JsonLD; use Friendica\Util\LDSignature; use Friendica\Protocol\ActivityPub; +use Friendica\Model\Conversation; +use Friendica\Util\DateTimeFormat; /** * @brief ActivityPub Receiver Protocol class @@ -229,6 +231,32 @@ class Receiver return $object_data; } + /** + * Store the unprocessed data into the conversation table + * This has to be done outside the regular function, + * since we store everything - not only item posts. + * + * @param array $activity Array with activity data + * @param string $body The raw message + */ + private static function storeConversation($activity, $body) + { + if (empty($body) || empty($activity['id'])) { + return; + } + + $conversation = [ + 'protocol' => Conversation::PARCEL_ACTIVITYPUB, + 'item-uri' => $activity['id'], + 'reply-to-uri' => defaults($activity, 'reply-to-id', ''), + 'conversation-href' => defaults($activity, 'context', ''), + 'conversation-uri' => defaults($activity, 'conversation', ''), + 'source' => $body, + 'received' => DateTimeFormat::utcNow()]; + + DBA::insert('conversation', $conversation, true); + } + /** * Processes the activity object * @@ -268,6 +296,8 @@ class Receiver return; } + self::storeConversation($object_data, $body); + // Internal flag for thread completion. See Processor.php if (!empty($activity['thread-completion'])) { $object_data['thread-completion'] = $activity['thread-completion']; @@ -276,15 +306,15 @@ class Receiver switch ($type) { case 'as:Create': case 'as:Announce': - ActivityPub\Processor::createItem($object_data, $body); + ActivityPub\Processor::createItem($object_data); break; case 'as:Like': - ActivityPub\Processor::likeItem($object_data, $body); + ActivityPub\Processor::likeItem($object_data); break; case 'as:Dislike': - ActivityPub\Processor::dislikeItem($object_data, $body); + ActivityPub\Processor::dislikeItem($object_data); break; case 'as:Update':