--- /dev/null
+<?php
+
+/**
+* Instagram PHP
+* @author Galen Grover <galenjr@gmail.com>
+* @license http://opensource.org/licenses/mit-license.php The MIT License
+*/
+
+namespace Instagram;
+
+use \Instagram\Collection\MediaCollection;
+use \Instagram\Collection\LikedMediaCollection;
+use \Instagram\Collection\UserCollection;
+
+/**
+ * Current User
+ *
+ * Holds the currently logged in user
+ *
+ * @see \Instagram\Instagram->getCurrentUser()
+ * {@link https://github.com/galen/PHP-Instagram-API/blob/master/Examples/current_user.php}
+ * {@link http://galengrover.com/projects/instagram/?example=current_user.php}
+ */
+class CurrentUser extends \Instagram\User {
+
+ /**
+ * Holds relationship info for the current user
+ *
+ * @access protected
+ * @var array
+ */
+ protected $relationships = array();
+
+ /**
+ * Holds liked info for the current user
+ *
+ * Current user likes are stored in media objects
+ * If a media is liked after a media has been fetched the like will not be a part of the media object
+ *
+ * @access protected
+ * @var array
+ */
+ protected $liked = array();
+
+ /**
+ * Holds unliked info for the current user
+ *
+ * @access protected
+ * @var array
+ */
+ protected $unliked = array();
+
+ /**
+ * Get the API ID
+ *
+ * @return string Returns "self"
+ * @access public
+ */
+ public function getApiId() {
+ return 'self';
+ }
+
+ /**
+ * Does the current use like a media
+ *
+ * @param \Instagram\Media $media Media to query for a like from the current user
+ * @access public
+ */
+ public function likes( \Instagram\Media $media ) {
+ return
+ isset( $this->liked[$media->getId()] ) ||
+ (
+ isset( $media->getData()->user_has_liked ) &&
+ (bool)$media->getData()->user_has_liked === true &&
+ !isset( $this->unliked[$media->getId()] )
+ );
+ }
+
+ /**
+ * Add like from current user
+ *
+ * @param \Instagram\Media|string $media Media to add a like to from the current user
+ * @access public
+ */
+ public function addLike( $media ) {
+ if ( $media instanceof \Instagram\Media ) {
+ $media = $media->getId();
+ }
+ $this->proxy->like( $media );
+ unset( $this->unliked[$media] );
+ $this->liked[$media] = true;
+ }
+
+ /**
+ * Delete like from current user
+ *
+ * @param \Instagram\Media|string $media Media to delete a like to from the current user
+ * @access public
+ */
+ public function deleteLike( $media ) {
+ if ( $media instanceof \Instagram\Media ) {
+ $media = $media->getId();
+ }
+ $this->proxy->unLike( $media );
+ unset( $this->liked[$media] );
+ $this->unliked[$media] = true;
+ }
+
+ /**
+ * Add a comment
+ *
+ * @param \Instagram\Media|string Media to add a comment to
+ * @param string $text Comment text
+ * @access public
+ */
+ public function addMediaComment( $media, $text ) {
+ if ( $media instanceof \Instagram\Media ) {
+ $media = $media->getId();
+ }
+ $this->proxy->addMediaComment( $media, $text );
+ }
+
+ /**
+ * Delete a comment
+ *
+ * @param \Instagram\Media|string Media to delete a comment from
+ * @param string $text Comment text
+ * @access public
+ */
+ public function deleteMediaComment( $media, $comment ) {
+ if ( $media instanceof \Instagram\Media ) {
+ $media = $media->getId();
+ }
+ if ( $comment instanceof \Instagram\Comment ) {
+ $comment = $comment->getId();
+ }
+ $this->proxy->deleteMediaComment( $media, $comment );
+ }
+
+ /**
+ * Update relationship with a user
+ *
+ * Internal function that updates relationships
+ *
+ * @see \Instagram\CurrentUser::follow
+ * @see \Instagram\CurrentUser::unFollow
+ * @see \Instagram\CurrentUser::getRelationship
+ * @see \Instagram\CurrentUser::approveFollowRequest
+ * @see \Instagram\CurrentUser::ignoreFollowRequest
+ * @see \Instagram\CurrentUser::block
+ * @see \Instagram\CurrentUser::unblock
+ *
+ * @param \Instagram\User|string User object or user id whose relationship you'd like to update
+ * @access protected
+ */
+ protected function updateRelationship( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ if ( !isset( $this->relationships[ $user ] ) ) {
+ $this->relationships[ $user ] = $this->proxy->getRelationshipToCurrentUser( $user );
+ }
+ }
+
+ /**
+ * Follow user
+ *
+ * @param \Instagram\User|string User object or user id who should be followed
+ * @return boolean
+ */
+ public function follow( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ $this->updateRelationship( $user );
+ $response = $this->proxy->modifyRelationship( $user, 'follow' );
+ foreach( $response as $r => $v ) {
+ $this->relationships[ $user ]->$r = $v;
+ }
+ return true;
+ }
+
+ /**
+ * Approve follower
+ *
+ * @param \Instagram\User|string $user User object or user id who should be approved for following
+ * @return boolean
+ */
+ public function approveFollowRequest( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ $this->updateRelationship( $user );
+ $response = $this->proxy->modifyRelationship( $user, 'approve' );
+ foreach( $response as $r => $v ) {
+ $this->relationships[ $user ]->$r = $v;
+ }
+ return true;
+ }
+
+ /**
+ * Ignore follower
+ *
+ * @param \Instagram\User|string $user User object or user id who should be ignored
+ * @return boolean
+ */
+ public function ignoreFollowRequest( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ $this->updateRelationship( $user );
+ $response = $this->proxy->modifyRelationship( $user, 'ignore' );
+ foreach( $response as $r => $v ) {
+ $this->relationships[ $user ]->$r = $v;
+ }
+ return true;
+ }
+
+ /**
+ * Unfollow user
+ *
+ * @param \Instagram\User|string $user User object or user id who should be unfollowed
+ * @return boolean
+ */
+ public function unFollow( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ $this->updateRelationship( $user );
+ $response = $this->proxy->modifyRelationship( $user, 'unfollow' );
+ foreach( $response as $r => $v ) {
+ $this->relationships[ $user ]->$r = $v;
+ }
+ return true;
+ }
+
+ /**
+ * Block user
+ *
+ * @param \Instagram\User|string $user User object or user id who should be blocked
+ * @return boolean
+ */
+ public function block( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ $this->updateRelationship( $user );
+ $response = $this->proxy->modifyRelationship( $user, 'block' );
+ foreach( $response as $r => $v ) {
+ $this->relationships[ $user ]->$r = $v;
+ }
+ return true;
+ }
+
+ /**
+ * Unblock user
+ *
+ * @param \Instagram\User|string $user User object or user id who should be unblocked
+ * @return boolean
+ */
+ public function unblock( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ $this->updateRelationship( $user );
+ $response = $this->proxy->modifyRelationship( $user, 'unblock' );
+ foreach( $response as $r => $v ) {
+ $this->relationships[ $user ]->$r = $v;
+ }
+ return true;
+ }
+
+ /**
+ * Check if the current user can view a user
+ *
+ * @return bool
+ * @access public
+ */
+ public function canViewUser( $user_id ) {
+ $relationship = $this->proxy->getRelationshipToCurrentUser( $user_id );
+ if ( $this->getId() == $user_id || !(bool)$relationship->target_user_is_private || $relationship->outgoing_status == 'follows' ) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Get relationship
+ *
+ * Get the complete relationship to a user
+ *
+ * @param \Instagram\User|string $user User object or user id to get the relationship details of
+ * @return StdClass
+ */
+ public function getRelationship( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ $this->updateRelationship( $user );
+ return $this->relationships[ $user ];
+ }
+
+ /**
+ * Get follow request
+ *
+ * Get the users that have requested to follow the current user
+ *
+ * @return \Instagram\Collection\UserCollection
+ */
+ public function getFollowRequests() {
+ return new UserCollection( $this->proxy->getFollowRequests(), $this->proxy );
+ }
+
+ /**
+ * Check outgoing request status
+ *
+ * Check if the current user is currently waiting approval of a follow request
+ *
+ * @param \Instagram\User|string $user User object or user id to check the status of
+ * @return boolean
+ */
+ public function isAwaitingFollowApprovalFrom( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ return $this->getRelationship( $user )->outgoing_status == 'requested';
+ }
+
+ /**
+ * Check incoming request status
+ *
+ * Check if the current user has been requested to be followed by a user
+ *
+ * @param \Instagram\User|string $user User object or user id to check the status of
+ * @return boolean
+ */
+ public function hasBeenRequestedBy( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ return $this->getRelationship( $user )->incoming_status == 'requested_by';
+ }
+
+ /**
+ * Check following status
+ *
+ * Check if the current user is blocking a user
+ *
+ * @param \Instagram\User|string $user User object or user id to check the following status of
+ * @return boolean
+ */
+ public function isBlocking( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ return $this->getRelationship( $user )->incoming_status == 'blocked_by_you';
+ }
+
+ /**
+ * Check following status
+ *
+ * Check if hte current user is following a user
+ *
+ * @param \Instagram\User|string $user User object or user id to check the following status of
+ * @return boolean
+ */
+ public function isFollowing( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ return $this->getRelationship( $user )->outgoing_status == 'follows';
+ }
+
+ /**
+ * Check followed by status
+ *
+ * Check if the current user is followed by a user
+ *
+ * @param \Instagram\User|string $user User object or user id to check the followed by status of
+ * @return boolean
+ */
+ public function isFollowedBy( $user ) {
+ if ( $user instanceof \Instagram\User ) {
+ $user = $user->getId();
+ }
+ return $this->getRelationship( $user )->incoming_status == 'followed_by';
+ }
+
+ /**
+ * Get the current user's feed
+ *
+ * This can be paginated with the next_max_id param obtained from MediaCollection->getNext()
+ *
+ * @param array $params Optional params to pass to the endpoint
+ * @return \Instagram\Collection\MediaCollection
+ * @access public
+ */
+ public function getFeed( array $params = null ) {
+ return new MediaCollection( $this->proxy->getFeed( $params ), $this->proxy );
+ }
+
+ /**
+ * Get the current user's liked media
+ *
+ * This can be paginated with the next_max_like_id param obtained from MediaCollection->getNext()
+ *
+ * @param array $params Optional params to pass to the endpoint
+ * @return \Instagram\Collection\MediaCollection
+ * @access public
+ */
+ public function getLikedMedia( array $params = null ) {
+ return new LikedMediaCollection( $this->proxy->getLikedMedia( $params ), $this->proxy );
+ }
+
+}
\ No newline at end of file