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:----h4sR/3pmeFb88pMHQOWXCiNjdT4jUAjA1kbH3fK+bIv6lSBt5hkzOcnnB5D7ELAKFBXKk+dznpMkaD7Q9kYUw2OX8jCWykU8nEu1G+sllmPwYOgh/fLYaRYEo6RyMjZQacUGyqUYWyNtPYx2o4Bz+hJT350ReH2Ltj05TexA3YITX4weK4wnFVzq8mWRF3BP8l8l7xh0Rvcz+vU87v7uRLPqbjcCply1xm2RPDyEehlWL174q3EJkpm1GukHYlbhcF1EXEQmQyTqjzzbVnWrIqdnmhcYo3xwvTVTvBULhiIwJSZz/cNhBtlmZnOL5+avGystZr+ccs/arYOM4rMjG0Pey/OyW0HcitFUlb2N299x+V7luPwltKxbawXfk9D9WR7jSFqK8dUSExVPbSmqfKoIAs2Ua5A8pNWgefVVw97g39k+/ABk1qFwaoo0nE4/aHQQRFrtCuWdb+jvL1HJ9wqaCC+fI9tT5if4jHc6pvktGYs5FLtq9JaPAY3TpjLaQKl7Yy7i7S7XQtV5/gnX5Urll0vebfhBQKENc21KIw1x4nJ0R62z2YpJoBz8qi0P7qOvJ1JYNx0OoI3AhCyZtwlFCsLdKtVI3Fsawb/9pQHmsYHEEzhSCk5zR3gpJL91KUJ8XLk/YiaqDc29MKqPlNJMsbrRvBaJuTSCvgf3f2Q=----ATTACHMENT:----MzMwNDYwNDk0NDc1MzUzOSA4MjE0MTUxOTE5OTc2Nzk3IDYwNjQ1NDAwOTU5ODQ4NjM=