Ga naar inhoud

Agenda en planning

Control Center maakt verbinding met Google Calendar, zodat je dag naast je fleet staat. Het synchroniseert je afspraken, toont ze in de weergaven maand, week, dag en agenda, waarschuwt je voordat een vergadering begint en maakt van elke afspraak een opgenomen, samengevatte vergadering.

Bijna niets. De integratie haalt afspraken op en toont ze. Hij maakt, bewerkt of verwijdert geen afspraken en reageert niet op uitnodigingen. Elke device-codeverbinding, ingebouwd of met je eigen client, vraagt calendar.readonly plus openid email aan.

Afspraken worden gesynchroniseerd naar de eigen database van de werkruimte op de server (<dataDir>/<workspaceId>/workspace.db) en door elke client via RPC getoond. Geen enkele client bewaart een Google-referentie.

Agenda-accounts horen bij een werkruimte, net als alles in Control Center. Elke werkruimte verbindt zijn eigen Google-account (of meerdere), en de afspraken en tokens van de ene werkruimte zijn nooit zichtbaar vanuit een andere. Wissel je van werkruimte, dan wisselen ook de agenda’s die je ziet.

Een werkruimte kan meerdere Google-accounts verbinden, bijvoorbeeld een werkaccount en een privéaccount, en hun afspraken worden in dezelfde weergaven samengevoegd.

Waarom aanmelden via een device-code verloopt

Sectie getiteld “Waarom aanmelden via een device-code verloopt”

De headless cc_server heeft geen browser om een OAuth-redirect op te vangen. Daarom gebruikt hij er ook geen: hij autoriseert met de device-codetoekenning (RFC 8628). De server toont een korte gebruikerscode en een Google-URL, jij keurt goed op een willekeurig apparaat met een browser en de server blijft pollen tot je dat doet. Een headless installatie kan juist een account verbinden omdat er geen redirect-endpoint te hosten is.

Wat je moet weten voordat je je eigen referenties meeneemt: het clienttype moet het “TV and Limited Input devices” van Google zijn. Google kent aan dat clienttype alleen een toegestane lijst met scopes toe, en een project waarin Calendar daarvoor niet is toegestaan mislukt met invalid_scope — dan heb je een loopback- of webclient nodig.

Tokens verlaten de server nooit. Ze worden weggeschreven naar secrets.json van de server in zijn gegevensmap, met de sleutel google_google:<workspaceId>:<email>, naast de databases en binnen dezelfde vertrouwensgrens van het hostbestandssysteem. De server vernieuwt de toegang automatisch en publiceert CalendarAuthExpired wanneer Google een account permanent ongeldig maakt (een ingetrokken of lang verlopen sessie); in plaats van stil te falen toont hij dan een banner Opnieuw verbinden.

Een build vanaf de broncode bevat geen enkele Google-referentie — je levert je eigen client-id en secret aan. Officiële releasebuilds bevatten een niet-vertrouwelijke device-codeclient, zodat de verbindingsflow meteen werkt; de server bewaart alleen een markering die ernaar verwijst, nooit een kopie. GOOGLE_OAUTH_CLIENT_ID (en het bijbehorende secret) in de omgeving heeft altijd voorrang op het ingebouwde paar. Er is bewust geen --google-client-id-flag: onbekende flags worden genegeerd, en een secret op een commandoregel is leesbaar via ps.

Zie Een Google Calendar verbinden als je je eigen Google-project wilt draaien.

De server haalt een rollend venster op van de afspraken van elk verbonden account — elke agenda van het account, niet alleen de primaire — elke twee minuten, en verder op verzoek (start, verbinden, handmatig verversen). Dat korte interval kost weinig omdat de ronde incrementeel is: elke agenda heeft zijn eigen synctoken, zodat een ongewijzigde agenda één vrijwel leeg antwoord kost in plaats van het opnieuw ophalen van een venster van vijf maanden.

Terugkerende afspraken worden aan de serverkant uitgevouwen, zodat geen enkele client ooit een herhalingsregel parseert. Navigeer je naar een maand buiten het huidige venster, dan wordt dat bereik pas op dat moment geladen. Verwijderde afspraken of afspraken die buiten het bereik zijn geraakt, worden bij de volgende synchronisatie opgeruimd.

Weergave Wat het toont
Maand Een volledig maandrooster (mogelijk gemaakt door het pakket kalender)
Week De afspraken met tijdstip van één week in een tijdraster
Dag De afspraken met tijdstip van één dag in een tijdraster
Agenda Een doorloopbare lijst met aankomende afspraken

Open de agenda op /calendar; als je een afspraak selecteert, opent de detailweergave op /calendar/:eventId. De weergave die je kiest, wordt opgeslagen in de eigen voorkeuren van die client en volgt je dus niet naar een ander apparaat.

Een planner die elke minuut draait, zoekt naar afspraken die binnen een instelbaar voorloopvenster beginnen en stuurt dan een melding “Vergadering begint zo” (een MeetingStartingSoon domeingebeurtenis). De melding bevat de deelname-URL als die er is, en als je erop klikt, opent de detailweergave van de afspraak. Meldingen worden ontdubbeld aan de hand van alertedAt van de afspraak, zodat dezelfde vergadering nooit twee keer meldt; ook een afspraak waarvan het begintijdstip voorbijging terwijl de app dicht was, wordt nooit opnieuw afgespeeld.

Twee beperkingen waar je snel over struikelt. De planner draait aan de clientkant op de desktop en alleen voor de werkruimte die je op dat moment open hebt — een werkruimte waarin je niet zit, geeft geen melding. En de webbuild heeft helemaal geen pijplijn voor OS-meldingen, dus daar komt ook niets vandaan.

Vanuit een agenda-afspraak kun je een vergaderopname starten, voorgevuld met de titel van de afspraak. Control Center bewaart een een-op-eenkoppeling tussen de opname en de afspraak, zodat de notities van de vergadering en de agenda-afspraak met elkaar verbonden blijven zonder dat het ene onderdeel van het andere afhankelijk is.

Opnemen en koppelen is alleen op de desktop beschikbaar. In de webclient meldt de actie dat opnemen niet beschikbaar is — ook al werkt de opnameflow op het vergaderingscherm zelf wél in de browser.