import type { GuildMember, VoiceBasedChannel } from "discord.js"; import client from "lib/client"; import config from "config"; import { CustomMessageService } from "actions/customMessage/customMessage.service"; export class PomodoroService { customMessageService: CustomMessageService; private activeControllers = new Map(); constructor() { this.customMessageService = new CustomMessageService(); } public async startPomodoroLoop(member: GuildMember, vchannel: VoiceBasedChannel) { const userId = member.id; const controller = new AbortController(); this.activeControllers.set(userId, controller); const minutesWork = vchannel.id === config.discord.vchannelIdPomodoro25 ? 25 : 50; const minutesBreak = minutesWork / 5;//vchannel.id === config.discord.vchannelIdPomodoro25 ? 5 : 10; const signal = controller.signal; try { while (!signal.aborted) { await this.sendMessage(`<@${userId}> 🍅 **pomodoro gestartet!** ${minutesWork} minuten produktivitaet`); const finishedWork = await this.sleep(minutesWork * 60 * 1000, signal); if (!finishedWork) break; await this.sendMessage(`<@${userId}> ☕ **pause!** ${minutesBreak} minuten chillen`); const finishedBreak = await this.sleep(minutesBreak * 60 * 1000, signal); if (!finishedBreak) break; } } catch (err) { if ((err as Error).name !== "AbortError") { console.error("pomodoro fehler:", err); } } finally { this.activeControllers.delete(userId); } } public stopPomodoro(userId: string) { const controller = this.activeControllers.get(userId); if (controller) { controller.abort(); this.activeControllers.delete(userId); } } private async sendMessage(text: string) { const channel = client.channels.cache.get(config.discord.channelIdPomodoro); if (channel?.isTextBased() && channel?.isSendable()) { await channel.send(text); } } private sleep(ms: number, signal: AbortSignal): Promise { return new Promise((resolve, reject) => { const timeout = setTimeout(() => resolve(true), ms); signal.addEventListener("abort", () => { clearTimeout(timeout); resolve(false); }); }); } }