added pomodoro function
All checks were successful
release-tag / release-image (push) Successful in 56s
All checks were successful
release-tag / release-image (push) Successful in 56s
This commit is contained in:
parent
c1f0ae670d
commit
56ec6a1ad8
@ -24,7 +24,7 @@ export class DynamicVChannelService {
|
||||
|
||||
async createVChannel(
|
||||
newState: VoiceState,
|
||||
channel: VoiceBasedChannel,
|
||||
channel: VoiceBasedChannel
|
||||
): Promise<StageChannel | VoiceChannel> {
|
||||
//console.log("createChannel()");
|
||||
const newVChannel = await channel.clone({
|
||||
@ -41,10 +41,9 @@ export class DynamicVChannelService {
|
||||
newChannel: StageChannel | VoiceChannel,
|
||||
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
||||
channelListeners: Map<any, any>,
|
||||
channelListener: (oldState: VoiceState, newState: VoiceState) => void,
|
||||
channelListener: (oldState: VoiceState, newState: VoiceState) => void
|
||||
) {
|
||||
//console.log("deleteChannel()");
|
||||
|
||||
if (
|
||||
oldState.channelId === newChannel.id ||
|
||||
newState.channelId === newChannel.id
|
||||
|
@ -133,6 +133,7 @@ export class GreetingService {
|
||||
}
|
||||
}
|
||||
|
||||
// unused
|
||||
async greet() {
|
||||
client.user?.setActivity("guten morgen! :3", { type: 4 });
|
||||
console.log("set activity: awake");
|
||||
@ -142,13 +143,14 @@ export class GreetingService {
|
||||
|
||||
const channels = client.channels;
|
||||
|
||||
const channel = channels.cache.get(config.discord.testChannel);
|
||||
const channel = channels.cache.get(config.discord.channelIdOffTopic);
|
||||
|
||||
if (channel?.isTextBased && channel?.isSendable()) {
|
||||
await channel.send({ content: this.getContent(false) });
|
||||
}
|
||||
}
|
||||
|
||||
// unused
|
||||
async sleep() {
|
||||
client.user?.setActivity("zzzzZZ..", { type: 4 });
|
||||
console.log("set activity: asleep");
|
||||
@ -158,7 +160,7 @@ export class GreetingService {
|
||||
|
||||
const channels = client.channels;
|
||||
|
||||
const channel = channels.cache.get(config.discord.testChannel);
|
||||
const channel = channels.cache.get(config.discord.channelIdOffTopic);
|
||||
|
||||
if (channel?.isTextBased && channel?.isSendable()) {
|
||||
await channel.send({ content: this.getContent(true) });
|
||||
@ -172,9 +174,10 @@ export class GreetingService {
|
||||
status: "online",
|
||||
});
|
||||
|
||||
// unused
|
||||
/*const channels = client.channels;
|
||||
|
||||
const channel = channels.cache.get(config.discord.channelId);
|
||||
const channel = channels.cache.get(config.discord.channelIdOffTopic);
|
||||
|
||||
if (channel?.isTextBased && channel?.isSendable()) {
|
||||
await channel.send({ content: "frohes neues! @everyone" });
|
||||
|
0
src/actions/pomodoro/pomodoro.components.ts
Normal file
0
src/actions/pomodoro/pomodoro.components.ts
Normal file
41
src/actions/pomodoro/pomodoro.controller.ts
Normal file
41
src/actions/pomodoro/pomodoro.controller.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import config from "config";
|
||||
import { Events, NewsChannel, type VoiceState } from "discord.js";
|
||||
import client from "lib/client";
|
||||
import EventEmitter from "node:events";
|
||||
import { PomodoroService } from "actions/pomodoro/pomodoro.service";
|
||||
|
||||
export default class PomodoroController extends EventEmitter {
|
||||
private pomodoroService: PomodoroService;
|
||||
private activePomodoros = new Set<string>();
|
||||
private pomodoroChannels = [config.discord.vchannelIdPomodoro25, config.discord.vchannelIdPomodoro50];
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.pomodoroService = new PomodoroService();
|
||||
|
||||
client.on(Events.VoiceStateUpdate, async (oldState, newState) => {
|
||||
const userId = newState.id;
|
||||
|
||||
const joinedPomodoroVC = newState.channelId != null && this.pomodoroChannels.includes(newState.channelId) &&
|
||||
oldState.channelId !== newState.channelId;
|
||||
|
||||
const leftPomodoroVC = oldState.channelId != null && this.pomodoroChannels.includes(oldState.channelId) &&
|
||||
newState.channelId !== config.discord.vchannelIdPomodoro25;
|
||||
|
||||
if (joinedPomodoroVC && !this.activePomodoros.has(userId)) {
|
||||
const member = newState.member;
|
||||
const vchannel = newState.channel;
|
||||
if (!member || !vchannel) return;
|
||||
|
||||
this.activePomodoros.add(userId);
|
||||
this.pomodoroService.startPomodoroLoop(member, vchannel);
|
||||
}
|
||||
|
||||
if (leftPomodoroVC && this.activePomodoros.has(userId)) {
|
||||
this.pomodoroService.stopPomodoro(userId);
|
||||
this.activePomodoros.delete(userId);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
67
src/actions/pomodoro/pomodoro.service.ts
Normal file
67
src/actions/pomodoro/pomodoro.service.ts
Normal file
@ -0,0 +1,67 @@
|
||||
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<string, AbortController>();
|
||||
|
||||
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<boolean> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const timeout = setTimeout(() => resolve(true), ms);
|
||||
signal.addEventListener("abort", () => {
|
||||
clearTimeout(timeout);
|
||||
resolve(false);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
@ -1,8 +1,6 @@
|
||||
export default {
|
||||
discord: {
|
||||
// test
|
||||
testChannel: process.env.DISCORD_TEST_CHANNEL_ID || "",
|
||||
|
||||
version: 250508.2150,
|
||||
// avocadi
|
||||
serverID: process.env.DISCORD_SERVER_ID || "",
|
||||
// texxt channel
|
||||
@ -15,11 +13,14 @@ export default {
|
||||
channelIdIntroduction: process.env.DISCORD_CHANNEL_ID_INTRODUCTION || "",
|
||||
channelIdOffTopic: process.env.DISCORD_CHANNEL_ID_OFF_TOPIC || "",
|
||||
channelIdHelp: process.env.DISCORD_CHANNEL_ID_HELP || "",
|
||||
// voice channel#
|
||||
channelIdPomodoro: process.env.DISCORD_CHANNEL_ID_POMODORO || "",
|
||||
// voice channel
|
||||
vchannelIdForTwo: process.env.DISCORD_VCHANNEL_ID_FOR_TWO || "",
|
||||
vchannelIdForThree: process.env.DISCORD_VCHANNEL_ID_FOR_THREE || "",
|
||||
vchannelIdForFour: process.env.DISCORD_VCHANNEL_ID_FOR_FOUR || "",
|
||||
vchannelIdForGroup: process.env.DISCORD_VCHANNEL_ID_FOR_GROUP || "",
|
||||
vchannelIdPomodoro25: process.env.DISCORD_VCHANNEL_ID_POMODORO_25_5 || "",
|
||||
vchannelIdPomodoro50: process.env.DISCORD_VCHANNEL_ID_POMODORO_50_10 || "",
|
||||
// roles
|
||||
roleStudy: process.env.PEOPLE || "",
|
||||
roleMod: process.env.MOD || "",
|
||||
|
@ -24,23 +24,22 @@ import { DmService } from "actions/dm/dm.service";
|
||||
import { CustomMessageService } from "actions/customMessage/customMessage.service";
|
||||
import { DynamicVChannelService } from "actions/dynamicVChannel/dynamicVChannel.service";
|
||||
import { ReactRolesService } from "actions/reactRole/reactRoles.service";
|
||||
import { PomodoroService } from "actions/pomodoro/pomodoro.service";
|
||||
import config from "config";
|
||||
|
||||
export default class DiscordController extends EventEmitter {
|
||||
private discordService!: DiscordService;
|
||||
waterMeService: WaterMeService;
|
||||
greetingService: GreetingService;
|
||||
medicationService: MedicationService;
|
||||
helpService: HelpService;
|
||||
supportService: SupportService;
|
||||
activityService: ActivityService;
|
||||
dmService: DmService;
|
||||
customMessageService: CustomMessageService;
|
||||
channelListeners = new Map();
|
||||
dynamicVChannelService: DynamicVChannelService;
|
||||
reactRolesService: ReactRolesService;
|
||||
version = 250507.19;
|
||||
private discordService: DiscordService;
|
||||
private waterMeService: WaterMeService;
|
||||
private greetingService: GreetingService;
|
||||
private medicationService: MedicationService;
|
||||
private helpService: HelpService;
|
||||
private supportService: SupportService;
|
||||
private activityService: ActivityService;
|
||||
private dmService: DmService;
|
||||
private customMessageService: CustomMessageService;
|
||||
private channelListeners = new Map();
|
||||
private dynamicVChannelService: DynamicVChannelService;
|
||||
private reactRolesService: ReactRolesService;
|
||||
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
@ -138,7 +137,7 @@ export default class DiscordController extends EventEmitter {
|
||||
}
|
||||
},
|
||||
);
|
||||
console.log(`----------------\nversion ${this.version}\n----------------`);
|
||||
console.log(`----------------\nversion ${config.discord.version}\n----------------`);
|
||||
}
|
||||
|
||||
async setActivity() {
|
||||
|
@ -3,9 +3,12 @@ import "actions/greeting/greeting.task";
|
||||
import "actions/medication/medication.task";
|
||||
import "actions/drink/drink.task";
|
||||
import DiscordController from "discord.controller";
|
||||
import PomodoroController from "actions/pomodoro/pomodoro.controller";
|
||||
|
||||
import "dotenv/config";
|
||||
|
||||
// bootstrap application
|
||||
const discordController = new DiscordController();
|
||||
const pomodoroController = new PomodoroController();
|
||||
|
||||
discordController.init();
|
Loading…
x
Reference in New Issue
Block a user