From 2dffdfcb5b91848c6a37d02a3f082b9d670bb6a5 Mon Sep 17 00:00:00 2001 From: Vermium Sifell Date: Mon, 30 May 2022 17:29:06 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=9A=20schedule=20handler=20is=20now=20?= =?UTF-8?q?a=20manager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/handlers/schedules/index.ts | 24 ------------------------ src/index.ts | 4 ++-- src/interfaces/Job.ts | 8 ++++++++ src/jobs/shopRoles.ts | 30 +++++------------------------- src/managers/schedule/index.ts | 29 +++++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 51 deletions(-) delete mode 100644 src/handlers/schedules/index.ts create mode 100644 src/interfaces/Job.ts create mode 100644 src/managers/schedule/index.ts diff --git a/src/handlers/schedules/index.ts b/src/handlers/schedules/index.ts deleted file mode 100644 index c6a1cef..0000000 --- a/src/handlers/schedules/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Dependencies -import { Client } from "discord.js"; -import schedule from "node-schedule"; - -import logger from "../../logger"; - -// Jobs -import shopRoles from "../../jobs/shopRoles"; - -export default async (client: Client) => { - const expression = "*/5 * * * *"; - - schedule.scheduleJob(expression, async () => { - logger.info("Running jobs."); - - await shopRoles(client) - .then(() => { - logger.info("Shop roles job finished."); - }) - .catch((err) => { - logger.error(`Shop roles job failed: ${err}`); - }); - }); -}; diff --git a/src/index.ts b/src/index.ts index 31e3e40..c6179e8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,7 +5,7 @@ import { token, intents } from "./config/discord"; import { Client } from "discord.js"; // discord.js import database from "./database"; -import schedules from "./handlers/schedules"; +import * as scheduleManager from "./managers/schedule"; import * as eventManager from "./managers/event"; import * as commandManager from "./managers/command"; @@ -20,7 +20,7 @@ const main = async () => { await database(); // Start schedule manager - await schedules(client); + await scheduleManager.start(client); // Start command handler await commandManager.register(client); diff --git a/src/interfaces/Job.ts b/src/interfaces/Job.ts new file mode 100644 index 0000000..d58dbf8 --- /dev/null +++ b/src/interfaces/Job.ts @@ -0,0 +1,8 @@ +import { Client } from "discord.js"; + +export interface IJob { + options: { + schedule: string; + }; + execute: (client: Client) => Promise; +} diff --git a/src/jobs/shopRoles.ts b/src/jobs/shopRoles.ts index 76ea653..c059672 100644 --- a/src/jobs/shopRoles.ts +++ b/src/jobs/shopRoles.ts @@ -8,53 +8,43 @@ import userSchema from "../database/schemas/user"; import shopRoleSchema from "../database/schemas/shopRole"; import guildSchema from "../database/schemas/guild"; -export default async (client: Client) => { - const roles = await shopRoleSchema.find(); +export const options = { + schedule: "*/1 * * * * *", +}; +export const execute = async (client: Client) => { + const roles = await shopRoleSchema.find(); await Promise.all( roles.map(async (role) => { const { guildId, userId, roleId } = role; - const lastPayment = new Date(role.lastPayed); - const nextPayment = new Date( lastPayment.setHours(lastPayment.getHours() + 1) ); - if (new Date() < nextPayment) { logger.silly(`Shop role ${roleId} is not due for payment.`); } - const guildData = await guildSchema.findOne({ guildId }); - if (!guildData) { logger.error(`Guild ${guildId} not found.`); return; } - if (!userId) { logger.error(`User ID not found for shop role ${roleId}.`); return; } - const userData = await userSchema.findOne({ guildId, userId }); - if (!userData) { logger.error(`User ${userId} not found for shop role ${roleId}.`); return; } - const rGuild = client?.guilds?.cache?.get(guildId); - const rMember = await rGuild?.members?.fetch(userId); - if (!rMember) { logger.error(`Member ${userId} not found for shop role ${roleId}.`); return; } - const rRole = rMember.roles.cache.get(roleId); - if (!rMember || !rRole) { logger.error(`Member ${userId} not found for shop role ${roleId}.`); await shopRoleSchema @@ -76,36 +66,27 @@ export default async (client: Client) => { }); return; } - if (new Date() > nextPayment) { logger.silly( `Shop role ${roleId} is due for payment. Withdrawing credits from user ${userId}.` ); - const { pricePerHour } = guildData.shop.roles; - if (userData.credits < pricePerHour) { logger.error( `User ${userId} does not have enough credits to pay for shop role ${roleId}.` ); - if (!rMember) { logger.error(`Member ${userId} not found for shop role ${roleId}.`); return; } - rMember.roles.remove(roleId); - return; } - userData.credits -= pricePerHour; - await userData .save() .then(async () => { role.lastPayed = new Date(); - await role .save() .then(async () => { @@ -117,7 +98,6 @@ export default async (client: Client) => { err ); }); - logger.silly( `Shop role ${roleId} has been paid for. Keeping role ${roleId} for user ${userId}.` ); diff --git a/src/managers/schedule/index.ts b/src/managers/schedule/index.ts new file mode 100644 index 0000000..84e77af --- /dev/null +++ b/src/managers/schedule/index.ts @@ -0,0 +1,29 @@ +import logger from "../../logger"; +import { Client } from "discord.js"; + +import { IJob } from "../../interfaces/Job"; + +import listDir from "../../helpers/listDir"; + +import schedule from "node-schedule"; + +export const start = async (client: Client) => { + logger.info("Starting schedule manager..."); + + const jobNames = await listDir("jobs"); + if (!jobNames) return logger.info("No jobs found"); + + await Promise.all( + jobNames.map(async (jobName, index) => { + const job: IJob = await import(`../../jobs/shopRoles`); + + schedule.scheduleJob(job.options.schedule, async () => { + logger.info(`Executed job ${jobName}!`); + await job.execute(client); + }); + }) + ).then(async () => { + const list = schedule.scheduledJobs; + logger.silly(list); + }); +};