رفتن به محتوا

تقویم و زمان‌بندی

Control Center به Google Calendar متصل می‌شود تا روزِ کاری شما در کنار ناوگانتان قرار بگیرد. این یکپارچه‌سازی رویدادهای شما را همگام می‌کند، آن‌ها را در نمای ماه، هفته، روز و برنامه نشان می‌دهد، پیش از شروع جلسه به شما هشدار می‌دهد و هر رویداد را به یک جلسهی ضبط‌شده و خلاصه‌شده تبدیل می‌کند.

تقریباً هیچ‌چیز. این یکپارچه‌سازی رویدادها را می‌گیرد و نمایش می‌دهد. دعوت‌نامه‌ها را نمی‌سازد، ویرایش یا حذف نمی‌کند و به آن‌ها پاسخ نمی‌دهد. هر اتصالِ کد دستگاه، چه کلاینتِ داخلی و چه کلاینتِ خودتان، calendar.readonly به‌همراه openid email را درخواست می‌کند.

رویدادها در پایگاه‌دادهٔ خودِ فضای کاری روی سرور (<dataDir>/<workspaceId>/workspace.db) همگام‌سازی می‌شوند و هر کلاینت آن‌ها را روی RPC رندر می‌کند. هیچ کلاینتی اعتبارنامهٔ Google را در اختیار ندارد.

حساب‌های تقویم، مثل هر چیز دیگری در Control Center، در محدودهٔ فضای کاری تعریف می‌شوند. هر فضای کاری حساب Google خودش (یا چند حساب) را متصل می‌کند و رویدادها و توکن‌های یک فضای کاری هرگز از فضای کاری دیگر دیده نمی‌شوند. با جابه‌جا شدن بین فضاهای کاری، تقویم‌هایی که می‌بینید هم عوض می‌شوند.

یک فضای کاری می‌تواند چندین حساب Google را متصل کند، مثلاً یک حساب کاری و یک حساب شخصی؛ رویدادهای آن‌ها در همان نماها ادغام می‌شوند.

چرا ورود با کد دستگاه انجام می‌شود

بخش با عنوان “چرا ورود با کد دستگاه انجام می‌شود”

cc_server بدون رابط، مرورگری ندارد که تغییرمسیر OAuth را دریافت کند. پس از چنین چیزی استفاده نمی‌کند: مجوز را با اعطای کد دستگاه (RFC 8628) می‌گیرد. سرور یک کد کاربر کوتاه و یک نشانی Google نشان می‌دهد، شما روی هر دستگاهی که مرورگر دارد تأیید می‌کنید و سرور تا زمان تأیید شما درخواست‌ها را تکرار می‌کند. یک نصب بدون رابط دقیقاً به این دلیل می‌تواند حساب متصل کند که هیچ نقطهٔ پایانیِ تغییرمسیری برای میزبانی وجود ندارد.

نکته‌ای که پیش از آوردن اعتبارنامه‌های خودتان باید بدانید: نوع کلاینت باید «TV and Limited Input devices» گوگل باشد. 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) ایجاد می‌کند. اعلان در صورت وجود، نشانی پیوستن را با خود دارد و کلیک روی آن جزئیات رویداد را باز می‌کند. هشدارها بر پایهٔ alertedAt روی رویداد یکتا می‌شوند، بنابراین یک جلسه هرگز دو بار هشدار نمی‌دهد، حتی در راه‌اندازی‌های مجدد؛ و رویدادی که زمان شروعش هنگام بسته‌بودن برنامه گذشته باشد، هرگز دوباره پخش نمی‌شود.

دو محدودیت وجود دارد که به‌سادگی شما را غافلگیر می‌کند. این زمان‌بند سمت کلاینت و روی دسکتاپ اجرا می‌شود و فقط برای فضای کاری‌ای که همین حالا باز دارید — فضای کاری‌ای که در آن نیستید هیچ هشداری نمی‌دهد. و نسخهٔ وب اصلاً مسیری برای اعلان سیستم‌عامل ندارد، پس آن هم هیچ هشداری نمی‌دهد.

از روی یک رویداد تقویم می‌توانید یک ضبط جلسه را با عنوان همان رویداد شروع کنید. Control Center پیوندی یک‌به‌یک بین ضبط و رویداد ذخیره می‌کند، بنابراین یادداشت‌های جلسه و ورودی تقویم به‌هم متصل می‌مانند، بدون اینکه هیچ‌یک از این دو قابلیت به دیگری وابسته باشد.

شروع ضبط و پیوند فقط در دسکتاپ در دسترس است. در کلاینت وب، این کنش گزارش می‌دهد که ضبط در دسترس نیست — حتی با اینکه جریان ضبط خودِ صفحهٔ جلسه‌ها در مرورگر کار می‌کند.