190 lines
6.8 KiB
PHP
190 lines
6.8 KiB
PHP
<?php
|
|
/**
|
|
* Copyright (C) 2014 Rik Veenboer <rik.veenboer@gmail.com>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
require_once 'vendor/autoload.php';
|
|
require_once 'settings.php';
|
|
|
|
set_time_limit(0);
|
|
session_start();
|
|
echo '<pre>';
|
|
|
|
// Initialize google client
|
|
$oClient = new Google_Client(array('use_objects' => true));
|
|
$oClient->setClientId(CLIENT_ID);
|
|
$oClient->setClientSecret(CLIENT_SECRET);
|
|
$oClient->setRedirectUri(REDIRECT_URI);
|
|
$oClient->setScopes(array(
|
|
'https://www.googleapis.com/auth/calendar',
|
|
'https://www.googleapis.com/auth/contacts.readonly'));
|
|
|
|
// Logout
|
|
if (isset($_GET['logout'])) {
|
|
unset($_SESSION['token']);
|
|
}
|
|
|
|
// Redirected from authentication
|
|
if (isset($_GET['code'])) {
|
|
$oClient->authenticate($_GET['code']);
|
|
$_SESSION['token'] = $oClient->getAccessToken();
|
|
header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
|
|
}
|
|
|
|
// Logged-in
|
|
// $_SESSION['token'] = base64_decode('');
|
|
if (isset($_SESSION['token'])) {
|
|
$oClient->setAccessToken($_SESSION['token']);
|
|
// echo base64_encode($_SESSION['token']);
|
|
}
|
|
|
|
// Ask for permission
|
|
if (!($_SESSION['token'] = $oClient->getAccessToken())) {
|
|
$sAuthUrl = $oClient->createAuthUrl();
|
|
printf('<a class="login" href="%s">Connect Me!</a>', $sAuthUrl);
|
|
exit;
|
|
}
|
|
|
|
// Store Google_Auth object
|
|
$oRfelection = new ReflectionObject($oClient);
|
|
$oProperty = $oRfelection->getProperty('auth');
|
|
$oProperty->setAccessible(true);
|
|
$oAuth = $oProperty->getValue($oClient);
|
|
|
|
// Initialize calendar service
|
|
$oCalendarService = new Google_Service_Calendar($oClient);
|
|
|
|
// Search for original and target calendars
|
|
$oCalendarsList = $oCalendarService->calendarList->listCalendarList();
|
|
$bHasContactsCalendar = $bHasTargetCalendar = false;
|
|
foreach ($oCalendarsList->getItems() as $aCalendarMeta) {
|
|
if ($aCalendarMeta->getId() == CONTACTS_CALENDAR_ID) {
|
|
// Original
|
|
$bHasContactsCalendar = true;
|
|
}
|
|
if ($aCalendarMeta->getSummary() == TARGET_CALENDAR_SUMMARY) {
|
|
// Target
|
|
$bHasTargetCalendar = true;
|
|
$sTargetCalendarId = $aCalendarMeta->getId();
|
|
}
|
|
}
|
|
|
|
// Remove old calendar
|
|
if ($bHasTargetCalendar) {
|
|
$oCalendarService->calendars->delete($sTargetCalendarId);
|
|
}
|
|
|
|
// Create new calendar
|
|
$oCalendar = new Google_Service_Calendar_Calendar($oClient);
|
|
$oCalendar->setSummary(TARGET_CALENDAR_SUMMARY);
|
|
$oCalendar = $oCalendarService->calendars->insert($oCalendar);
|
|
$sTargetCalendarId = $oCalendar->getId();
|
|
|
|
// Keep track of contact events
|
|
$aContacts = array();
|
|
$aAdded = array();
|
|
|
|
if ($bHasContactsCalendar) {
|
|
$oTargetEvents = $oCalendarService->events->listEvents(CONTACTS_CALENDAR_ID);
|
|
foreach ($oTargetEvents->getItems() as $oOriginalEvent) {
|
|
// Initialize new event
|
|
$oTargetEvent = new Google_Service_Calendar_Event();
|
|
|
|
// Copy relevant parts of original event
|
|
$oTargetEvent->setDescription($oOriginalEvent->getDescription());
|
|
$oTargetEvent->setVisibility($oOriginalEvent->getVisibility());
|
|
$oGadget = $oOriginalEvent->getGadget();
|
|
$oTargetEvent->setGadget($oGadget);
|
|
|
|
// Get contact id from event
|
|
$aPreferences = $oGadget->getPreferences();
|
|
if (!isset($aPreferences['goo.contactsContactId'])) {
|
|
continue;
|
|
}
|
|
$sContactId = $aPreferences['goo.contactsContactId'];
|
|
|
|
// Get event name from summary
|
|
$sSummary = $oOriginalEvent->getSummary();
|
|
preg_match('~[^ ]+$~s', $sSummary, $aMatch);
|
|
$sCurrentEvent = $aMatch[0];
|
|
|
|
// Only add first upcoming event
|
|
if (isset($aAdded[$sContactId][$sCurrentEvent])) {
|
|
continue;
|
|
}
|
|
|
|
if (!isset($aContacts[$sContactId])) {
|
|
// Get contact details from contact id
|
|
$sUrl = sprintf('https://www.google.com/m8/feeds/contacts/%s/full/%s?v=3.0', CONTACTS_USER_EMAIL, $sContactId);
|
|
$oHttpClient = $oClient->authorize();
|
|
$oHttpRequest = new GuzzleHttp\Psr7\Request('GET', $sUrl);
|
|
$sResponse = $oHttpClient->send($oHttpRequest)->getBody()->getContents();
|
|
|
|
// Parse XML to fetch birthday
|
|
$sXml = str_replace(array('gd:', 'gContact:'), null, $sResponse);
|
|
$oXml = simplexml_load_string($sXml);
|
|
$sDate = ((array) $oXml->birthday)['@attributes']['when'];
|
|
|
|
// Save birthday date
|
|
$aContacts[$sContactId][CALENDAR_BIRTHDAY_NAME] = $sDate;
|
|
|
|
// Iterate all events of contact
|
|
#$aEvents = (array) $oXml->event;
|
|
#while (($oEvent = next($aEvents)) !== false) {
|
|
# $aEvent = (array) $oEvent;
|
|
# $sEvent = current(current($aEvent));
|
|
# $sDate = current(current(next($aEvent)));
|
|
#
|
|
# // Save other event date
|
|
# $aContacts[$sContactId][$sEvent] = $sDate;
|
|
#}
|
|
}
|
|
|
|
// Get date of current event
|
|
$sDate = $aContacts[$sContactId][$sCurrentEvent];
|
|
|
|
// Calculate age
|
|
$oNow = new DateTime();
|
|
$oDate = new DateTime($sDate);
|
|
$iYear = $oDate->format('Y');
|
|
$iYears = $oNow->diff($oDate)->y + 1;
|
|
|
|
// Derive new event summary from original one
|
|
$oTargetEvent->setSummary(sprintf('%s (%d / %d)', $sSummary, $iYears, $iYear));
|
|
printf("%s\n", sprintf('%s (%d / %d)', $sSummary, $iYears, $iYear));
|
|
|
|
// Correct event date
|
|
$sStart = $oOriginalEvent->getStart()->getDate();
|
|
$oStart = new DateTime($sStart);
|
|
$oStart = new DateTime(sprintf('%s-%s', $oStart->format('d-m'), $oNow->format('Y')));
|
|
if ($oNow->diff($oStart)->invert) {
|
|
$oStart = $oStart->modify('+1 year');
|
|
}
|
|
|
|
// Update start and end times
|
|
$oEventDate = new Google_Service_Calendar_EventDateTime();
|
|
$oEventDate->setDate($oStart->format(GOOGLE_DATE_FORMAT));
|
|
$oTargetEvent->setStart($oEventDate);
|
|
$oEventDate = new Google_Service_Calendar_EventDateTime();
|
|
$oEventDate->setDate($oStart->modify('+1 day')->format(GOOGLE_DATE_FORMAT));
|
|
$oTargetEvent->setEnd($oEventDate);
|
|
|
|
// Insert new event to target calendar
|
|
$oCalendarService->events->insert($sTargetCalendarId, $oTargetEvent);
|
|
|
|
// Set event as added
|
|
$aAdded[$sContactId][$sCurrentEvent] = true;
|
|
}
|
|
} |