Tovább a tartalomhoz

Naptár és ütemezés

A Control Center csatlakozik a Google Calendar szolgáltatáshoz, hogy a napod a flottád mellett legyen. Szinkronizálja az eseményeidet, havi, heti, napi és napirend nézetben jeleníti meg őket, figyelmeztet a megbeszélés kezdete előtt, és bármely eseményt rögzített, összefoglalt megbeszéléssé alakít.

Szinte semmit. Az integráció behúzza az eseményeket, és megjeleníti őket. Nem hoz létre, szerkeszt, töröl és nem válaszol meghívókra. Minden eszközkódos csatlakoztatás — akár beépített, akár saját — a calendar.readonly és az openid email hatókört kéri.

Az események a munkaterület saját adatbázisába szinkronizálódnak a szerveren (<dataDir>/<workspaceId>/workspace.db), és minden kliens RPC-n keresztül jeleníti meg őket. Egyetlen kliens sem tárol Google-hitelesítő adatot.

A naptárfiókok munkaterület-hatókörűek, mint a Control Centerben minden más. Minden munkaterület a saját Google-fiókját csatlakoztatja (vagy akár többet), és az egyik munkaterület eseményei és tokenjei soha nem láthatók egy másikból. A munkaterületek váltásával az is vált, hogy mely naptárakat látod.

Egy munkaterület több Google-fiókot is csatlakoztathat, például egy munkahelyi és egy személyes fiókot, és ezek eseményei ugyanazokban a nézetekben egyesülnek.

A headless cc_server mögött nincs böngésző, amely elkapná az OAuth-átirányítást. Ezért nem is használ ilyet: eszközkód-engedélyezéssel (RFC 8628) hitelesít. A szerver megjelenít egy rövid felhasználói kódot és egy Google URL-t, te bármely böngészővel rendelkező eszközön jóváhagyod, a szerver pedig addig kérdez, amíg meg nem teszed. Egy headless telepítés éppen azért tud fiókot csatlakoztatni, mert nincs átirányítási végpont, amit hosztolni kellene.

Egy következményt érdemes tudni, mielőtt saját hitelesítő adatokat hozol: a kliens típusa a Google „TV and Limited Input devices” kliensének kell lennie. A Google ehhez a kliens típushoz csak egy engedélyezett hatókörkészletet ad meg, és az a projekt, amelyben a Naptár nincs számára engedélyezve, invalid_scope hibával bukik el — helyette loopback- vagy webes klienst kellene használnod.

A tokenek soha nem hagyják el a szervert. A szerver secrets.json fájljába íródnak az adatkönyvtárában, google_google:<workspaceId>:<email> kulccsal, az adatbázisok mellett, ugyanazon a hoszt-fájlrendszer bizalmi határon belül. A szerver automatikusan frissíti a hozzáférést, és amikor a Google véglegesen érvénytelenít egy fiókot (visszavont vagy rég lejárt munkamenet), közzéteszi a CalendarAuthExpired eseményt, és egy Újracsatlakozás sávot jelenít meg ahelyett, hogy csendben elbukna.

A forrásból készült build semmilyen Google-hitelesítő adatot nem tartalmaz — a saját kliens-azonosítódat és titkodat adod meg. A hivatalos kiadási buildek beégetnek egy nem bizalmas eszközkódos klienst, hogy a csatlakozási folyamat azonnal működjön; a szerver csak egy rá hivatkozó jelölőt tárol, másolatot soha. A környezetben megadott GOOGLE_OAUTH_CLIENT_ID (és a hozzá tartozó titok) mindig elsőbbséget élvez a beégetett párral szemben. Szándékosan nincs --google-client-id kapcsoló: az ismeretlen kapcsolókat a rendszer figyelmen kívül hagyja, a parancssorban szereplő titok pedig a ps segítségével kiolvasható.

A saját Google-projekt futtatásáról lásd: Google Calendar csatlakoztatása.

A szerver minden csatlakoztatott fiók eseményeinek egy gördülő ablakát húzza be — a fiók minden naptárát, nem csak az elsődlegest —, kétpercenként, igény szerint pedig ezen felül (indítás, csatlakoztatás, kézi frissítés). A rövid ütem megfizethető, mert a bejárás inkrementális: minden naptár a saját szinkrontokenjét hordozza, így egy változatlan naptár egy majdnem üres válaszba kerül, nem pedig egy öthónapos ablak újralekérésébe.

Az ismétlődő eseményeket a szerver oldalán fejtjük ki, így egyetlen kliens sem dolgoz fel ismétlődési szabályt. Ha az aktuális ablakon kívüli hónapra navigálsz, az a tartomány lustán töltődik be. A törölt vagy az ablakon kívülre mozgatott eseményeket a következő szinkronizálás eltakarítja.

Nézet Mit mutat
Hónap Egy teljes hónap rácsban (a kalender csomag meghajtásával)
Hét Egy hét időzített eseményei időrácsban
Nap Egyetlen nap időzített eseményei időrácsban
Napirend A közelgő események görgethető listája

A naptárat a /calendar útvonalon nyitod meg; egy esemény kiválasztásával a részletei a /calendar/:eventId útvonalon nyílnak meg. A választott nézet az adott kliens saját beállításaiban tárolódik, így nem követ téged egy másik eszközre.

Egy percenként futó ütemező azokat az eseményeket keresi, amelyek egy konfigurálható előzetes ablakon belül kezdődnek, és egy „Hamarosan kezdődő megbeszélés” értesítést vált ki (egy MeetingStartingSoon domaineseményt). Az értesítés tartalmazza a csatlakozási URL-t, ha van ilyen, és rákattintva megnyílik az esemény részletei. A figyelmeztetéseket az esemény alertedAt mezője alapján deduplikáljuk, így ugyanaz a megbeszélés soha nem figyelmeztet kétszer, még újraindításokon át sem, és egy olyan esemény, amelynek kezdete az alkalmazás zárva tartása alatt múlt el, soha nem játszódik le újra.

Két korlátba könnyű belebonyolódni. Az ütemező kliensoldalon, az asztali alkalmazásban fut, és csak ahhoz a munkaterülethez, amelyet éppen megnyitva tartasz — egy olyan munkaterület, amelyben nem vagy benne, nem vált ki figyelmeztetést. A webes buildnek pedig egyáltalán nincs operációsrendszer-értesítési csatornája, így az sem vált ki egyet sem.

Egy naptáreseményből megbeszélés-rögzítést indíthatsz, amelyet az esemény címével előtöltünk. A Control Center egy-az-egyhez kapcsolatot tárol a felvétel és az esemény között, így a megbeszélés jegyzetei és a naptárbejegyzés összekapcsolva maradnak anélkül, hogy bármelyik funkció a másiktól függene.

A Felvétel indítása és összekapcsolás csak asztali gépen érhető el. A webes kliensen a művelet azt jelzi, hogy a felvétel nem érhető el — pedig a megbeszélések képernyő saját rögzítési folyamata működik a böngészőben.