콘텐츠로 이동

캘린더와 일정

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로 실패합니다. 그런 경우에는 대신 루프백 또는 웹 클라이언트가 필요합니다.

토큰은 서버를 떠나지 않습니다. 데이터 디렉터리의 secrets.json에 google_google:<workspaceId>:<email> 키로 기록되며, 데이터베이스와 나란히, 동일한 호스트 파일 시스템 신뢰 경계 아래에 놓입니다. 서버는 액세스를 자동으로 갱신하며, Google이 계정을 영구적으로 무효화하면(취소되었거나 오래 만료된 세션) CalendarAuthExpired를 게시하고 조용히 실패하는 대신 다시 연결 배너를 표시합니다.

소스에서 빌드한 버전에는 Google 자격 증명이 전혀 포함되지 않습니다. 클라이언트 ID와 시크릿은 직접 제공합니다. 공식 릴리스 빌드는 기밀 정보가 필요 없는 기기 코드 클라이언트를 내장해 연결 흐름이 바로 작동합니다. 서버는 이를 참조하는 표시만 저장하고 사본은 저장하지 않습니다. 환경의 GOOGLE_OAUTH_CLIENT_ID(및 해당 시크릿)는 항상 내장된 값보다 우선합니다. --google-client-id 플래그는 의도적으로 없습니다. 알 수 없는 플래그는 무시되며, 명령줄에 있는 시크릿은 ps로 읽을 수 있기 때문입니다.

직접 Google 프로젝트를 운영하려면 Google Calendar 연결을 참고하십시오.

서버는 연결된 각 계정의 이벤트, 즉 기본 캘린더만이 아니라 계정의 모든 캘린더를 2분마다 롤링 윈도우로 가져오며, 필요할 때(시작, 연결, 수동 새로 고침)에도 가져옵니다. 이렇게 짧은 주기가 가능한 것은 스윕이 증분 방식이기 때문입니다. 각 캘린더는 자체 동기화 토큰을 가지므로, 변경되지 않은 캘린더는 5개월 윈도우를 다시 가져오는 대신 거의 빈 응답 하나만 소비합니다.

반복 이벤트는 서버 쪽에서 확장되므로 어떤 클라이언트도 반복 규칙을 파싱하지 않습니다. 현재 윈도우 밖의 달로 이동하면 해당 범위를 지연 로드합니다. 삭제되었거나 범위 밖으로 이동한 이벤트는 다음 동기화에서 정리됩니다.

뷰 표시 내용
월 한 달 전체 그리드(kalender 패키지 사용)
주 한 주의 시간 지정 이벤트를 시간 그리드로
일 하루의 시간 지정 이벤트를 시간 그리드로
아젠다 다가오는 이벤트의 스크롤 가능한 목록

캘린더는 /calendar에서 열며, 이벤트를 선택하면 /calendar/:eventId에서 상세가 열립니다. 선택한 뷰는 그 클라이언트 자체 환경설정에 저장되므로 다른 기기로 따라가지 않습니다.

1분마다 실행되는 스케줄러가 구성 가능한 사전 알림 구간 안에 시작하는 이벤트를 검사하고 “회의가 곧 시작됩니다” 알림(MeetingStartingSoon 도메인 이벤트)을 발생시킵니다. 알림에는 참가 URL이 있을 때 그것이 함께 실리며, 클릭하면 이벤트 상세가 열립니다. 알림은 이벤트의 alertedAt을 기준으로 중복 제거되므로, 재시작을 넘어서도 같은 회의가 두 번 알리지 않으며, 앱이 닫혀 있는 동안 시작 시각이 지난 이벤트도 다시 재생되지 않습니다.

쉽게 걸려 넘어질 수 있는 두 가지 제한이 있습니다. 스케줄러는 데스크톱의 클라이언트 측에서 실행되며 현재 열어 둔 워크스페이스에만 적용됩니다. 들어가 있지 않은 워크스페이스는 알림을 발생시키지 않습니다. 그리고 웹 빌드에는 OS 알림 파이프라인이 전혀 없으므로 웹에서도 알림이 발생하지 않습니다.

캘린더 이벤트에서 이벤트 제목을 초깃값으로 한 회의 녹음을 시작할 수 있습니다. Control Center는 녹음과 이벤트 사이에 일대일 링크를 저장하므로, 어느 기능도 서로에 의존하지 않으면서 회의 노트와 캘린더 항목이 연결된 상태로 유지됩니다.

녹음 시작 및 연결은 데스크톱 전용입니다. 웹 클라이언트에서 이 작업은 녹음이 사용할 수 없다고 알립니다. 회의 화면 자체의 녹음 흐름은 브라우저에서 작동하는데도 그렇습니다.