diff --git a/README.md b/README.md index 3bb2f70..a1081b1 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,13 @@ Version php utilisé : 7.4 * `calendar_api_application_name` [Nom de l'API google calendar](#api-google) * `calendar_api_auth_config_file` [Nom du fichiers d'authentification à l'API google calendar.](#api-google) * `calendar_id`[ Id du calendrier google](#calendrier-google) (ex: vf2kq9ary690m8iee8ahv3e3d0@group.calendar.google.com) - + * `max_batch_request` Nombre maximum d'évènement dans une seule requête pour l'api (ne pas depasser 50 !) ## Lancement -Une fois le fichier `env.php` rempli, lancez (avec linux ou phpstorm de préférence, **evitez git bash !**) la commande : `php index.php`. +Une fois le fichier `env.php` rempli, lancez (avec linux ou phpstorm de préférence, **evitez git bash !**) la commande : `php run.php`. + +Le programme vous demandera le nombre de jours à synchroniser à partir d'aujourd'hui. -Le programme vous demandera le nombre de jours à synchroniser à partir d'aujourd'hui. +Vous pouvez également indiquer le nombre de jours voulu directement depuis la ligne de commande de cette manière : `php run.php 7` ![image](https://i.imgur.com/qojtmG6.png) diff --git a/composer.json b/composer.json index 590d36e..848cc4e 100644 --- a/composer.json +++ b/composer.json @@ -11,8 +11,8 @@ ], "require": { "tchenu/myges": "dev-master", - "google/apiclient": "^2.7", "ext-json": "*", - "ext-ctype": "*" + "ext-ctype": "*", + "google/apiclient": "^v2.8.3" } } diff --git a/env.php.example b/env.php.example index 2ac5a16..7c06f0e 100644 --- a/env.php.example +++ b/env.php.example @@ -18,4 +18,8 @@ define("calendar_api_auth_config_file", ""); /** * Google calendar id (ex : vf2kq9ary690m8iee8ahv3e3d0@group.calendar.google.com) */ -define("calendar_id", ""); \ No newline at end of file +define("calendar_id", ""); +/** + * Max batch request (don't set above 50) + */ +define('max_batch_request', 45); \ No newline at end of file diff --git a/functions.php b/functions.php index 02fe337..40a03f9 100644 --- a/functions.php +++ b/functions.php @@ -8,6 +8,7 @@ require_once __DIR__ . '/models/Course.php'; require_once __DIR__ . '/models/Room.php'; + function getMe(): Me { return new Me(getClient()); @@ -22,7 +23,7 @@ function getClient(): Client } } -function getAgenda(int $days = 7, Me $me): array +function getAgenda(Me $me, int $days = 7): array { return $me->getAgenda(getDateStart()->getTimestamp() * 1000, getDateEnd($days)->getTimestamp() * 1000); } @@ -37,7 +38,7 @@ function getDateStart(): DateTime function getDateEnd(int $days): DateTime { $end = new DateTime(); - date_add($end, date_interval_create_from_date_string($days . ' days')); + $end->add(date_interval_create_from_date_string($days . ' days')); $end->setTime(23, 59, 59); return $end; } @@ -104,12 +105,12 @@ function getCourseResume(Course $course): string $start = new DateTime(); $start->setTimestamp($course->start_date / 1000); - $start->add(date_interval_create_from_date_string("2 hours")); + $start->add(date_interval_create_from_date_string("1 hours")); $str .= ", Debut : " . $start->format("d-m-Y à H:i"); $end = new DateTime(); $end->setTimestamp($course->end_date / 1000); - $end->add(date_interval_create_from_date_string("2 hours")); + $end->add(date_interval_create_from_date_string("1 hours")); $str .= ", Fin : " . $end->format("d-m-Y à H:i"); if (!empty($course->rooms)) { @@ -173,7 +174,7 @@ function getCalendarClient(): Google_Client return $client; } -function getEvent(Google_Client $client, $days = 7) +function getEvent(Google_Client $client, $days = 7): Google_Service_Calendar_Events { $service = new Google_Service_Calendar($client); @@ -186,19 +187,6 @@ function getEvent(Google_Client $client, $days = 7) ); return $service->events->listEvents(calendar_id, $optParams); - - /*if (empty($events)) { - print "No upcoming events found.\n"; - } else { - print "Upcoming events:\n"; - foreach ($events as $event) { - $start = $event->start->dateTime; - if (empty($start)) { - $start = $event->start->date; - } - printf("%s - %s - (%s)\n", $event->getSummary(), $event->getDescription(), $start); - } - }*/ } function removeEvents(Google_Client $client, $events) @@ -208,14 +196,6 @@ function removeEvents(Google_Client $client, $events) foreach ($events as $event) { $service->events->delete(calendar_id, $event->getId()); } - - /* foreach ($events as $event) { - $start = $event->start->dateTime; - if (empty($start)) { - $start = $event->start->date; - } - printf("%s - %s - (%s)\n", $event->getSummary(), $event->getLocation(), $start); - }*/ } function getDateTimeForEvent($msTimestamp): string @@ -233,39 +213,93 @@ function addEvents(Google_Client $client, array $agenda) foreach ($agenda as $course) { $course = Course::fromObject($course); printf("Ajout du cours :%s%s" . PHP_EOL, PHP_EOL, getCourseResume($course)); + $event = createGoogleEvent($course); - $event = new Google_Service_Calendar_Event(); - $event->setSummary($course->name); - //TODO set location and color -// $event->setLocation() - - $description = ""; + $service->events->insert($calendarId, $event); + } +} - if (!empty($course->teacher) && strlen($course->teacher) > 1) { - $description .= "Intervenant : " . $course->teacher . "
"; +function batchAddEvents(Google_Client $client, array $agenda) +{ + $client->setUseBatch(true); + $service = new Google_Service_Calendar($client); + $batch_client = $service->createBatch(); + $count = 0; + foreach ($agenda as $course) { + $course = Course::fromObject($course); + printf("Ajout du cours :%s%s" . PHP_EOL, PHP_EOL, getCourseResume($course)); + $event = createGoogleEvent($course); + + $request = $service->events->insert(calendar_id, $event); + $count++; + $batch_client->add($request); + if ($count >= max_batch_request) { + //don't set more than 50 + $batch_client->execute(); + $batch_client = $service->createBatch(); + $count = 0; } + } + $batch_client->execute(); + $client->setUseBatch(false); +} - if (!empty($course->rooms)) { - $description .= "Salle(s) :"; + foreach ($events as $event) { + $count++; + $request = $service->events->delete(calendar_id, $event->getId()); + $batch_client->add($request); + + if ($count >= max_batch_request) { + //don't set more than 50 + $batch_client->execute(); + $batch_client = $service->createBatch(); + $count = 0; } - $event->setDescription($description); + } + $batch_client->execute(); + $client->setUseBatch(false); +} - $start = new Google_Service_Calendar_EventDateTime(); - $start->setDateTime(getDateTimeForEvent($course->start_date)); - $event->setStart($start); +function createGoogleEvent(Course $course): Google_Service_Calendar_Event +{ + $event = new Google_Service_Calendar_Event(); + $event->setSummary($course->name); + //TODO set location and color +// $event->setLocation() - $end = new Google_Service_Calendar_EventDateTime(); - $end->setDateTime(getDateTimeForEvent($course->end_date)); - $event->setEnd($end); + $description = ""; - $service->events->insert($calendarId, $event); + if (!empty($course->teacher) && strlen($course->teacher) > 1) { + $description .= "Intervenant : " . $course->teacher . "
"; + } + + if (!empty($course->rooms)) { + $description .= "Salle(s) :"; } + + $event->setDescription($description); + + $start = new Google_Service_Calendar_EventDateTime(); + $start->setDateTime(getDateTimeForEvent($course->start_date)); + $event->setStart($start); + + $end = new Google_Service_Calendar_EventDateTime(); + $end->setDateTime(getDateTimeForEvent($course->end_date)); + $event->setEnd($end); + return $event; } function printDivider() diff --git a/index.php b/run.php similarity index 74% rename from index.php rename to run.php index 5b7b3e7..065d355 100644 --- a/index.php +++ b/run.php @@ -1,51 +1,52 @@ -= 0) { + print "Entrez le nombre de jours que vous souhaitez synchroniser à partir d'aujourd'hui : "; + $days = trim(fgets(STDIN)); +} + +printDivider(); +print "Connexion à MyGES..." . PHP_EOL; +$me = getMe(); +print "Connecté !" . PHP_EOL; + +printDivider(); +printf("Récupération des cours sur %d jours..." . PHP_EOL, $days); +$agenda = getAgenda($me, $days); +printf("Réussi ! %d cours trouvés" . PHP_EOL, sizeof($agenda)); + +print "Traitement des doublons..." . PHP_EOL; +$agenda = removeDuplicate($agenda); +printf("Réussi ! %d cours uniques" . PHP_EOL, sizeof($agenda)); + +printDivider(); +print "Connexion à l'API google..." . PHP_EOL; +$client = getCalendarClient(); +print "Connecté !" . PHP_EOL; + +printDivider(); +printf("Récupération de la liste des cours présent sur le calendrier google sur %d jours..." . PHP_EOL, $days); +$events = getEvent($client, $days); +printf("Réussi ! %d cours trouvés" . PHP_EOL, sizeof($events)); + +printDivider(); +print "Nettoyage des cours sur le calendrier google..." . PHP_EOL; +batchRemoveEvents($client, $events); +print "Les cours ont été supprimés de l'agenda google!" . PHP_EOL; + +printDivider(); +print "Ajout des cours sur le calendrier google..." . PHP_EOL; +batchAddEvents($client, $agenda); +printDivider(); +print "Les cours ont été ajoutés!" . PHP_EOL; + print "Finit." . PHP_EOL; \ No newline at end of file