URL-адреса подписки на календарь для внешних приложений календаря

Мы добавили новую вкладку Календарь в настройки пользователя, которая позволяет подписаться на ленты Discourse в сторонних календарных приложениях, таких как Google Календарь, Apple Календарь и Microsoft Outlook.

:down_arrow:

Как это работает

Перейдите на вкладку Настройки → Календарь и нажмите Сгенерировать URL-адреса подписки. Вы получите кнопки для подписки в один клик для:

  • Google Календарь — откроет Google Календарь с предварительно заполненной лентой
  • Microsoft Outlook — откроет веб-диалог подписки Outlook
  • Apple Календарь — запустит родное приложение «Календарь» через webcal://
  • Копировать URL — для любых других календарных приложений, поддерживающих ICS-ленты

Доступные ленты

Всегда доступны:

  • Напоминания по закладкам — ваши закладки с установленными датами напоминаний

При включённом плагине discourse-calendar:

  • Все события — все события форума
  • Мои события — события, на которые вы планируете пойти или которые вас интересуют

Для разработчиков плагинов

Плагины могут регистрировать дополнительные ICS-ленты с помощью нового API register_calendar_subscription_feed. Ленты, зарегистрированные таким образом, автоматически отображаются на вкладке «Календарь» в настройках, когда плагин включён.

Безопасность

URL-адреса подписки используют ограниченные ключи API пользователя с доступом только для чтения в формате ICS. Ключи имеют ограничение скорости запросов, а URL-адреса отображаются только один раз при генерации — пользователи могут сгенерировать их заново в любое время, что отменяет действие старых URL.

25 лайков

Спасибо, @Falco, но как убрать корпоративные опции? Мне кажется оскорбительным, что моё сообщество вынуждено видеть рекламу проприетарных сервисов.

1 лайк

Вы можете скрыть это с помощью CSS.

2 лайка

Большое спасибо за эту реализацию — это повысит удобство использования плагина календаря/событий для многих сообществ!

У меня та же возражение, что и у @hellekin: в рамках Discourse мы находимся в среде с открытым исходным кодом. В нашем сообществе никто не использует ни Google Calendar, ни Microsoft. Если пользователям нужны ссылки на эти проприетарные сервисы, они должны решать это самостоятельно, а не приложение. Поэтому я предпочитаю выбирать тип внешнего сервиса календаря на этапе создания URL-адресов подписки (например, с помощью некоторых флажков), а не позже.

1 лайк

Улучшение фильтрации «filter»

У нас на экземпляре Discourse работает несколько сообществ. Они разделены правами доступа по группам, и некоторые пользователи состоят более чем в одном сообществе. Было бы удобно добавить возможность фильтрации URL «Discourse Calendar - All Events», чтобы отображались только календарные записи конкретного сообщества. Пример URL:

https://discourse.example.com/discourse-post-event/events.ics?user_api_key=c2aa22d800dd473b62d199d796742382&group=[groupname]

С этим улучшением появится возможность публиковать события Discourse конкретного (!) сообщества на собственном сайте, например, с помощью плагина WordPress «ICS calendar».

2 лайка

Ещё одно небольшое предлагаемое улучшение: если вы хотите подписаться на события Discourse с двух разных клиентов (например, Thunderbird на двух устройствах), вам нужно скопировать URL дважды. Однако в настоящее время URL отображается только один раз. Если вы добавите второй клиент, вам придётся сгенерировать URL заново, и вы потеряете первые ссылки.

1 лайк

Разве лента, сгенерированная пользователем из одной из этих групп, уже не работает таким образом? Вы пробовали?

Достаточно скопировать его один раз, а затем вставить в оба необходимых клиента.

А если вы забудете добавить один из клиентов, вы сможете сгенерировать ссылку заново одним кликом.

2 лайка

Это довольно круто. Идея с лентой также может быть реализована через плагин «Сохранённые запросы».

Я понимаю, но моя мысль касается необходимости повторной генерации после того, как ссылки будут показаны впервые.

Если я использую ссылку календаря на двух разных устройствах, они, вероятно, не будут доступны для настройки одновременно. Я бы зашёл в свой профиль Discourse с первого устройства, а позже — со второго. Было бы лучше, если бы старая ссылка отображалась снова, и она становилась недействительной только по явной просьбе.

Если я являюсь участником двух разных сообществ (и их групп разрешений), ссылка «https://discourse.example.com/discourse-post-event/events.ics» отображает события обоих сообществ. Пока всё верно. Но у обоих сообществ могут быть свои собственные веб-сайты. Если я захочу разместить события из Discourse на их сайтах, мне нужно видеть только события «сообщества А», а не «сообщества Б». И наоборот.

1 лайк

Я использую это с Google Календарём, и это действительно здорово!

Однако изменения событий, похоже, не синхронизируются здесь — будь то редактирование или удаление.

Есть какие-то идеи, почему они не синхронизируются с Google?

1 лайк

Google Calendar в среднем обновляется дважды в день, поэтому изменения могут отображаться в течение нескольких часов.

2 лайка

Ах да, они теперь синхронизированы.

Это очень хорошая новость. Не ожидайте, что последние изменения будут автоматически применены или сообщены!

Аналогично ли это для других сервисов?

1 лайк

Если ты говоришь о календарных сервисах других провайдеров, то принцип тот же — 1–2 раза в день. В своё время я не нашёл решения, чтобы увеличить количество синхронизаций. Позже я подумал, что это вполне нормально, учитывая, сколько календарей нужно синхронизировать по всему миру :rofl: Думаю, они ограничивают это, чтобы не перегружать свои серверы!

Возможно, я ошибаюсь.

2 лайка

Отзыв после реального тестирования:

Контекст: наш экземпляр Discourse используется несколькими группами пользователей/сообществами, у которых есть свои отдельные группы разрешений. Для каждой из этих групп есть главная категория. Эта категория публично видна, а её контент передаётся в Fediverse (Discourse ActivityPub). Также отображается публичный календарь. Пример (https://forum.netzwissen.de/c/meshcore-str/84):

Pasted image 20260401075142.png

Календарь отображает события из постов в главной категории, а также из подкатегорий. Посты со событиями в подкатегориях (которые видны только «авторизованным» пользователям с соответствующей группой разрешений сообщества) не показываются в основном календаре для анонимных пользователей (не авторизованных). Отлично — это ожидаемое поведение!

Я вижу два требования, которые сделают ссылку на ICS-календарь «полностью функциональной». Мы используем новую ссылку на ICS-календарь для публикации событий, созданных в Discourse, на публичных сайтах сообществ (CMS: WordPress).

  1. События, отображаемые в ICS-файле, должны быть «отфильтрованы» по сообществу/группе разрешений. Предлагаемый синтаксис:
[ics_calendar url="https://discourse.example.com/discourse-post-event/events.ics?user_api_key=[xxxx];group=[discourse_group_id]"]

  1. ICS-файл должен отображать только события со статусом «public». События со статусом «private» или «standalone» в целом не должны публиковаться в ICS-файле. Примечание: я ещё не проверял, реализовано ли это уже…
1 лайк

Отличное дополнение! :clap:

К сожалению, даже несмотря на то, что плагин «Календарь» включен (и мы регулярно его используем), при генерации URL-адресов для моего пользователя создаётся только подписка «Закладки». Есть какие-то идеи, почему это может происходить?

Я также согласен с @Thomas_Rother: URL-адреса подписок должны отображаться до момента их отмены или повторной генерации. Устройства и приложения со временем меняются, и необходимость повторно подписываться на всех устройствах только потому, что вы хотите добавить ещё одно, утомительна и кажется излишней. Возможно, это можно сделать опцией конфигурации плагина, в зависимости от чувствительности данных событий.

1 лайк

Чтобы это отображалось, необходимо включить настройку «Включено событие поста Discourse».

1 лайк

Мы уже несколько лет используем пост-события:

Может ли это быть проблемой для установок, которые ранее использовали отдельный плагин? Я также пробовал деактивировать и повторно активировать плагин, но это не решило проблему.

Редактирование: Только что подтвердил — события больше не отображаются в постах. Таким образом, это проблема миграции плагина, а не функции подписки. Разберёмся, что произошло.

1 лайк

Я пришел сюда именно ради этой функции, поэтому так рад, что она была реализована!

Поддерживаю мнение @hellekin и @Thomas_Rother о корпоративных ссылках. Было бы отлично, если бы их можно было сделать опциональными. Многие используют Discourse, потому что верят в цифровой суверенитет, поэтому появление этих логотипов здесь неуместно.

Ещё важнее — доступность функции. Сейчас она спрятана в настройках пользователя, но было бы здорово видеть её прямо в навигации интерфейса календаря. Нажать «Ближайшие события» и сразу увидеть ссылку для подписки — это было бы просто золото. :1st_place_medal:

2 лайка

Решение находится здесь

1 лайк