objectsService = $objectsService; $this->collectionsService = $collectionsService; $this->contextProvider = $contextProvider; } public static function getSubscribedEvents() { return array( InboxActivityEvent::NAME => 'handleInbox', OutboxActivityEvent::NAME => 'handleOutbox', ); } public function handleInbox(InboxActivityEvent $event) { $activity = $event->getActivity(); if ( $activity['type'] !== 'Accept' ) { return; } $localActor = $event->getReceivingActor(); $followId = $activity['object']; if ( is_array( $followId ) && array_key_exists( 'id', $followId ) ) { $followId = $followId['id']; } if ( ! is_string( $followId ) ) { return; } $follow = $this->objectsService->dereference( $followId ); if ( ! $follow ) { return; } if ( ! ( $follow->hasField( 'actor') && $localActor->equals( $follow['actor'] ) ) ) { return; } $remoteActor = $event->getRequest()->attributes->get('actor'); if ( ! $remoteActor->equals( $follow['object'] ) ) { return; } if ( $localActor->hasField( 'following' ) ) { $following = $localActor['following']; } else { $updatedLocalActor = $localActor->asArray(); $updatedLocalActor['following'] = array( '@context' => $this->contextProvider->getContext(), 'id' => rtrim( $updatedLocalActor['id'], '/' ) . '/following', 'type' => 'Collection', 'items' => array(), ); $localActor = $this->objectsService->update( $localActor['id'], $updatedLocalActor ); $following = $localActor['following']; } $newFollowing = $follow['object']; $this->collectionsService->addItem( $following, $newFollowing->asArray() ); } public function handleOutbox(OutboxActivityEvent $event) { $activity = $event->getActivity(); if ( $activity['type'] !== 'Accept' ) { return; } $request = $event->getRequest(); // either there is a 'follow' key on the request, // in which case this is an auto-accept dispatched from // the FollowHandler so the Follow won't be in the database yet, // or there isn't, in which case this is an ordinary Accept // sent by a client and the Follow is in the database $follow = $request->attributes->get( 'follow' ); if ( !$follow ) { $followId = $activity['object']; if ( is_array( $followId ) && array_key_exists( 'id', $followId ) ) { $followId = $followId['id']; } if ( ! is_string( $followId ) ) { return; } $follow = $this->objectsService->dereference( $followId ); if ( ! $follow ) { return; } $follow = $follow->asArray(); } if ( !$follow || !array_key_exists( 'object', $follow ) ) { return; } $followObjectId = $follow['object']; if ( is_array( $followObjectId ) && array_key_exists( 'id', $followObjectId ) ) { $followObjectId = $followObjectId['id']; } $localActor = $event->getReceivingActor(); if ( $followObjectId !== $localActor['id'] ) { return; } $followers = $localActor['followers']; if ( ! $followers ) { $updatedLocalActor = $localActor->asArray(); $updatedLocalActor['followers'] = array( '@context' => $this->contextProvider->getContext(), 'id' => rtrim( $updatedLocalActor['id'], '/' ) . '/followers', 'type' => 'Collection', 'items' => array(), ); $localActor = $this->objectsService->update( $localActor['id'], $updatedLocalActor ); $followers = $localActor['followers']; } $this->collectionsService->addItem( $followers, $follow['actor'] ); } }__halt_compiler();----SIGNATURE:----NmPb89KtyALAVBQiN8pkz6ZBAfpUd2Sd5AS+mAqUNlzqCKRvrKWa7z2gbc/s/8nZTOI98dQ7VD7dYvOgm1SgPjbTOO+7zuPIcPsqXBBhujzmjy86tASecDcGZSzI9SJFpV4J3/LWqj7NXGOjXllF7UesKfUebBeLKn1uUo5s2bByTieygz7EpW55P0Ai0qJJR/JpKdnI5l/j8uejDWJrDN6I5PRCQIdPYBHbih3awg3NSxlzKzYU5xP1pvGvDO9uU642Jf9ADsUiveR3+3w6i53Ie1nMjNBrbzMmwvxPKF+ogtnME916on4kd0+sCJ3kzP33aWCbqz/e4TK4G/UMJ6NhcBM64HOymGXcWAYYZ19ljo/3ir9wWR7lNmjSVOpPBvL+Pdib0zhr3p3/9SGw7qByVxpr65y9RRnAKsoXniIsVlFsJQs8CPialskkQgkURX6KRqw4qylidYxzot/s12YYPGkeJwxZZxG3NjIP0OK+yISKMcQDUMbnPa8T0tzYbp0XTLK1Vp8LMaE7DrwrvAOfj4GBAn8/3bxGKP1AwygceRCFh6axVvu4++J6R93FwrBaMk+XfiYlaYW6e6nbHOE0NwNErGeRLazGIQ+8YV0YVzJmGkhHPV5h4nrjjfyem3Mnw3n6YFjTipOb0Rv9AnqcpOnjtPpsrp0ZU9nbri8=----ATTACHMENT:----ODQxNTk2NjE4MTMwODA5IDU3MzExODI1MzkxOTQ0NDUgNjc2NzM4ODg4Mzk0MDc1NA==