Aller au contenu

Calendrier et planification

Control Center se connecte à Google Calendar pour que votre journée côtoie votre flotte. Il synchronise vos événements, les affiche en vues mois, semaine, jour et agenda, vous avertit avant le début d’une réunion et transforme n’importe quel événement en une réunion enregistrée et résumée.

Presque rien. L’intégration récupère les événements et les affiche. Elle n’en crée pas, n’en modifie pas, n’en supprime pas et ne répond à aucune invitation. Chaque connexion par code d’appareil, qu’elle utilise le client intégré ou le vôtre, demande calendar.readonly ainsi que openid email.

Les événements sont synchronisés dans la base de données propre à l’espace de travail sur le serveur (<dataDir>/<workspaceId>/workspace.db) et affichés par chaque client via RPC. Aucun client ne détient d’identifiant Google.

Les comptes de calendrier sont rattachés à l’espace de travail, comme tout le reste dans Control Center. Chaque espace de travail connecte son propre compte Google (ou plusieurs), et les événements et jetons d’un espace de travail ne sont jamais visibles depuis un autre. Changer d’espace de travail change aussi les calendriers que vous voyez.

Un espace de travail peut connecter plusieurs comptes Google, par exemple un compte professionnel et un compte personnel, et leurs événements sont fusionnés dans les mêmes vues.

Pourquoi la connexion passe par un code d’appareil

Section intitulée “Pourquoi la connexion passe par un code d’appareil”

Le cc_server sans interface n’a aucun navigateur pour intercepter une redirection OAuth. Il n’en utilise donc pas : il s’autorise au moyen d’un octroi par code d’appareil (RFC 8628). Le serveur affiche un court code utilisateur et une URL Google; vous approuvez sur n’importe quel appareil doté d’un navigateur et le serveur interroge jusqu’à ce que vous le fassiez. Une installation sans interface peut connecter un compte précisément parce qu’il n’y a aucun point de terminaison de redirection à héberger.

Une conséquence à connaître avant d’utiliser vos propres identifiants : le type de client doit être celui des “TV and Limited Input devices” de Google. Google n’accorde qu’un ensemble de portées figurant sur une liste autorisée à ce type de client, et un projet où Calendar n’est pas autorisé pour ce type échoue avec invalid_scope; il vous faudrait plutôt un client loopback ou un client Web.

Les jetons ne quittent jamais le serveur. Ils sont écrits dans le fichier secrets.json du serveur, dans son répertoire de données, sous la clé google_google:<workspaceId>:<email>, aux côtés des bases de données et à l’intérieur de la même frontière de confiance du système de fichiers de l’hôte. Le serveur renouvelle l’accès automatiquement et, lorsque Google invalide définitivement un compte (session révoquée ou expirée depuis longtemps), publie CalendarAuthExpired et affiche une bannière Reconnecter au lieu d’échouer en silence.

Une compilation à partir du code source ne fournit aucun identifiant Google : vous devez fournir votre propre identifiant client et votre propre secret. Les versions officielles intègrent un client à code d’appareil non confidentiel pour que le flux de connexion fonctionne dès l’installation; le serveur ne stocke qu’un marqueur qui y renvoie, jamais une copie. La variable GOOGLE_OAUTH_CLIENT_ID (et son secret) dans l’environnement a toujours préséance sur la paire intégrée. Il n’existe délibérément aucun drapeau --google-client-id : les drapeaux inconnus sont ignorés, et un secret passé sur la ligne de commande est lisible par ps.

Pour utiliser votre propre projet Google, consultez Connecter un Google Calendar.

Le serveur récupère une fenêtre glissante des événements de chaque compte connecté — tous les calendriers du compte, pas seulement le principal — toutes les deux minutes, et aussi à la demande (démarrage, connexion, actualisation manuelle). Cette cadence courte est abordable parce que le balayage est incrémentiel : chaque calendrier porte son propre jeton de synchronisation, et un calendrier inchangé ne coûte donc qu’une réponse presque vide plutôt qu’une nouvelle récupération d’une fenêtre de cinq mois.

Les événements récurrents sont développés côté serveur, de sorte qu’aucun client n’a jamais à interpréter une règle de récurrence. Naviguer vers un mois à l’extérieur de la fenêtre courante charge cette plage à la demande. Les événements supprimés ou sortis de la plage sont réconciliés et disparaissent à la prochaine synchronisation.

Vue Ce qu’elle affiche
Mois Une grille complète d’un mois (propulsée par le paquet kalender)
Semaine Les événements horodatés d’une semaine dans une grille horaire
Jour Les événements horodatés d’une seule journée dans une grille horaire
Agenda Une liste défilante des événements à venir

Ouvrez le calendrier à /calendar; sélectionner un événement ouvre son détail à /calendar/:eventId. La vue que vous choisissez est stockée dans les préférences propres à ce client; elle ne vous suit donc pas sur un autre appareil.

Un planificateur s’exécute chaque minute, repère les événements qui commencent à l’intérieur d’une fenêtre de préavis configurable et déclenche une notification “Réunion imminente” (un événement de domaine MeetingStartingSoon). La notification contient l’URL de participation lorsqu’une telle URL est présente, et un clic dessus ouvre le détail de l’événement. Les alertes sont dédupliquées selon le champ alertedAt de l’événement : une même réunion n’alerte donc jamais deux fois, même après un redémarrage, et un événement dont l’heure de début est passée pendant que l’application était fermée n’est jamais rejoué.

Deux limites sont faciles à négliger. Le planificateur s’exécute côté client, sur l’ordinateur, et uniquement pour l’espace de travail que vous avez actuellement ouvert — un espace de travail dans lequel vous n’êtes pas ne déclenche aucune alerte. Et la version Web n’a aucune chaîne de notifications du système d’exploitation, de sorte qu’elle n’en déclenche pas non plus.

À partir d’un événement du calendrier, vous pouvez démarrer un enregistrement de réunion prérempli avec le titre de l’événement. Control Center conserve un lien un à un entre l’enregistrement et l’événement, de sorte que les notes de la réunion et l’entrée du calendrier restent liées sans que l’une des fonctionnalités dépende de l’autre.

Enregistrer et lier n’existe que sur l’ordinateur. Dans le client Web, l’action indique que l’enregistrement n’est pas disponible, même si le flux d’enregistrement propre à l’écran des réunions fonctionne, lui, dans le navigateur.