Ir al contenido

Calendario y programación

Control Center se conecta a Google Calendar para que tu día conviva con tu flota. Sincroniza tus eventos, los muestra en las vistas de mes, semana, día y agenda, te avisa antes de que empiece una reunión y convierte cualquier evento en una reunión grabada y resumida.

Casi nada. La integración extrae los eventos y los representa. No crea, edita ni elimina nada, ni responde a invitaciones. Toda conexión mediante código de dispositivo, ya sea la integrada o la tuya propia, solicita calendar.readonly además de openid email.

Los eventos se sincronizan en la base de datos propia del espacio de trabajo en el servidor (<dataDir>/<workspaceId>/workspace.db) y cada cliente los representa por RPC. Ningún cliente guarda credenciales de Google.

Las cuentas de calendario pertenecen al espacio de trabajo, como todo lo demás en Control Center. Cada espacio de trabajo conecta su propia cuenta de Google (o varias), y los eventos y tokens de un espacio de trabajo nunca son visibles desde otro. Cambiar de espacio de trabajo cambia los calendarios que ves.

Un espacio de trabajo puede conectar varias cuentas de Google, como una del trabajo y otra personal, y sus eventos se combinan en las mismas vistas.

Por qué el inicio de sesión es un código de dispositivo

Sección titulada «Por qué el inicio de sesión es un código de dispositivo»

El cc_server headless no tiene ningún navegador que recoja una redirección de OAuth. Por eso no usa ninguna: se autoriza con la concesión de código de dispositivo (RFC 8628). El servidor muestra un código de usuario corto y una URL de Google, tú apruebas en cualquier dispositivo que tenga navegador y el servidor sondea hasta que lo hagas. Una instalación headless puede conectar una cuenta precisamente porque no hay ningún endpoint de redirección que alojar.

La consecuencia que conviene conocer antes de usar tus propias credenciales: el tipo de cliente debe ser el que Google denomina «TV and Limited Input devices». Google solo concede a ese tipo de cliente un conjunto de ámbitos de la lista permitida, y un proyecto en el que Calendar no esté permitido para él falla con invalid_scope; en su lugar necesitarías un cliente de loopback o web.

Los tokens nunca salen del servidor. Se escriben en el secrets.json del servidor, en su directorio de datos, con la clave google_google:<workspaceId>:<email>, junto a las bases de datos y bajo el mismo límite de confianza del sistema de archivos del host. El servidor renueva el acceso automáticamente y, cuando Google invalida una cuenta de forma permanente (una sesión revocada o caducada hace tiempo), publica CalendarAuthExpired y muestra un banner de Reconectar en lugar de fallar en silencio.

Una compilación desde el código fuente no incluye credenciales de Google en absoluto: tú aportas tu propio ID de cliente y tu secreto. Las compilaciones oficiales integran un cliente de código de dispositivo no confidencial para que el flujo de conexión funcione sin configuración previa; el servidor solo guarda un marcador que lo referencia, nunca una copia. GOOGLE_OAUTH_CLIENT_ID (y su secreto) en el entorno siempre tienen prioridad sobre el par integrado. No existe a propósito ninguna opción --google-client-id: las opciones desconocidas se ignoran, y un secreto en una línea de comandos se puede leer con ps.

Para gestionar tu propio proyecto de Google, consulta Conectar un Google Calendar.

El servidor descarga una ventana móvil de los eventos de cada cuenta conectada —todos los calendarios de la cuenta, no solo el principal— cada dos minutos, además de cuando se solicita (al iniciar, al conectar o al actualizar manualmente). Esta cadencia tan corta es asumible porque el barrido es incremental: cada calendario tiene su propio token de sincronización, de modo que un calendario sin cambios cuesta una única respuesta casi vacía en lugar de volver a descargar una ventana de cinco meses.

Los eventos recurrentes se expanden en el servidor, así que ningún cliente analiza jamás una regla de recurrencia. Al navegar a un mes fuera de la ventana actual, ese intervalo se carga de forma diferida. Los eventos eliminados o que han salido del intervalo se reconcilian y desaparecen en la siguiente sincronización.

Vista Qué muestra
Mes Una cuadrícula de un mes completo (con el paquete kalender)
Semana Los eventos con hora de una semana en una cuadrícula temporal
Día Los eventos con hora de un solo día en una cuadrícula temporal
Agenda Una lista desplazable de próximos eventos

Abre el calendario en /calendar; al seleccionar un evento se abre su detalle en /calendar/:eventId. La vista que elijas se guarda en las preferencias de ese cliente, así que no te acompaña a otro dispositivo.

Un planificador que se ejecuta cada minuto busca eventos que empiecen dentro de una ventana de antelación configurable y lanza una notificación de «Reunión a punto de empezar» (un evento de dominio MeetingStartingSoon). La notificación incluye la URL para unirse cuando existe, y al hacer clic en ella se abre el detalle del evento. Los avisos se deduplican con el alertedAt del evento, así que una misma reunión nunca avisa dos veces, ni siquiera entre reinicios, y un evento cuya hora de inicio pasó mientras la aplicación estaba cerrada nunca se repite.

Hay dos límites con los que es fácil tropezar. El planificador se ejecuta en el cliente de escritorio y solo para el espacio de trabajo que tengas abierto en ese momento: un espacio de trabajo en el que no estés no genera ningún aviso. Y la versión web no tiene ninguna canalización de notificaciones del sistema, así que tampoco genera ninguno.

Desde un evento del calendario puedes iniciar una grabación de reunión precargada con el título del evento. Control Center guarda un vínculo uno a uno entre la grabación y el evento, de modo que las notas de la reunión y la entrada del calendario permanecen conectadas sin que ninguna de las dos funciones dependa de la otra.

Grabar y vincular solo está disponible en el escritorio. En el cliente web, la acción informa de que la grabación no está disponible, aunque el propio flujo de grabación de la pantalla de reuniones sí funciona en el navegador.