İçeriğe geç

Takvim ve zamanlama

Control Center, günün filonun yanında yer alsın diye Google Calendar’a bağlanır. Etkinliklerini eşitler, onları ay, hafta, gün ve ajanda görünümlerinde gösterir, bir toplantı başlamadan önce seni uyarır ve her etkinliği kaydedilmiş, özetlenmiş bir toplantıya dönüştürür.

Neredeyse hiçbir şeyi. Entegrasyon etkinlikleri çeker ve gösterir. Etkinlik oluşturmaz, düzenlemez, silmez veya davetlere yanıt vermez. Yerleşik ya da kendi getirdiğin her cihaz kodu bağlantısı, calendar.readonly ve openid email kapsamlarını ister.

Etkinlikler sunucuda, çalışma alanının kendi veritabanına (<dataDir>/<workspaceId>/workspace.db) eşitlenir ve her istemci tarafından RPC üzerinden görüntülenir. Hiçbir istemci bir Google kimlik bilgisi tutmaz.

Takvim hesapları, Control Center’daki her şey gibi çalışma alanı kapsamındadır. Her çalışma alanı kendi Google hesabını (ya da birkaçını) bağlar ve bir çalışma alanının etkinlikleri ile token’ları başka bir çalışma alanından asla görünmez. Çalışma alanı değiştirmek, gördüğün takvimleri de değiştirir.

Bir çalışma alanı birden çok Google hesabı bağlayabilir; örneğin bir iş hesabı ile bir kişisel hesap ve bunların etkinlikleri aynı görünümlerde birleştirilir.

Headless cc_server’ın bir OAuth yönlendirmesini yakalayacak tarayıcısı yoktur. Bu yüzden tarayıcı kullanmaz: cihaz kodu izniyle (RFC 8628) yetkilendirir. Sunucu kısa bir kullanıcı kodu ile bir Google URL’si gösterir, sen tarayıcısı olan herhangi bir cihazda onaylarsın ve sunucu sen onaylayana kadar yoklar. Headless bir kurulumun bir hesabı bağlayabilmesinin nedeni tam olarak, barındırılacak bir yönlendirme uç noktasının olmamasıdır.

Kendi kimlik bilgilerini getirmeden önce bilmen gereken sonuç şudur: istemci türü Google’ın “TV’ler ve Sınırlı Girdi cihazları” türü olmalıdır. Google bu istemci türüne yalnızca izin listesine alınmış bir kapsam kümesi verir ve Calendar’ın bu tür için izinli olmadığı bir proje invalid_scope ile başarısız olur — bunun yerine bir loopback ya da web istemcisine ihtiyacın olur.

Token’lar sunucudan asla ayrılmaz. Sunucunun veri dizinindeki secrets.json dosyasına, google_google:<workspaceId>:<email> anahtarıyla, veritabanlarının yanına ve aynı ana makine dosya sistemi güven sınırının altına yazılır. Sunucu erişimi otomatik olarak yeniler ve Google bir hesabı kalıcı olarak geçersiz kıldığında (iptal edilmiş ya da süresi çoktan dolmuş bir oturum) sessizce başarısız olmak yerine CalendarAuthExpired yayımlar ve bir yeniden bağlan banner’ı gösterir.

Kaynaktan bir derleme hiç Google kimlik bilgisi içermez — kendi istemci kimliğini ve gizli anahtarını sen sağlarsın. Resmî sürüm derlemeleri, bağlantı akışının kutudan çıktığı gibi çalışması için gizli olmayan bir cihaz kodu istemcisi gömer; sunucu yalnızca ona atıfta bulunan bir işaretçi saklar, asla bir kopyasını değil. Ortamdaki GOOGLE_OAUTH_CLIENT_ID (ve gizli anahtarı) her zaman gömülü çiftin önüne geçer. --google-client-id diye bir bayrak bilinçli olarak yoktur: bilinmeyen bayraklar yok sayılır ve komut satırındaki bir gizli anahtar ps üzerinden okunabilir.

Kendi Google projenle çalışmak için Bir Google Calendar bağlama sayfasına bak.

Sunucu, bağlı her hesabın etkinliklerinden oluşan kayan bir pencereyi çeker — hesaptaki yalnızca birincil takvim değil, her takvim — her iki dakikada bir, ayrıca istendiğinde (başlatma, bağlama, elle yenileme). Kısa sıklık karşılanabilir bir maliyettir, çünkü tarama artımlıdır: her takvim kendi eşitleme token’ını taşır, böylece değişmemiş bir takvim beş aylık bir pencereyi yeniden çekmek yerine neredeyse boş tek bir yanıta mal olur.

Yinelenen etkinlikler sunucu tarafında açılır, böylece hiçbir istemci bir yineleme kuralını ayrıştırmaz. Geçerli pencerenin dışındaki bir aya gidildiğinde o aralık tembelce yüklenir. Silinen ya da aralık dışına taşınan etkinlikler bir sonraki eşitlemede uzlaştırılarak kaldırılır.

Görünüm Neyi gösterir
Ay Tam bir ay ızgarası (kalender paketiyle desteklenir)
Hafta Bir haftanın zamanlanmış etkinlikleri, bir zaman ızgarasında
Gün Tek bir günün zamanlanmış etkinlikleri, bir zaman ızgarasında
Ajanda Yaklaşan etkinliklerin kaydırılabilir listesi

Takvimi /calendar adresinde aç; bir etkinliği seçmek, ayrıntısını /calendar/:eventId adresinde açar. Seçtiğin görünüm o istemcinin kendi tercihlerinde saklanır, dolayısıyla başka bir cihazda peşinden gelmez.

Dakikada bir çalışan bir zamanlayıcı, yapılandırılabilir bir önceden uyarı penceresi içinde başlayan etkinlikleri tarar ve bir “Toplantı yakında başlıyor” bildirimi gönderir (bir MeetingStartingSoon alan olayı). Bildirim, varsa katılım URL’sini taşır ve tıklandığında etkinlik ayrıntısını açar. Uyarılar etkinliğin alertedAt değerine göre yinelenmez, böylece aynı toplantı asla iki kez uyarı vermez; yeniden başlatmalar arasında da, uygulama kapalıyken başlama anı geçmiş bir etkinlik de asla yeniden oynatılmaz.

Kolayca takılabileceğin iki sınır var. Zamanlayıcı masaüstünde, istemci tarafında ve yalnızca o an açık olan çalışma alanı için çalışır — içinde olmadığın bir çalışma alanı hiçbir uyarı vermez. Web yapımında ise hiçbir işletim sistemi bildirim mekanizması yoktur, dolayısıyla o da hiç uyarı vermez.

Bir takvim etkinliğinden, etkinliğin başlığıyla başlatılan bir toplantı kaydı başlatabilirsin. Control Center, kayıt ile etkinlik arasında bire bir bir bağ saklar, böylece toplantının notları ile takvim kaydı, iki özellikten hiçbiri diğerine bağımlı olmadan bağlantılı kalır.

Kaydı başlat ve bağla yalnızca masaüstünde bulunur. Web istemcisinde bu eylem, kaydın kullanılamadığını bildirir — oysa toplantılar ekranının kendi kayıt akışı tarayıcıda çalışır.