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); }