Przejdź do głównej zawartości

Kalendarz i planowanie

Control Center łączy się z Kalendarzem Google, aby Twój plan dnia był widoczny obok floty. Synchronizuje wydarzenia, pokazuje je w widokach miesiąca, tygodnia, dnia i agendy, ostrzega przed rozpoczęciem spotkania i zamienia dowolne wydarzenie w nagrane i podsumowane spotkanie.

Prawie nic. Integracja pobiera wydarzenia i wyświetla je. Nie tworzy, nie edytuje, nie usuwa wydarzeń ani nie odpowiada na zaproszenia. Każde połączenie przez kod urządzenia — wbudowane lub własne — żąda zakresów calendar.readonly oraz openid email.

Wydarzenia są synchronizowane do własnej bazy danych obszaru roboczego na serwerze (<dataDir>/<workspaceId>/workspace.db) i wyświetlane przez każdego klienta przez RPC. Żaden klient nie przechowuje poświadczeń Google.

Konta kalendarza działają w zakresie obszaru roboczego, podobnie jak wszystko inne w Control Center. Każdy obszar roboczy łączy własne konto Google (lub kilka), a wydarzenia i tokeny jednego obszaru roboczego nigdy nie są widoczne z innego. Przełączenie obszaru roboczego zmienia to, które kalendarze widzisz.

Obszar roboczy może połączyć wiele kont Google, na przykład konto służbowe i prywatne, a ich wydarzenia są scalane w tych samych widokach.

Działający bez interfejsu cc_server nie ma przeglądarki, która przechwyciłaby przekierowanie OAuth. Dlatego z niego nie korzysta: autoryzuje się za pomocą grantu kodu urządzenia (RFC 8628). Serwer wyświetla krótki kod użytkownika i adres URL Google, zatwierdzasz na dowolnym urządzeniu z przeglądarką, a serwer odpytuje, aż to zrobisz. Instalacja headless może połączyć konto właśnie dlatego, że nie trzeba hostować punktu końcowego przekierowania.

Konsekwencja, o której trzeba wiedzieć przed użyciem własnych poświadczeń: typ klienta musi być ustawiony na Google „TV and Limited Input devices”. Google przyznaje temu typowi klienta tylko dozwolony zestaw zakresów, a projekt, w którym Kalendarz nie jest dla niego dozwolony, kończy się błędem invalid_scope — zamiast tego potrzebny byłby klient loopback lub web.

Tokeny nigdy nie opuszczają serwera. Są zapisywane w pliku secrets.json serwera w jego katalogu danych, pod kluczem google_google:<workspaceId>:<email>, obok baz danych i w tej samej granicy zaufania systemu plików hosta. Serwer odświeża dostęp automatycznie, a gdy Google trwale unieważni konto (unieważniona lub dawno wygasła sesja), publikuje CalendarAuthExpired i pokazuje baner Połącz ponownie zamiast po cichu zawodzić.

Kompilacja ze źródeł nie zawiera żadnych poświadczeń Google — dostarczasz własny identyfikator klienta i sekret. Oficjalne kompilacje wydania mają wbudowanego niepoufnego klienta kodu urządzenia, dzięki czemu przepływ łączenia działa od razu; serwer przechowuje tylko znacznik odwołujący się do niego, nigdy kopię. Zmienna GOOGLE_OAUTH_CLIENT_ID (i jej sekret) w środowisku zawsze mają pierwszeństwo przed wbudowaną parą. Celowo nie ma flagi --google-client-id: nieznane flagi są ignorowane, a sekret w wierszu poleceń można odczytać przez ps.

Aby uruchomić własny projekt Google, zobacz Połącz Google Calendar.

Serwer pobiera ruchome okno wydarzeń każdego połączonego konta — wszystkie kalendarze na koncie, nie tylko główny — co dwie minuty, a także na żądanie (start, połączenie, ręczne odświeżenie). Tak krótki interwał jest opłacalny, bo przegląd jest przyrostowy: każdy kalendarz ma własny token synchronizacji, więc niezmieniony kalendarz kosztuje jedną niemal pustą odpowiedź zamiast ponownego pobierania pięciomiesięcznego okna.

Wydarzenia cykliczne są rozwijane po stronie serwera, więc żaden klient nie analizuje reguły powtarzania. Przejście do miesiąca poza bieżącym oknem leniwie wczytuje ten zakres. Usunięte wydarzenia lub te przeniesione poza zakres są uzgadniane przy następnej synchronizacji.

Widok Co pokazuje
Miesiąc Pełna siatka miesiąca (obsługiwana przez pakiet kalender)
Tydzień Wydarzenia z godzinami z całego tygodnia w siatce czasu
Dzień Wydarzenia z godzinami z jednego dnia w siatce czasu
Agenda Przewijana lista nadchodzących wydarzeń

Otwórz kalendarz pod /calendar; wybranie wydarzenia otwiera jego szczegóły pod /calendar/:eventId. Wybrany widok jest zapisywany we własnych preferencjach tego klienta, więc nie przenosi się na inne urządzenie.

Uruchamiany co minutę harmonogram skanuje wydarzenia rozpoczynające się w konfigurowalnym oknie wyprzedzenia i wywołuje powiadomienie „Spotkanie wkrótce się rozpocznie” (MeetingStartingSoon — zdarzenie domenowe). Powiadomienie zawiera adres URL do dołączenia, gdy jest dostępny, a kliknięcie go otwiera szczegóły wydarzenia. Alerty są deduplikowane na podstawie alertedAt wydarzenia, więc to samo spotkanie nigdy nie wywołuje alertu dwa razy, nawet po restarcie, a wydarzenie, którego początek minął, gdy aplikacja była zamknięta, nie zostaje odtworzone.

Dwa ograniczenia łatwo przeoczyć. Harmonogram działa po stronie klienta na komputerze i tylko dla obszaru roboczego, który masz aktualnie otwarty — obszar roboczy, w którym nie jesteś, nie wywołuje alertu. A kompilacja webowa nie ma w ogóle potoku powiadomień systemowych, więc również nie wywołuje żadnych alertów.

Z wydarzenia w kalendarzu możesz rozpocząć nagranie spotkania z wstępnie wypełnionym tytułem wydarzenia. Control Center przechowuje powiązanie jeden do jednego między nagraniem a wydarzeniem, dzięki czemu notatki ze spotkania i wpis w kalendarzu pozostają połączone, a żadna z tych funkcji nie zależy od drugiej.

Rozpocznij nagrywanie i powiąż jest dostępne tylko na komputerze. W kliencie webowym ta akcja zgłasza, że nagrywanie jest niedostępne — mimo że własny przepływ nagrywania na ekranie spotkań działa w przeglądarce.