Sari la conținut

Calendar și programare

Control Center se conectează la Google Calendar, astfel încât ziua ta stă alături de flota ta. Îți sincronizează evenimentele, le afișează în vizualizările de lună, săptămână, zi și agendă, te avertizează înainte să înceapă o întâlnire și transformă orice eveniment într-o întâlnire înregistrată și rezumată.

Aproape nimic. Integrarea preia evenimentele și le afișează. Nu creează, nu editează, nu șterge și nu răspunde la invitații. Fiecare conectare prin cod de dispozitiv, integrată sau cu acreditările tale, solicită calendar.readonly plus openid email.

Evenimentele sunt sincronizate în baza de date proprie a spațiului de lucru pe server (<dataDir>/<workspaceId>/workspace.db) și sunt afișate de fiecare client prin RPC. Niciun client nu deține o acreditare Google.

Conturile de calendar aparțin spațiului de lucru, ca tot restul din Control Center. Fiecare spațiu de lucru își conectează propriul cont Google (sau mai multe), iar evenimentele și tokenurile unui spațiu de lucru nu sunt niciodată vizibile din altul. Schimbarea spațiului de lucru schimbă și calendarele pe care le vezi.

Un spațiu de lucru poate conecta mai multe conturi Google, de exemplu un cont de serviciu și unul personal, iar evenimentele lor sunt comasate în aceleași vizualizări.

cc_server rulează fără interfață grafică și nu are un browser care să intercepteze o redirecționare OAuth. Așa că nu folosește una: autorizează cu autorizarea prin cod de dispozitiv (RFC 8628). Serverul afișează un cod de utilizator scurt și un URL Google, tu aprobi de pe orice dispozitiv care are un browser, iar serverul așteaptă până aprobi. O instalare fără interfață grafică poate conecta un cont exact pentru că nu există niciun punct final de redirecționare de găzduit.

Consecința pe care trebuie să o știi înainte să-ți aduci propriile acreditări: tipul de client trebuie să fie “TV and Limited Input devices” al Google. Google acordă acelui tip de client doar un set de domenii aflate pe o listă de permisiuni, iar un proiect în care Calendar nu este permis pentru el eșuează cu invalid_scope — ai avea nevoie în schimb de un client loopback sau web.

Tokenurile nu părăsesc niciodată serverul. Sunt scrise în secrets.json al serverului, în directorul lui de date, cu cheile google_google:<workspaceId>:<email>, alături de bazele de date și sub aceeași graniță de încredere a sistemului de fișiere al gazdei. Serverul reîmprospătează accesul automat și, când Google invalidează definitiv un cont (o sesiune revocată sau expirată de mult timp), publică CalendarAuthExpired și afișează un banner Reconectează în loc să eșueze în tăcere.

O construcție din surse nu include nicio acreditare Google — îți aduci propriul client id și propriul secret. Construcțiile oficiale de lansare includ un client de cod de dispozitiv neconfidențial, astfel încât fluxul de conectare funcționează imediat; serverul stochează doar un marcaj care îl referă, niciodată o copie. GOOGLE_OAUTH_CLIENT_ID (și secretul lui) din mediu are întotdeauna prioritate față de perechea inclusă. Nu există în mod deliberat un flag --google-client-id: flag-urile necunoscute sunt ignorate, iar un secret de pe linia de comandă poate fi citit prin ps.

Pentru a rula propriul proiect Google, vezi Conectează un Google Calendar.

Serverul preia o fereastră glisantă cu evenimentele fiecărui cont conectat — toate calendarele contului, nu doar cel principal — la fiecare două minute, plus la cerere (pornire, conectare, reîmprospătare manuală). Cadența scurtă este accesibilă pentru că parcurgerea este incrementală: fiecare calendar are propriul token de sincronizare, așa că un calendar neschimbat costă un singur răspuns aproape gol, în loc să reia o fereastră de cinci luni.

Evenimentele recurente sunt extinse pe server, astfel încât niciun client nu analizează vreodată o regulă de recurență. Navigarea la o lună din afara ferestrei curente încarcă acea zonă leneș. Evenimentele șterse sau mutate în afara intervalului sunt reconciliate la următoarea sincronizare.

Vizualizare Ce arată
Lună O grilă completă de lună (bazată pe pachetul kalender)
Săptămână Evenimentele cronometrate ale unei săptămâni, într-o grilă de timp
Zi Evenimentele cronometrate ale unei singure zile, într-o grilă de timp
Agendă O listă derulabilă cu evenimentele viitoare

Deschide calendarul la /calendar; selectarea unui eveniment îi deschide detaliile la /calendar/:eventId. Vizualizarea pe care o alegi este stocată în preferințele proprii ale clientului respectiv, așa că nu te urmărește pe alt dispozitiv.

Un planificator care rulează în fiecare minut caută evenimente ce încep în intervalul de preaviz configurabil și declanșează o notificare „Întâlnirea începe curând” (un eveniment de domeniu MeetingStartingSoon). Notificarea include URL-ul de conectare când există unul, iar clic pe ea deschide detaliile evenimentului. Alertele sunt deduplicate pe baza lui alertedAt al evenimentului, astfel încât aceeași întâlnire nu alertează niciodată de două ori, nici măcar după reporniri, iar un eveniment a cărui oră de începere a trecut cât aplicația era închisă nu se reia niciodată.

Două limite sunt ușor de încălcat. Planificatorul rulează pe client, pe desktop, și doar pentru spațiul de lucru pe care îl ai deschis — un spațiu de lucru în care nu ești nu declanșează nicio alertă. Iar construcția web nu are deloc o conductă de notificări ale sistemului de operare, așa că nu declanșează niciuna.

Dintr-un eveniment de calendar poți porni o înregistrare de întâlnire care preia titlul evenimentului. Control Center stochează o legătură unu-la-unu între înregistrare și eveniment, astfel încât notele întâlnirii și intrarea din calendar rămân conectate fără ca vreuna dintre funcții să depindă de cealaltă.

Pornește înregistrarea și leagă este doar pentru desktop. În clientul web, acțiunea raportează că înregistrarea nu este disponibilă — chiar dacă fluxul propriu de înregistrare al ecranului de întâlniri funcționează în browser.