Follow a user.

        Parameters
        ----------
        auth_secret: str
            The authentication secret of the logged-in user.
        followee_username: str
            The username of the followee.

        Returns
        -------
        bool
            True if the follow is successful, False otherwise.
        result
            None if the follow is successful, a dict containing
            the error string with the key ERROR_KEY otherwise.

        Note
        ----
        Possible error strings are listed as below:

        -  ERROR_NOT_LOGGED_IN
        -  ERROR_FOLLOWEE_NOT_EXIST_FORMAT.format(followee_username)
        -  ERROR_FOLLOW_YOURSELF_FORMAT.format(followee_username)

def follow(self, auth_secret, followee_username):
        """Follow a user.

        Parameters
        ----------
        auth_secret: str
            The authentication secret of the logged-in user.
        followee_username: str
            The username of the followee.

        Returns
        -------
        bool
            True if the follow is successful, False otherwise.
        result
            None if the follow is successful, a dict containing
            the error string with the key ERROR_KEY otherwise.

        Note
        ----
        Possible error strings are listed as below:

        -  ERROR_NOT_LOGGED_IN
        -  ERROR_FOLLOWEE_NOT_EXIST_FORMAT.format(followee_username)
        -  ERROR_FOLLOW_YOURSELF_FORMAT.format(followee_username)
        """
        result = {pytwis_constants.ERROR_KEY: None}

        # Check if the user is logged in.
        loggedin, userid = self._is_loggedin(auth_secret)
        if not loggedin:
            result[pytwis_constants.ERROR_KEY] = pytwis_constants.ERROR_NOT_LOGGED_IN
            return (False, result)

        with self._rc.pipeline() as pipe:
            # Check if the followee exists.
            while True:
                try:
                    # Put a watch on the Hash 'users': username -> user-id, in case that
                    # other clients are modifying the Hash 'users'.
                    pipe.watch(pytwis_constants.USERS_KEY)
                    followee_userid = pipe.hget(pytwis_constants.USERS_KEY, followee_username)
                    if followee_userid is None:
                        result[pytwis_constants.ERROR_KEY] = \
                            pytwis_constants.ERROR_FOLLOWEE_NOT_EXIST_FORMAT.\
                                            format(followee_username)
                        return (False, result)
                    elif followee_userid == userid:
                        result[pytwis_constants.ERROR_KEY] = \
                            pytwis_constants.ERROR_FOLLOW_YOURSELF_FORMAT.format(followee_username)
                        return (False, result)

                    break
                except WatchError:
                    continue

            # Update the two zset 'followers:[followee_username]' and 'following:[username]'.
            follower_zset_key = pytwis_constants.FOLLOWER_KEY_FORMAT.format(followee_userid)
            following_zset_key = pytwis_constants.FOLLOWING_KEY_FORMAT.format(userid)
            unix_time = int(time.time())
            pipe.multi()
            pipe.zadd(follower_zset_key, unix_time, userid)
            pipe.zadd(following_zset_key, unix_time, followee_userid)
            pipe.execute()

        return (True, result)