/** * Parse the JSON returned from foursquare and store them in the database * @param JSON $checkins */ private function parseResults($checkins) { $post_dao = DAOFactory::getDAO('PostDAO'); $place_dao = DAOFactory::getDAO('PlaceDAO'); $link_dao = DAOFactory::getDAO('LinkDAO'); $number_stored = 0; // Check we actually got a set of checkins if (isset($checkins->response->checkins->items) && sizeof($checkins->response->checkins->items) > 0) { // Make a query out to the API for this users details, like name etc. $user = $this->api_accessor->apiRequest('users/self', $this->access_token); // For each checkin store it in the database foreach ($checkins->response->checkins->items as $item) { // The post ID, is the checkin ID foursquare provides $post['post_id'] = $item->id; // The post text is the text they enter when checking in $post['post_text'] = isset($item->shout) ? $item->shout : " "; // The author username is the users foursquare email address $post['author_username'] = $user->response->user->contact->email; // The author full name is the name they gave foursquare $post['author_fullname'] = $user->response->user->firstName . " " . $user->response->user->lastName; // The avatar is the one they have set on foursquare $post["author_avatar"] = $user->response->user->photo->prefix . "100x100" . $user->response->user->photo->suffix; // The author user id is there foursquare user ID $post['author_user_id'] = $user->response->user->id; // The date they checked in $post['pub_date'] = date('Y-m-d H:i:s', $item->createdAt); // Source of the checkin $post['source'] = $item->source->name; // Check if the checkin was marked as private if (isset($item->private)) { $post['is_protected'] = true; } else { $post['is_protected'] = false; } // Set the network to foursquare $post['network'] = 'foursquare'; // Set place to the name of the place their checking into $post['place'] = $item->venue->name; // There are a few parameters that may or may not be set for location so let the method figure it out $post['location'] = $this->getLocation($item); //$post['location'] = $item->location->postalCode; // Place ID is an ID foursquare provides $post['place_id'] = $item->venue->id; // Set geo to the lat,lng that foursquare provides $post['geo'] = $item->venue->location->lat . "," . $item->venue->location->lng; // These parameters cant be null but we don't need them for our plugin so set them to any empty string $post['reply_count_cache'] = ''; $post['favlike_count_cache'] = ''; $post['retweet_count_cache'] = ''; $post['author_follower_count'] = ''; // Store the checkin details in the database $done = $post_dao->addPost($post); if ($done != null) { $number_stored++; } // Check if any photos are attached to this checkin if ($item->photos->count > 0 && $done != null) { foreach ($item->photos->items as $photo) { $photo_store = new Link(array('url' => $photo->url, 'expanded_url' => $photo->url, 'title' => ' ', 'description' => ' ', 'image_src' => $photo->url, 'caption' => ' ', 'clicks' => 0, 'post_key' => $done, 'error' => 'none')); // Insert the photo into the database $link_dao->insert($photo_store); // Delete the current photo info ready for the next one $photo_store = null; } } // If there are any comments on this checkin capture them if ($item->comments->count > 0) { // Make a query out for the comments $comments = $this->api_accessor->apiRequest('checkins/' . $item->id, $this->access_token); foreach ($comments->response->checkin->comments->items as $comment) { // The post ID, is the comment ID foursquare provides $comment_store['post_id'] = $comment->id; // The post text is the comment they made $comment_store['post_text'] = $comment->text; // The author username is the users foursquare email address (which we need to query for) $name = $this->api_accessor->apiRequest('users/' . $comment->user->id, $this->access_token); $user_name = $name->response->user->contact->email; $comment_store['author_username'] = isset($user_name) ? $user_name : 'email address withheld'; // The author full name is the name they gave foursquare $comment_store['author_fullname'] = $comment->user->firstName . " " . $comment->user->lastName; // The avatar is the one they have set on foursquare $comment_store["author_avatar"] = $comment->user->photo->prefix . "100x100" . $comment->user->photo->suffix; // The author user id is there foursquare user ID $comment_store['author_user_id'] = $comment->user->id; // The date they posted the comment $comment_store['pub_date'] = date('Y-m-d H:i:s', $comment->createdAt); // Source of the comment $comment_store['source'] = ""; // Comments can not be private $comment_store['is_protected'] = false; // Set the network to foursquare $comment_store['network'] = 'foursquare'; // Set place to the name of the place the comment is about $comment_store['place'] = $comments->response->checkin->venue->name; // A few parameters may or may not be set for location so let the method do the work $comment_store['location'] = $this->getLocation($item); // Place ID is an ID foursquare provides $comment_store['place_id'] = $comments->response->checkin->venue->id; // Set geo to the lat,lng that foursquare provides $comment_store['geo'] = $item->venue->location->lat . "," . $item->venue->location->lng; // The ID of the author of the checkin $comment_store['in_reply_to_user_id'] = $user->response->user->id; // The ID of the checkin this is a reply to $comment_store['in_reply_to_post_id'] = $item->id; // The number of replies this checkin has $comment_store['reply_count_cache'] = $item->comments->count; // These parameters cant be null but we don't need them so set them to any empty string $comment_store['reply_count_cache'] = ''; $comment_store['favlike_count_cache'] = ''; $comment_store['retweet_count_cache'] = ''; $comment_store['author_follower_count'] = ''; self::fetchUser($comment_store['author_user_id'], 'comment'); // Now store the comment in the database $post_dao->addPost($comment_store); $comment = null; } } // Store the details about this place in the place table if it doesn't already exist // See if this place is already in the database $place_test = $place_dao->getPlaceByID($item->venue->id); // If it isn't already in the database if ($place_test == null) { // Insert it $places['id'] = $item->venue->id; $places['place_type'] = $item->venue->categories[0]->name; $places['name'] = $item->venue->name; $places['full_name'] = $item->venue->name; $places['icon'] = $item->venue->categories[0]->icon->prefix . '64' . $item->venue->categories[0]->icon->suffix; $places['lat_lng'] = 'POINT(' . $item->venue->location->lat . " " . $item->venue->location->lng . ')'; $places['map_image'] = $this->generateMap($item); $place_dao->insertGenericPlace($places, 'foursquare'); } // Blank out the details ready for the next checkin $post = null; $places = null; } } else { $this->logger->logInfo("No checkins found " . Utils::varDumpToString($checkins)); } }
/** * Add user auth link or process incoming auth requests. * @param array $options Plugin options array */ protected function setUpFoursquareInteractions(array $options) { // Get the client ID and secret $client_id = $options['foursquare_client_id']->option_value; $client_secret = $options['foursquare_client_secret']->option_value; // Set up the redirect URL // Get a new configuration instance $config = Config::getInstance(); // Get the root path of our install $site_root_path = $config->getValue('site_root_path'); // If the server supports ssl add an s to our URL path $ssl = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != '' ? 's' : ''; // Generate the redirect URL $redirect_uri = urlencode('http' . $ssl . '://' . $_SERVER['SERVER_NAME'] . $site_root_path . 'account/?p=foursquare'); // Create the OAuth link based on foursquares instructions here: https://developer.foursquare.com/overview/auth $oauth_link = "https://foursquare.com/oauth2/authenticate?client_id=" . $client_id . "&response_type=code"; $oauth_link .= "&redirect_uri=" . $redirect_uri; // Add the link for the user to click to the page $this->addToView('oauth_link', $oauth_link); // If we are here because they have been redirect back by foursquare with a OAuth token if (isset($_GET['code'])) { // Get the code foursquare provided from the URL $code = $_GET['code']; // Create a new crawler, as this class contains the method for retriving our tokens $crawler = new FoursquareCrawler(null, null); // Get the OAuth Tokens $tokens = $crawler->getOAuthTokens($client_id, $client_secret, $redirect_uri, $code); // If foursquare return an error if (isset($tokens->error)) { // Tell the user something went wrong $this->addErrorMessage("Oops! Something went wrong while obtaining OAuth tokens. foursquare says \"" . $tokens->error . ".\" Please double-check your settings and try again.", 'authorization'); } else { // If we got some OAuth tokens back, check they are valid $foursquare_api_accessor = new FoursquareAPIAccessor(); // Make a query for the users details on foursquare $foursquare_user = $foursquare_api_accessor->apiRequest('users/self', $tokens->access_token); // If foursquare returned an error after that request if (isset($foursquare_user->error) || !isset($foursquare_user->response->user->id) || !isset($foursquare_user->response->user->contact->email)) { $this->addErrorMessage("Oops! Something went wrong querying the foursquare API.\n foursquare says \"" . Utils::varDumpToString($foursquare_user) . ".\" Please double-check your settings and try again.", 'authorization'); } else { // Everything went fine so store the details in the database // Set the user ID and username based on details returned by foursquare $foursquare_user_id = $foursquare_user->response->user->id; $foursquare_username = $foursquare_user->response->user->contact->email; // Save the tokens in the database $this->saveAccessTokens($foursquare_user_id, $foursquare_username, $tokens->access_token); } } } // Create a new instance DAO $instance_dao = DAOFactory::getDAO('InstanceDAO'); // Get the owner of this instance $owner_instances = $instance_dao->getByOwnerAndNetwork($this->owner, 'foursquare'); // Add all owners of foursquare instances to the view $this->addToView('owner_instances', $owner_instances); }