import { fetchJson } from "../../http.ts"; import { type OpenMeetEvent } from "../../openmeet/openmeet.ts"; import type { Channel } from "./channel.ts"; const WEEKDAYS = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] as const; function formatEventDate(iso: string): string { const date = Temporal.Instant.from(iso).toZonedDateTimeISO("UTC").toPlainDate(); const day = WEEKDAYS[date.dayOfWeek - 1]!; const mm = String(date.month).padStart(2, "0"); const dd = String(date.day).padStart(2, "0"); return `${day} ${mm}/${dd}`; } function formatEvent(e: OpenMeetEvent): string { const dateStr = formatEventDate(e.startDate); const url = `https://platform.openmeet.net/events/${e.slug}`; return `[${e.name}](${url}) (${dateStr})`; } export const slackOne = (e: OpenMeetEvent): string => `:sparkles: *New event posted:* ${formatEvent(e)}`; export const slackMany = (events: OpenMeetEvent[]): string => events.length === 0 ? ":goose-honk-sob: No events this week." : [":goose-honk-right: **Events this week**", ...events.map((e) => `- ${formatEvent(e)}`)].join( "\n", ); export function slackChannel( token: string, channel: string, apiBase = "https://slack.com/api", ): Channel { const post = async (text: string): Promise => { const result = await fetchJson<{ ok: boolean; error?: string }>( "slack post", `${apiBase}/chat.postMessage`, { method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json; charset=utf-8", }, body: JSON.stringify({ channel, markdown_text: text, unfurl_links: false, unfurl_media: false, }), }, ); // Slack returns 200 with {"ok": false, "error": "..."} for API-level // failures (bad token, channel not found, etc.). if (!result.ok) throw new Error(`slack API error: ${result.error}`); }; return { name: "slack", notifyOne: (e) => post(slackOne(e)), notifyMany: (events) => post(slackMany(events)), }; }