Calendário do Discourse (e Evento)

Você pode usar o que está abaixo e modificar as primeiras condições para especificar suas categorias, e para tornar o botão mais visível, o CSS fará isso: .btn.no-text.btn-icon.toolbar__button.link.custom-create-event-btn {
order: -1;
}

<script>(() => {
  if (!(document.body.classList.contains("category-events") || document.body.classList.contains("category-event2") || document.body.classList.contains("category-event3"))) return;
  const e = ".d-editor-button-bar",
    t = ".btn.no-text.fk-d-menu__trigger.toolbar-menu__options-trigger.toolbar__button.options.toolbar-popup-menu-options",
    n = ".fk-d-menu__inner-content",
    o = ".d-modal.fk-d-menu-modal";
  const c = (e) => {
    const t = e.querySelector('svg use[href="#calendar-day"]');
    return t ? t.closest("button") : null;
  };
  const r = (e, t, n = 4000) => new Promise((o, c) => {
    const r = t(e);
    if (r) return o(r);
    const l = new MutationObserver(() => {
      const n = t(e);
      n && (l.disconnect(), o(n));
    });
    l.observe(e, {
      childList: !0,
      subtree: !0
    });
    setTimeout(() => {
      l.disconnect();
      c();
    }, n);
  });
  const l = (e = 4000) => {
    const t = new MutationObserver(() => {
      document.querySelector(o) && t.disconnect();
    });
    t.observe(document.body, {
      childList: !0,
      subtree: !0
    });
    setTimeout(() => {
      t.disconnect();
    }, e);
  };
  const s = (e) => {
    if (e.querySelector(".custom-create-event-btn")) return;
    const o = document.createElement("button");
    o.className = "btn no-text btn-icon toolbar__button link custom-create-event-btn";
    o.title = "Create event";
    o.innerHTML = '<svg class="fa d-icon d-icon-calendar-day svg-icon"><use href="#calendar-day"></use></svg>';
    e.appendChild(o);
    o.addEventListener("click", async () => {
      const e = document.querySelector(t);
      if (!e) return;
      e.click();
      let o = document.querySelector(n);
      o || (await new Promise((e, t) => {
        const c = new MutationObserver(() => {
          (o = document.querySelector(n)) && (c.disconnect(), e());
        });
        c.observe(document.body, {
          childList: !0,
          subtree: !0
        });
        setTimeout(() => {
          c.disconnect();
          t();
        }, 2000);
      }));
      try {
        (await r(o, c)).click();
        l();
      } catch {}
    });
  };
  const u = new MutationObserver(() => {
    const t = document.querySelector(e);
    t && s(t);
  });
  u.observe(document.body, {
    childList: !0,
    subtree: !0
  });
  const d = document.querySelector(e);
  d && s(d);
})();</script>

Obrigado pela sugestão, ainda sou um pouco novo no Discourse e vou verificar o componente de tema, a colocação do botão é realmente melhor, mas meu outro script para o limite de participantes de eventos pode em breve não ser necessário por causa disso FEATURE: introduce max attendees for events by SamSaffron · Pull Request #34313 · discourse/discourse · GitHub

4 curtidas