Spaces:
No application file
No application file
namespace MauticPlugin\MauticSocialBundle\Integration; | |
class FoursquareIntegration extends SocialIntegration | |
{ | |
public function getName(): string | |
{ | |
return 'Foursquare'; | |
} | |
public function getPriority(): int | |
{ | |
return 2; | |
} | |
/** | |
* @return string[] | |
*/ | |
public function getIdentifierFields(): array | |
{ | |
return [ | |
'email', | |
'twitter', // foursquare allows searching directly by twitter handle | |
]; | |
} | |
public function getAuthenticationUrl(): string | |
{ | |
return 'https://foursquare.com/oauth2/authenticate'; | |
} | |
public function getAccessTokenUrl(): string | |
{ | |
return 'https://foursquare.com/oauth2/access_token'; | |
} | |
public function getAuthenticationType(): string | |
{ | |
return 'oauth2'; | |
} | |
/** | |
* @param string $endpoint | |
* @param string $m | |
*/ | |
public function getApiUrl($endpoint, $m = 'foursquare'): string | |
{ | |
return "https://api.foursquare.com/v2/$endpoint?v=20140806&m={$m}"; | |
} | |
/** | |
* @param array $parameters | |
* @param string $method | |
* @param array $settings | |
* | |
* @return mixed|string | |
*/ | |
public function makeRequest($url, $parameters = [], $method = 'GET', $settings = []) | |
{ | |
$settings[$this->getAuthTokenKey()] = 'oauth_token'; | |
return parent::makeRequest($url, $parameters, $method, $settings); | |
} | |
/** | |
* Get public data. | |
*/ | |
public function getUserData($identifier, &$socialCache): void | |
{ | |
if ($id = $this->getContactUserId($identifier, $socialCache)) { | |
$url = $this->getApiUrl("users/{$id}"); | |
$data = $this->makeRequest($url); | |
if (!empty($data) && isset($data->response->user)) { | |
$result = $data->response->user; | |
$socialCache['profile'] = $this->matchUpData($result); | |
if (isset($result->photo)) { | |
$socialCache['profile']['profileImage'] = $result->photo->prefix.'300x300'.$result->photo->suffix; | |
} | |
$socialCache['profile']['profileHandle'] = $id; | |
} | |
} | |
} | |
public function getPublicActivity($identifier, &$socialCache): void | |
{ | |
if ($id = $this->getContactUserId($identifier, $socialCache)) { | |
$activity = [ | |
// 'mayorships' => array(), | |
'tips' => [], | |
// 'lists' => array() | |
]; | |
/* | |
//mayorships | |
$url = $this->getApiUrl("users/{$id}/mayorships"); | |
$data = $this->makeRequest($url); | |
if (isset($data->response->mayorships) && count($data->response->mayorships->items)) { | |
$limit = 5; | |
foreach ($data->response->mayorships->items as $m) { | |
if (empty($limit)) { | |
break; | |
} | |
//find main category of venue | |
$category = ''; | |
foreach ($m->venue->categories as $c) { | |
if ($c->primary) { | |
$category = $c->name; | |
break; | |
} | |
} | |
$contact = (!empty($m->contact->formattedPhone)) ? $m->contact->formattedPhone : ''; | |
$activity['mayorships'][] = array( | |
'venueName' => $m->venue->name, | |
'venueLocation' => $m->venue->location->formattedAddress, | |
'venueContact' => $contact, | |
'venueCategory' => $category | |
); | |
$limit--; | |
} | |
} | |
*/ | |
// tips | |
$url = $this->getApiUrl("users/{$id}/tips").'&limit=5&sort=recent'; | |
$data = $this->makeRequest($url); | |
if (isset($data->response->tips) && count($data->response->tips->items)) { | |
foreach ($data->response->tips->items as $t) { | |
// find main category of venue | |
$category = ''; | |
foreach ($t->venue->categories as $c) { | |
if ($c->primary) { | |
$category = $c->name; | |
break; | |
} | |
} | |
$contact = (!empty($t->contact->formattedPhone)) ? $t->contact->formattedPhone : ''; | |
$activity['tips'][] = [ | |
'createdAt' => $t->createdAt, | |
'tipText' => $t->text, | |
'tipUrl' => $t->canonicalUrl, | |
'venueName' => $t->venue->name, | |
'venueLocation' => $t->venue->location->formattedAddress, | |
'venueContact' => $contact, | |
'venueCategory' => $category, | |
]; | |
} | |
} | |
/* | |
//lists | |
$url = $this->getApiUrl("users/{$id}/lists") . "&limit=5&group=created"; | |
$data = $this->makeRequest($url); | |
if (isset($data->response->lists) && count($data->response->lists->items)) { | |
foreach ($data->response->lists->items as $l) { | |
if (!$l->listItems->count) { | |
continue; | |
} | |
$item = array( | |
'listName' => $l->name, | |
'listDescription' => $l->description, | |
'listUrl' => $l->canonicalUrl, | |
'listCreatedAt' => (isset($l->createdAt)) ? $l->createdAt : '', | |
'listUpdatedAt' => (isset($l->updatedAt)) ? $l->updatedAt : '', | |
'listItems' => array() | |
); | |
//get a sample of the list items | |
$url = "https://api.foursquare.com/v2/lists/{$l->id}?limit=5&sort=recent&v=20140719&oauth_token={$keys['access_token']}"; | |
$listData = $this->makeRequest($url); | |
if (isset($listData->response->list->listItems) && count($listData->response->list->listItems->items)) { | |
foreach ($listData->response->list->listItems->items as $li) { | |
//find main category of venue | |
$category = ''; | |
foreach ($li->venue->categories as $c) { | |
if ($c->primary) { | |
$category = $c->name; | |
break; | |
} | |
} | |
$contact = (!empty($li->contact->formattedPhone)) ? $li->contact->formattedPhone : ''; | |
$item['listItems'][] = array( | |
'createdAt' => $li->createdAt, | |
'venueName' => $li->venue->name, | |
'venueLocation' => $li->venue->location->formattedAddress, | |
'venueContact' => $contact, | |
'venueCategory' => $category | |
); | |
} | |
} | |
$activity['lists'][] = $item; | |
} | |
} | |
*/ | |
if (!empty($activity)) { | |
$socialCache['activity'] = $activity; | |
} | |
} | |
} | |
public function getErrorsFromResponse($response): string | |
{ | |
if (is_object($response) && isset($response->meta->errorDetail)) { | |
return $response->meta->errorDetail.' ('.$response->meta->code.')'; | |
} | |
return ''; | |
} | |
public function matchFieldName($field, $subfield = '') | |
{ | |
if ('contact' == $field && in_array($subfield, ['facebook', 'twitter'])) { | |
return $subfield.'ProfileHandle'; | |
} | |
return parent::matchFieldName($field, $subfield); | |
} | |
public function getAvailableLeadFields($settings = []): array | |
{ | |
return [ | |
'profileHandle' => ['type' => 'string'], | |
'firstName' => ['type' => 'string'], | |
'lastName' => ['type' => 'string'], | |
'gender' => ['type' => 'string'], | |
'homeCity' => ['type' => 'string'], | |
'bio' => ['type' => 'string'], | |
'contact' => [ | |
'type' => 'object', | |
'fields' => [ | |
'twitter', | |
'facebook', | |
'phone', | |
], | |
], | |
]; | |
} | |
public function getSupportedFeatures(): array | |
{ | |
return [ | |
'public_profile', | |
'public_activity', | |
]; | |
} | |
/** | |
* @return bool | |
*/ | |
private function getContactUserId(&$identifier, &$socialCache) | |
{ | |
if (!empty($socialCache['id'])) { | |
return $socialCache['id']; | |
} elseif (empty($identifier)) { | |
return false; | |
} | |
$cleaned = $this->cleanIdentifier($identifier); | |
if (!is_array($cleaned)) { | |
$cleaned = [$cleaned]; | |
} | |
foreach ($cleaned as $type => $c) { | |
$url = $this->getApiUrl('users/search')."&{$type}={$c}"; | |
$data = $this->makeRequest($url); | |
if (!empty($data) && isset($data->response->results) && count($data->response->results)) { | |
$socialCache['id'] = $data->response->results[0]->id; | |
return $socialCache['id']; | |
} | |
} | |
return false; | |
} | |
public function getFormType() | |
{ | |
return null; | |
} | |
} | |