🧑💻 shopRoles job splitted
This commit is contained in:
parent
e94b48a6d2
commit
f70bbc9171
5 changed files with 139 additions and 114 deletions
12
src/jobs/shop/index.ts
Normal file
12
src/jobs/shop/index.ts
Normal file
|
@ -0,0 +1,12 @@
|
|||
// Dependencies
|
||||
import { Client } from "discord.js";
|
||||
|
||||
import * as roles from "./modules/roles";
|
||||
|
||||
export const options = {
|
||||
schedule: "*/5 * * * * *", // https://crontab.guru/
|
||||
};
|
||||
|
||||
export const execute = async (client: Client) => {
|
||||
await roles.execute(client);
|
||||
};
|
10
src/jobs/shop/modules/roles/components/dueForPayment.ts
Normal file
10
src/jobs/shop/modules/roles/components/dueForPayment.ts
Normal file
|
@ -0,0 +1,10 @@
|
|||
import { Client } from "discord.js";
|
||||
import logger from "../../../../../logger";
|
||||
|
||||
import { IShopRole } from "../../../../../interfaces/ShopRole";
|
||||
|
||||
export const execute = async (_client: Client, role: IShopRole) => {
|
||||
const { roleId } = role;
|
||||
|
||||
logger.silly(`Shop role ${roleId} is not due for payment.`);
|
||||
};
|
85
src/jobs/shop/modules/roles/components/overDueForPayment.ts
Normal file
85
src/jobs/shop/modules/roles/components/overDueForPayment.ts
Normal file
|
@ -0,0 +1,85 @@
|
|||
import { Client } from "discord.js";
|
||||
import logger from "../../../../../logger";
|
||||
|
||||
import { IShopRole } from "../../../../../interfaces/ShopRole";
|
||||
import guildSchema from "../../../../../models/guild";
|
||||
import userSchema from "../../../../../models/user";
|
||||
import shopRoleSchema from "../../../../../models/shopRole";
|
||||
|
||||
export const execute = async (client: Client, role: IShopRole) => {
|
||||
const { guildId, userId, roleId } = role;
|
||||
if (!userId) throw new Error("User ID not found for shop role.");
|
||||
|
||||
const guildData = await guildSchema.findOne({ guildId });
|
||||
if (!guildData) throw new Error("Guild not found.");
|
||||
|
||||
const userData = await userSchema.findOne({ guildId, userId });
|
||||
if (!userData) throw new Error("User not found.");
|
||||
|
||||
const rGuild = client.guilds.cache.get(guildId);
|
||||
if (!rGuild) throw new Error("Guild not found.");
|
||||
|
||||
const rMember = await rGuild.members.fetch(userId);
|
||||
if (!rMember) throw new Error("Member not found.");
|
||||
|
||||
const rRole = rMember.roles.cache.get(roleId);
|
||||
if (!rRole) throw new Error("Role not found.");
|
||||
|
||||
logger.debug(`Shop role ${roleId} is due for payment.`);
|
||||
|
||||
const { pricePerHour } = guildData.shop.roles;
|
||||
|
||||
if (userData.credits < pricePerHour) {
|
||||
await rMember.roles
|
||||
.remove(roleId)
|
||||
.then(async () => {
|
||||
await shopRoleSchema
|
||||
.deleteOne({
|
||||
userId,
|
||||
roleId,
|
||||
guildId,
|
||||
})
|
||||
.then(async () => {
|
||||
logger.silly(
|
||||
`Shop role document ${roleId} has been deleted from user ${userId}.`
|
||||
);
|
||||
})
|
||||
.catch(async (err) => {
|
||||
throw new Error(
|
||||
`Error deleting shop role document ${roleId} from user ${userId}.`,
|
||||
err
|
||||
);
|
||||
});
|
||||
})
|
||||
.catch(async (err) => {
|
||||
throw new Error(
|
||||
`Error removing role ${roleId} from user ${userId}.`,
|
||||
err
|
||||
);
|
||||
});
|
||||
|
||||
throw new Error("User does not have enough credits.");
|
||||
}
|
||||
|
||||
userData.credits -= pricePerHour;
|
||||
await userData
|
||||
.save()
|
||||
.then(async () => {
|
||||
logger.silly(`User ${userId} has been updated.`);
|
||||
|
||||
role.lastPayed = new Date();
|
||||
await role
|
||||
.save()
|
||||
.then(async () => {
|
||||
logger.silly(`Shop role ${roleId} has been updated.`);
|
||||
})
|
||||
.catch(async (err) => {
|
||||
throw new Error(`Error updating shop role ${roleId}.`, err);
|
||||
});
|
||||
|
||||
logger.debug(`Shop role ${roleId} has been paid.`);
|
||||
})
|
||||
.catch(async (err) => {
|
||||
throw new Error(`Error updating user ${userId}.`, err);
|
||||
});
|
||||
};
|
32
src/jobs/shop/modules/roles/index.ts
Normal file
32
src/jobs/shop/modules/roles/index.ts
Normal file
|
@ -0,0 +1,32 @@
|
|||
import { Client } from "discord.js";
|
||||
|
||||
import { IShopRole } from "../../../../interfaces/ShopRole";
|
||||
import shopRoleSchema from "../../../../models/shopRole";
|
||||
|
||||
import * as overDueForPayment from "./components/overDueForPayment";
|
||||
import * as dueForPayment from "./components/dueForPayment";
|
||||
|
||||
export const execute = async (client: Client) => {
|
||||
const roles = await shopRoleSchema.find();
|
||||
|
||||
await Promise.all(
|
||||
roles.map(async (role: IShopRole) => {
|
||||
const { lastPayed } = role;
|
||||
const nextPayment = new Date(
|
||||
lastPayed.setHours(lastPayed.getHours() + 1)
|
||||
);
|
||||
|
||||
const now = new Date();
|
||||
|
||||
if (nextPayment > now) {
|
||||
await dueForPayment.execute(client, role);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (nextPayment < now) {
|
||||
await overDueForPayment.execute(client, role);
|
||||
}
|
||||
})
|
||||
);
|
||||
};
|
|
@ -1,114 +0,0 @@
|
|||
// Dependencies
|
||||
import { Client } from "discord.js";
|
||||
|
||||
import logger from "../logger";
|
||||
|
||||
// Schemas
|
||||
import userSchema from "../models/user";
|
||||
import shopRoleSchema from "../models/shopRole";
|
||||
import guildSchema from "../models/guild";
|
||||
|
||||
export const options = {
|
||||
schedule: "*/5 * * * *", // https://crontab.guru/
|
||||
};
|
||||
|
||||
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
|
||||
.deleteOne({
|
||||
userId,
|
||||
roleId,
|
||||
guildId,
|
||||
})
|
||||
.then(async () => {
|
||||
logger.silly(
|
||||
`Shop role document ${roleId} has been deleted from user ${userId}.`
|
||||
);
|
||||
})
|
||||
.catch(async (error) => {
|
||||
logger.error(
|
||||
`Error deleting shop role document ${roleId} from user ${userId}.`,
|
||||
error
|
||||
);
|
||||
});
|
||||
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 () => {
|
||||
logger.silly(`Shop role ${roleId} has been paid for.`);
|
||||
})
|
||||
.catch(async (err) => {
|
||||
logger.error(
|
||||
`Error saving shop role ${roleId} last payed date.`,
|
||||
err
|
||||
);
|
||||
});
|
||||
logger.silly(
|
||||
`Shop role ${roleId} has been paid for. Keeping role ${roleId} for user ${userId}.`
|
||||
);
|
||||
})
|
||||
.catch(async (err) => {
|
||||
logger.error(
|
||||
`Error saving user ${userId} credits for shop role ${roleId}.`,
|
||||
err
|
||||
);
|
||||
});
|
||||
}
|
||||
})
|
||||
);
|
||||
};
|
Loading…
Add table
Reference in a new issue