mautic / plugins /MauticSocialBundle /Integration /FoursquareIntegration.php
chrisbryan17's picture
Upload folder using huggingface_hub
d2897cd verified
<?php
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;
}
}