import type { Plugin } from "../../core/types"; interface NotificationCollectorStorage { lastNotificationCount: number; lastCheckedTime: string; } const notificationCollectorPlugin: Plugin<{}, NotificationCollectorStorage> = { id: "notificationCollector", name: "Notification Collector", description: "Collects and displays SEQTA notifications", version: "1.0.0", settings: {}, disableToggle: true, run: async (api) => { let pollInterval: number | null = null; // Store last notification count in storage if (!api.storage.lastNotificationCount) { api.storage.lastNotificationCount = 0; } const checkNotifications = async () => { try { const alertDiv = document.querySelector( "[class*='notifications__bubble___']", ) as HTMLElement; if (api.storage.lastNotificationCount !== 0) { alertDiv.textContent = api.storage.lastNotificationCount.toString(); } const response = await fetch( `${location.origin}/seqta/student/heartbeat?`, { method: "POST", headers: { "Content-Type": "application/json; charset=utf-8", }, body: JSON.stringify({ timestamp: "1970-01-01 00:00:00.0", hash: "#?page=/home", }), }, ); const data = await response.json(); // Store notification count for history const notificationCount = data.payload.notifications.length; api.storage.lastNotificationCount = notificationCount; api.storage.lastCheckedTime = new Date().toISOString(); if (alertDiv) { alertDiv.textContent = notificationCount.toString(); } else { console.info("[BetterSEQTA+] No notifications currently"); } } catch (error) { console.error("[BetterSEQTA+] Error fetching notifications:", error); } }; const startPolling = () => { if (pollInterval) return; // Already polling checkNotifications(); pollInterval = window.setInterval(checkNotifications, 30000); }; const stopPolling = () => { if (pollInterval) { window.clearInterval(pollInterval); pollInterval = null; const alertDiv = document.querySelector( "[class*='notifications__bubble___']", ) as HTMLElement; if (alertDiv) { if (api.storage.lastNotificationCount > 9) { alertDiv.textContent = "9+"; } else { alertDiv.textContent = api.storage.lastNotificationCount.toString(); } } } }; api.seqta.onMount("[class*='notifications__bubble___']", (_) => { startPolling(); }); return () => { stopPolling(); }; }, }; export default notificationCollectorPlugin;