UNPKG

@sern/handler

Version:

A complete, customizable, typesafe, & reactive framework for discord bots.

115 lines 4.75 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.presenceHandler = void 0; const ioc_1 = require("../core/ioc"); const Files = __importStar(require("../core/module-loading")); const parseConfig = async (conf, setPresence) => { const result = await conf; if ('repeat' in result) { const { onRepeat, repeat } = result; // Validate configuration if (repeat === undefined) { throw new Error("repeat option is undefined"); } if (onRepeat === undefined) { throw new Error("onRepeat callback is undefined, but repeat exists"); } // Initial state let currentState = result; const processState = async (state) => { try { const result = onRepeat(state); // If it's a promise, await it, otherwise use the value directly return result instanceof Promise ? await result : result; } catch (error) { // TODO process error //console.error(error); return state; // Return previous state on error } }; // Handle numeric interval if (typeof repeat === 'number') { // Return a promise that never resolves (or resolves on cleanup) return new Promise((resolve) => { // Immediately return initial state processState(currentState); // Set up interval let isProcessing = false; const intervalId = setInterval(() => { // Skip if previous operation is still running if (isProcessing) return; isProcessing = true; processState(currentState) .then(newState => { currentState = newState; return setPresence(currentState); }) .catch(console.error) .finally(() => { isProcessing = false; }); }, repeat); // Optional: Return cleanup function return () => clearInterval(intervalId); }); } // Handle event-based repeat else { const handler = async () => { currentState = await onRepeat(currentState); await setPresence(currentState); }; let has_registered = false; return new Promise((resolve) => { const [target, eventName] = repeat; // Immediately return initial state processState(currentState); // Set up event listener if (!has_registered) { target.addListener(eventName, handler); has_registered = true; } // Optional: Return cleanup function return () => target.removeListener(eventName, handler); }); } } // No repeat configuration, just return the result return setPresence(result); }; const presenceHandler = async (path, setPresence) => { const presence = await Files.importModule(path) .then(({ module }) => { //fetch services with the order preserved, passing it to the execute fn const fetchedServices = (0, ioc_1.Services)(...module.inject ?? []); return async () => module.execute(...fetchedServices); }); return parseConfig(presence(), setPresence); }; exports.presenceHandler = presenceHandler; //# sourceMappingURL=presence.js.map