跳转到内容

日历与日程

Control Center 会连接到 Google Calendar,让你的日程与机群并排呈现。它会同步你的事件,在月、周、日和议程视图中显示它们,在会议开始前提醒你,并把任意事件变成一场录制并总结了内容的会议。

几乎什么都不改。该集成只拉取事件并把它们渲染出来。它不会创建、编辑或删除事件,也不会回复邀请。无论是内置客户端还是自带客户端,每一次设备码连接都会请求 calendar.readonly 以及 openid email。

事件会同步到工作区自己的数据库中,该数据库位于服务器上(<dataDir>/<workspaceId>/workspace.db),并由每个客户端通过 RPC 渲染。没有任何客户端持有 Google 凭据。

日历账户与工作区绑定,Control Center 中的其他一切也是如此。每个工作区都连接自己的 Google 账户(可以是一个或多个),一个工作区的事件和令牌永远无法从另一个工作区看到。切换工作区,你看到的日历也随之切换。

一个工作区可以连接多个 Google 账户,例如一个工作账户和一个个人账户,它们的事件会合并到相同的视图中。

无界面的 cc_server 没有浏览器来接收 OAuth 重定向。因此它不使用重定向,而是通过设备码授权(RFC 8628)完成授权。服务器显示一个简短的验证码和一个 Google URL,你在任何有浏览器的设备上批准,服务器会轮询直到你批准为止。无界面安装之所以能连接账户,正是因为无需托管任何重定向端点。

在自带凭据之前需要了解的后果是:客户端类型必须是 Google 的 “TV and Limited Input devices”。Google 只向该客户端类型授予允许列表中的一组作用域,如果某个项目未获准将它用于 Calendar,则会以 invalid_scope 失败——这种情况下你需要改用环回客户端或 Web 客户端。

令牌永远不会离开服务器。它们会写入服务器数据目录中的 secrets.json,键为 google_google:<workspaceId>:<email>,与数据库放在一起,并处于同一主机文件系统信任边界之内。服务器会自动刷新访问权限;当 Google 永久性地使某个账户失效时(会话被撤销或长期过期),服务器会发布 CalendarAuthExpired,并显示重新连接横幅,而不是静默失败。

从源码构建的版本完全不附带 Google 凭据——客户端 ID 和密钥由你自己提供。官方发行版会内置一个非机密的设备码客户端,因此连接流程开箱即用;服务器只保存一个引用它的标记,绝不保存副本。环境中的 GOOGLE_OAUTH_CLIENT_ID(及其密钥)始终优先于内置的这一对。这里刻意不提供 --google-client-id 标志:未知标志会被忽略,而命令行上的密钥可以通过 ps 读到。

若要运行你自己的 Google 项目,请参阅连接 Google Calendar。

服务器会拉取每个已连接账户事件的滚动窗口——账户上的所有日历,而不只是主日历——每两分钟一次,另外还会按需拉取(启动时、连接时、手动刷新时)。这么短的间隔之所以可承受,是因为扫描是增量的:每个日历都带有自己的同步令牌,因此未变化的日历只需一次几乎为空的响应,而不必重新拉取五个月的窗口。

重复事件在服务器端展开,因此没有任何客户端需要解析重复规则。导航到当前窗口之外的月份时,会延迟加载该范围。被删除或移出范围的事件会在下一次同步时对账清除。

视图 显示内容
月 完整的月网格(由 kalender 包提供支持)
周 一周中的定时事件,按时间网格显示
日 单日的定时事件,按时间网格显示
议程 可滚动的即将到来事件列表

在 /calendar 打开日历;选择一个事件会在 /calendar/:eventId 打开它的详情。你选择的视图保存在该客户端自己的偏好设置中,因此不会跟随你到其他设备。

每分钟运行一次的调度器会扫描在可配置的提前窗口内开始的事件,并触发 “会议即将开始” 通知(一个 MeetingStartingSoon 领域事件)。通知在存在参会链接时会带上它,点击即可打开事件详情。提醒会根据事件的 alertedAt 去重,因此同一场会议绝不会提醒两次,即使跨重启也是如此;而在应用关闭期间已经过了开始时间的事件也绝不会补报。

有两个限制很容易被忽略。调度器在桌面端的客户端本地运行,而且只针对你当前打开的工作区——你不在其中的工作区不会发出任何提醒。另外,Web 版本完全没有操作系统通知管线,因此也不会发出提醒。

从日历事件出发,你可以开始一次会议录制,并以该事件的标题预填。Control Center 会在录制与该事件之间保存一对一的关联,因此会议笔记与日历条目保持关联,而两个功能都不依赖对方。

开始录制并关联仅限桌面端。在 Web 客户端上,该操作会提示录制不可用——尽管会议界面自身的录制流程在浏览器中确实可以正常工作。