🚚 schedule handler is now a manager

This commit is contained in:
Axel Olausson Holtenäs 2022-05-30 17:29:06 +02:00
parent 3ff9186c98
commit 2dffdfcb5b
No known key found for this signature in database
GPG key ID: 7BF6826B76382CBA
5 changed files with 44 additions and 51 deletions

View file

@ -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}`);
});
});
};

View file

@ -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);

8
src/interfaces/Job.ts Normal file
View file

@ -0,0 +1,8 @@
import { Client } from "discord.js";
export interface IJob {
options: {
schedule: string;
};
execute: (client: Client) => Promise<void>;
}

View file

@ -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}.`
);

View file

@ -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);
});
};