URLs de assinatura de calendário para aplicativos de calendário externos

Adicionamos uma nova aba Calendário às preferências do usuário que permite assinar feeds do Discourse em aplicativos de calendário externos como Google Agenda, Apple Calendar e Microsoft Outlook.

:down_arrow:

Como funciona

Navegue até sua aba Preferências → Calendário e clique em Gerar URLs de Assinatura. Você receberá botões de assinatura com um clique para:

  • Google Agenda — abre o Google Agenda com o feed pré-preenchido
  • Microsoft Outlook — abre o diálogo de assinatura da web do Outlook
  • Apple Calendar — aciona o aplicativo Calendário nativo via webcal://
  • Copiar URL — para qualquer outro aplicativo de calendário que suporte feeds ICS

Feeds disponíveis

Sempre disponíveis:

  • Lembretes Marcados — seus favoritos que possuem datas de lembrete

Com o plugin discourse-calendar ativado:

  • Todos os Eventos — todos os eventos do fórum
  • Meus Eventos — eventos que você vai participar ou tem interesse

Para desenvolvedores de plugins

Plugins podem registrar feeds ICS adicionais usando a nova API register_calendar_subscription_feed. Feeds registrados dessa forma aparecem automaticamente na aba de preferências do Calendário quando o plugin está ativado.

Segurança

Os URLs de assinatura usam chaves de API de usuário com escopo restritas ao acesso somente leitura no formato ICS. As chaves são limitadas por taxa, e os URLs são exibidos apenas uma vez no momento da geração — os usuários podem regenerar a qualquer momento, o que revoga os URLs antigos.

25 curtidas

Obrigado @Falco, mas como remover as opções corporativas? Acho ofensivo para minha comunidade ter que ver publicidade de serviços proprietários.

1 curtida

Você pode ocultá-lo com CSS.

2 curtidas

Muito obrigado por esta implementação - isso aumentará a usabilidade do plugin de calendário/eventos para muitas comunidades!

Tenho a mesma objeção que @hellekin: dentro do Discourse, estamos em um ambiente de Código Aberto. Em nossa comunidade, ninguém usa o Google Calendar ou o Microsoft. Se os usuários precisarem de um link para esses serviços proprietários, eles devem decidir por si mesmos, não o aplicativo. Portanto, eu preferiria selecionar o tipo de serviço de calendário externo na etapa de criação dos URLs de assinatura (por exemplo, com algumas caixas de seleção), e não mais tarde.

1 curtida

Aprimoramento de “filtro”

Temos várias comunidades em nossa instância do Discourse. Elas são separadas por permissões de grupo e alguns usuários são membros de mais de uma comunidade. Seria conveniente filtrar a URL “Discourse Calendar - All Events” para que ela exiba apenas as entradas do calendário de uma comunidade específica. URL de exemplo

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

Com este aprimoramento, seria possível compartilhar os eventos do Discourse de uma comunidade específica (!) em seu próprio site, por exemplo, com o plugin do WordPress “ICS calendar”.

2 curtidas

Outro pequeno aprimoramento proposto: se você quiser assinar os eventos do Discourse em dois clientes diferentes (por exemplo, Thunderbird em dois dispositivos), você precisa copiar o URL duas vezes. Mas atualmente o URL é exibido apenas uma vez. Se você adicionar um segundo cliente, terá que regenerar os URLs e, assim, perderá os primeiros.

1 curtida

Um feed gerado por um usuário em um desses grupos não funciona dessa maneira? Você testou?

Você precisa copiar apenas uma vez e depois colar nos dois clientes que você precisa.

E se você esquecer um cliente, pode regenerar com um clique.

2 curtidas

Isso é bem legal. Uma ideia de feed também poderia ser o plugin Pesquisas Salvas (Saved Searches)

[quote=“Falco, post:7, topic:398902”]Você precisa copiar apenas uma vez, depois colar nos dois clientes que você precisa.

E se você esquecer um cliente, pode regenerar com um clique.

[/quote]

Eu entendo, mas o meu ponto é a regeneração necessária depois que os URLs são mostrados primeiro.

Se eu usar o link do calendário em dois dispositivos diferentes, eles provavelmente não estarão disponíveis para configuração ao mesmo tempo. Eu acessaria meu perfil do Discourse a partir do primeiro dispositivo e depois novamente a partir do segundo dispositivo. Seria melhor mostrar o URL antigo novamente e invalidá-lo apenas por solicitação explícita.

Se eu for membro de duas comunidades diferentes (e seus grupos de permissão), o “https://discourse.example.com/discourse-post-event/events.ics“ mostra os eventos de ambas as comunidades. Isso está correto até agora. Mas ambas as comunidades podem ter seu próprio website. Se eu quiser compartilhar os eventos do Discourse em seus websites, eu só gostaria de ver os eventos da “comunidade A”, mas não da “comunidade B”. E vice-versa.

1 curtida

Tenho usado isso com o Google Calendar e realmente é ótimo!

No entanto, as alterações nos eventos não parecem estar sendo refletidas aqui, seja edições ou exclusões.

Aqui está o código de incorporação do Google Calendar:

Aqui está o calendário no meu site, onde você pode ver que excluí o Test event number 5 e movi o A fourth test event:

https://spokes.nz/upcoming-events/month/2026/3/1

Sabe por que eles não parecem estar sincronizando com o Google?

1 curtida

O Google Calendar busca atualizações em média duas vezes ao dia, então as alterações podem levar algumas horas para serem refletidas.

2 curtidas

Ah, sim, eles já sincronizaram.

É muito bom saber disso. Não espere que alterações de última hora sejam lançadas ou comunicadas automaticamente!

Isso é semelhante para outros serviços?

1 curtida

Se você está falando dos serviços de agenda de outros provedores, o princípio é o mesmo: 1 a 2 vezes por dia. Na época, não encontrei uma solução para aumentar a frequência de sincronização. Depois, percebi que faz todo sentido, considerando o número de agendas que precisam ser sincronizadas no mundo :rofl: Acho que eles limitam para não saturar os servidores!

Talvez eu esteja enganado.

2 curtidas

Feedback após alguns testes reais:

Contexto: nossa instância do Discourse é compartilhada entre vários grupos/comunidades de usuários, que possuem grupos de permissão separados. Temos uma categoria principal para cada um desses grupos. Essa categoria é publicamente visível e o conteúdo é federado no Fediverse (Discourse ActivityPub). Também exibe um calendário público. Exemplo (https://forum.netzwissen.de/c/meshcore-str/84):

Pasted image 20260401075142.png

O calendário exibe eventos de posts na categoria principal e também em subcategorias. Posts de eventos nas subcategorias (que são visíveis apenas para usuários “logados” com o grupo de permissão da comunidade) não aparecem no calendário principal para usuários anônimos (não logados). Perfeito — esse é o comportamento esperado!

Identifiquei dois requisitos que tornariam o link do calendário ICS “completo em funcionalidades”. Utilizamos o novo link do calendário ICS para compartilhar eventos criados no Discourse nos sites públicos das comunidades (CMS: WordPress).

  1. Os eventos exibidos no arquivo ICS devem ser “filtráveis” por comunidade/grupo de permissão. Sintaxe proposta:
[ics_calendar url="https://discourse.example.com/discourse-post-event/events.ics?user_api_key=[xxxx];group=[discourse_group_id]"]
  1. O arquivo ICS deve exibir apenas eventos com status “público”. Eventos com status “privado” ou “autônomo” geralmente não devem ser publicados no arquivo ICS. Observação: ainda não testei se isso já está implementado…
1 curtida

Essa é uma excelente adição! :clap:

Infelizmente, mesmo com o plugin de Calendário ativado (e que temos usado regularmente), apenas a assinatura de Favoritos está sendo criada quando gero os URLs para o meu usuário. Alguma ideia do porquê isso possa estar acontecendo?

Também concordo com @Thomas_Rother de que os URLs de assinatura devem permanecer visíveis até serem revogados ou regenerados. Dispositivos e aplicativos mudam com o tempo, e ter que reassinar em todos os dispositivos apenas porque você quer adicionar mais um é trabalhoso e parece desnecessário. Talvez isso pudesse ser uma opção de configuração do plugin, dependendo da sensibilidade dos dados dos eventos.

1 curtida

Você precisa ter a configuração Evento de post do Discourse ativado habilitada para que ele apareça.

1 curtida

Usamos eventos de postagem há anos:

Será que pode ser um problema com instalações que usavam o plugin separado antes? Também tentei desativar e reativar o plugin, mas isso não resolveu o problema.

1 curtida

Vim aqui procurando exatamente esse recurso, então estou muito feliz por ele ter sido implementado!

Compartilho o feedback de @hellekin e @Thomas_Rother sobre os links corporativos. Se esses links pudessem ser opcionais, seria ótimo. Muitas pessoas usam o Discourse porque acreditam na soberania digital, então ter esses logotipos aparecendo não é apropriado.

Mais importante ainda é a descoberta do recurso. Ele está escondido nas preferências do usuário, mas seria muito bem-vindo diretamente na navegação da interface do calendário. Clicar em “Próximos eventos” e depois ver um link para se inscrever seria ouro. :1st_place_medal:

1 curtida

A solução está aqui

1 curtida