community-relations/src/intervals/score.ts

73 lines
3.1 KiB
TypeScript

/* eslint-disable no-continue */
/* eslint-disable one-var-declaration-per-line */
/* eslint-disable no-await-in-loop */
import { TextChannel } from 'eris';
import { Client } from '../class';
let interval: NodeJS.Timeout;
export default async function calculateScore(client: Client): Promise<NodeJS.Timeout> {
const start = async () => {
const { members } = client.guilds.get(client.config.guildID);
const general = await (<TextChannel> client.guilds.get(client.config.guildID).channels.get('485680288123584525')).getMessages(1000);
const programmingSupport = await (<TextChannel> client.guilds.get(client.config.guildID).channels.get('506970598631538708')).getMessages(300);
const cloudSupport = await (<TextChannel> client.guilds.get(client.config.guildID).channels.get('546457788184789013')).getMessages(200);
for (const member of members.values()) {
if (member.bot) continue;
let score = await client.db.Score.findOne({ userID: member.user.id });
if (!score) {
const data: {
userID: string,
total: number,
activity: number,
roles: number,
moderation: number,
cloudServices: number,
staff: boolean,
inquiries: [{ name: string, reason: string}?],
} = {
userID: member.user.id,
total: 0,
activity: 0,
roles: 0,
moderation: 0,
cloudServices: 0,
staff: false,
inquiries: [],
};
score = await (new client.db.Score(data)).save();
client.util.signale.debug(`SCORE INIT - ${member.username}`);
}
// eslint-disable-next-line prefer-const
// eslint-disable-next-line one-var-declaration-per-line
// eslint-disable-next-line one-var
let total = 0, activity = 0, roles = 0, moderation = 0, cloudServices = 0, staff = 0;
cloudServices = 0;
roles = Math.floor(member.roles.length * 0.87);
if (roles > 54) roles = 54;
const moderations = await client.db.Moderation.find({ userID: member.user.id });
if (moderations?.length > 0) moderation = -moderations.length * 8;
else moderation = 2;
const activityTotal = (general.filter((m) => m.member?.id === member.id).length + programmingSupport.filter((m) => m.member?.id === member.id).length + cloudSupport.filter((m) => m.member?.id === member.id).length) * 0.485;
activity = Math.floor(activityTotal);
if (activity > 55) activity = 55;
if (member.roles.includes('446104438969466890') || member.roles.includes('701481967149121627')) staff = 20;
total = Math.floor(((total + activity + roles + moderation + cloudServices + staff) * 5.13) * 1.87);
await score.updateOne({ $set: { total, activity, roles, moderation, cloudServices, staff } });
client.util.signale.debug(`SCORE SET - ${member.username}\nTotal: ${total}\nActivity: ${activity}\nRoles: ${roles}\nModeration: ${moderation}\nCloud Services: ${cloudServices}\nStaff: ${staff}`);
}
};
await start();
interval = setInterval(async () => {
await start();
}, 1800000);
return interval;
}