🚚 schedule handler is now a manager
This commit is contained in:
parent
3ff9186c98
commit
2dffdfcb5b
5 changed files with 44 additions and 51 deletions
|
@ -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}`);
|
||||
});
|
||||
});
|
||||
};
|
|
@ -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
8
src/interfaces/Job.ts
Normal file
|
@ -0,0 +1,8 @@
|
|||
import { Client } from "discord.js";
|
||||
|
||||
export interface IJob {
|
||||
options: {
|
||||
schedule: string;
|
||||
};
|
||||
execute: (client: Client) => Promise<void>;
|
||||
}
|
|
@ -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}.`
|
||||
);
|
||||
|
|
29
src/managers/schedule/index.ts
Normal file
29
src/managers/schedule/index.ts
Normal 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);
|
||||
});
|
||||
};
|
Loading…
Add table
Reference in a new issue