From dcbca0c6a344df31721e4de56b34566a66cc4091 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Tue, 5 Apr 2022 07:48:38 +0000
Subject: [PATCH] Store "View" activity from Peertube

---
 src/Protocol/Activity.php             | 8 ++++++++
 src/Protocol/ActivityNamespace.php    | 7 +++++++
 src/Protocol/ActivityPub/Receiver.php | 8 +++++---
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/Protocol/Activity.php b/src/Protocol/Activity.php
index 637669a61e..e75b1cf507 100644
--- a/src/Protocol/Activity.php
+++ b/src/Protocol/Activity.php
@@ -183,6 +183,13 @@ final class Activity
 	 */
 	const EMOJIREACT = ActivityNamespace::LITEPUB . '/emojireact';
 
+	/**
+	 * View notification from Peertube
+	 *
+	 * @var string
+	 */
+	const VIEW       = ActivityNamespace::PEERTUBE . '/view';
+
 	/**
 	 * likes (etc.) can apply to other things besides posts. Check if they are post children,
 	 * in which case we handle them specially
@@ -195,6 +202,7 @@ final class Activity
 		self::FOLLOW,
 		self::ANNOUNCE,
 		self::EMOJIREACT,
+		self::VIEW,
 	];
 
 	/**
diff --git a/src/Protocol/ActivityNamespace.php b/src/Protocol/ActivityNamespace.php
index 5dbf88c86c..ee6d80df14 100644
--- a/src/Protocol/ActivityNamespace.php
+++ b/src/Protocol/ActivityNamespace.php
@@ -144,12 +144,19 @@ final class ActivityNamespace
 	 * @var string
 	 */
 	const ATOM1           = 'http://www.w3.org/2005/Atom';
+
 	/**
 	 * @var string
 	 */
 	const MASTODON        = 'http://mastodon.social/schema/1.0';
+
 	/**
 	 * @var string
 	 */
 	const LITEPUB         = 'http://litepub.social';
+
+	/**
+	 * @var string
+	 */
+	const PEERTUBE        = 'https://joinpeertube.org';	
 }
diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php
index 0894ffc453..80bba0b0b9 100644
--- a/src/Protocol/ActivityPub/Receiver.php
+++ b/src/Protocol/ActivityPub/Receiver.php
@@ -385,7 +385,7 @@ class Receiver
 			} else {
 				$object_data['directmessage'] = JsonLD::fetchElement($activity, 'litepub:directMessage');
 			}
-		} elseif (in_array($type, array_merge(self::ACTIVITY_TYPES, ['as:Follow', 'litepub:EmojiReact'])) && in_array($object_type, self::CONTENT_TYPES)) {
+		} elseif (in_array($type, array_merge(self::ACTIVITY_TYPES, ['as:Follow', 'litepub:EmojiReact', 'as:View'])) && in_array($object_type, self::CONTENT_TYPES)) {
 			// Create a mostly empty array out of the activity data (instead of the object).
 			// This way we later don't have to check for the existence of each individual array element.
 			$object_data = self::processObject($activity);
@@ -743,8 +743,10 @@ class Receiver
 				break;
 
 			case 'as:View':
-				if (in_array($object_data['object_type'], ['as:Note', 'as:Video'])) {
-					// Unhandled Peertube activity
+				if (in_array($object_data['object_type'], self::CONTENT_TYPES)) {
+					ActivityPub\Processor::createActivity($object_data, Activity::VIEW);
+				} elseif ($object_data['object_type'] == '') {
+					// The object type couldn't be determined. Most likely we don't have it here. We ignore this activity.
 				} else {
 					self::storeUnhandledActivity(true, $type, $object_data, $activity, $body, $uid, $trust_source, $push, $signer);
 				}