Перейти до вмісту

Календар і планування

Control Center підключається до Google Calendar, щоб ваш день був поряд із вашим флотом. Він синхронізує ваші події, показує їх у вигляді «Місяць», «Тиждень», «День» і «Розклад», попереджає перед початком зустрічі та перетворює будь-яку подію на записану й резюмовану зустріч.

Майже нічого. Інтеграція отримує події та відображає їх. Вона не створює, не редагує, не видаляє запрошення й не відповідає на них. Кожне підключення за кодом пристрою — вбудоване чи з власним клієнтом — запитує calendar.readonly та openid email.

Події синхронізуються у власну базу даних робочого простору на сервері (<dataDir>/<workspaceId>/workspace.db) і відображаються кожним клієнтом через RPC. Жоден клієнт не зберігає облікових даних Google.

Облікові записи для кожного робочого простору

Розділ із назвою «Облікові записи для кожного робочого простору»

Облікові записи календаря прив’язані до робочого простору, як і все інше в Control Center. Кожен робочий простір підключає власний обліковий запис Google (або кілька), і події та токени одного робочого простору ніколи не видно з іншого. Перемикання робочого простору змінює те, які календарі ви бачите.

Робочий простір може підключити кілька облікових записів Google, наприклад робочий і особистий, і їхні події об’єднуються в одних і тих самих виглядах.

Чому вхід виконується за кодом пристрою

Розділ із назвою «Чому вхід виконується за кодом пристрою»

У headless cc_server немає браузера, щоб перехопити перенаправлення OAuth. Тому він його не використовує: він авторизується через надання дозволу за кодом пристрою (RFC 8628). Сервер показує короткий код користувача та URL Google, ви підтверджуєте на будь-якому пристрої з браузером, а сервер опитує, доки ви це не зробите. Headless-встановлення може підключити обліковий запис саме тому, що не потрібно розміщувати кінцеву точку перенаправлення.

Наслідок, який варто знати, перш ніж використовувати власні облікові дані: тип клієнта має бути «TV and Limited Input devices» від Google. Google надає цьому типу клієнта лише дозволений перелік областей доступу, і проєкт, у якому Calendar для нього не дозволено, завершується помилкою invalid_scope — замість нього знадобиться loopback-клієнт або вебклієнт.

Токени ніколи не залишають сервер. Вони записуються у secrets.json сервера в його каталозі даних із ключем google_google:<workspaceId>:<email>, поряд із базами даних і в межах тієї самої межі довіри файлової системи хоста. Сервер оновлює доступ автоматично, а коли Google остаточно визнає обліковий запис недійсним (відкликаний сеанс або сеанс, що давно завершився), публікує CalendarAuthExpired і показує банер «Підключити знову» замість того, щоб мовчки зазнати невдачі.

Збірка з вихідного коду не містить жодних облікових даних Google — ви надаєте власні ідентифікатор і секрет клієнта. Офіційні релізні збірки вшивають неконфіденційний клієнт із кодом пристрою, щоб підключення працювало одразу; сервер зберігає лише маркер, що на нього посилається, а не його копію. GOOGLE_OAUTH_CLIENT_ID (і його секрет) у змінних середовища завжди має перевагу над вшитою парою. Прапорця --google-client-id навмисно немає: невідомі прапорці ігноруються, а секрет у командному рядку можна прочитати через ps.

Щоб запустити власний проєкт Google, дивіться Підключити Google Calendar.

Сервер отримує ковзне вікно подій кожного підключеного облікового запису — усі календарі цього облікового запису, а не лише основний — що дві хвилини, а також на вимогу (запуск, підключення, ручне оновлення). Така часта періодичність прийнятна, бо прохід є інкрементальним: кожен календар має власний токен синхронізації, тож незмінений календар коштує однієї майже порожньої відповіді, а не повторного отримання вікна на п’ять місяців.

Повторювані події розгортаються на сервері, тож жоден клієнт ніколи не розбирає правило повторення. Перехід до місяця поза поточним вікном ліниво завантажує цей діапазон. Видалені події або події, що вийшли за межі діапазону, прибираються під час наступної синхронізації.

Вигляд Що показує
Місяць Повна сітка місяця (на базі пакета kalender)
Тиждень Події тижня з часом у часовій сітці
День Події одного дня з часом у часовій сітці
Розклад Прокручуваний список майбутніх подій

Відкрийте календар за адресою /calendar; вибір події відкриває її деталі за адресою /calendar/:eventId. Вибраний вигляд зберігається у власних налаштуваннях цього клієнта, тож він не переноситься на інший пристрій.

Планувальник, що запускається щохвилини, сканує події, які починаються в межах налаштовуваного вікна попередження, і надсилає сповіщення «Зустріч незабаром почнеться» (це MeetingStartingSoon, доменна подія). Сповіщення містить URL для приєднання, якщо він є, і натискання на нього відкриває деталі події. Сповіщення дедублікуються за alertedAt події, тож та сама зустріч ніколи не сповіщає двічі, навіть після перезапусків, а подія, чий початок минув, поки застосунок був закритий, ніколи не відтворюється.

На двох обмеженнях легко спіткнутися. Планувальник працює на клієнті, у настільному застосунку і лише для того робочого простору, який у вас відкритий зараз, — робочий простір, у якому вас немає, не надсилає жодного сповіщення. А у вебзбірці взагалі немає конвеєра системних сповіщень ОС, тож вона теж не надсилає жодного.

З події календаря можна почати запис зустрічі, ініціалізований назвою події. Control Center зберігає зв’язок один-до-одного між записом і подією, тож нотатки зустрічі й запис у календарі залишаються пов’язаними, хоча жодна з функцій не залежить від іншої.

Почати запис і прив’язати доступно лише в настільному застосунку. У вебклієнті ця дія повідомляє, що запис недоступний, — хоча власний процес запису на екрані зустрічей у браузері все ж працює.