/* eslint-disable no-await-in-loop */ import { Client } from '..'; import { RichEmbed } from '../class'; const channelID = '691824484230889546'; export const memoryLimits = { TIER_1_SOFT: 200, TIER_1_HARD: 350, TIER_2_SOFT: 350, TIER_2_HARD: 400, TIER_3_SOFT: 500, TIER_3_HARD: 550, }; export default function memory(client: Client) { setInterval(async () => { const accounts = await client.db.Account.find(); console.log(accounts); for (const acc of accounts) { console.log(acc); if (acc.root) return; // memory in bytes const mem = Number(await client.util.exec(`memory ${acc.username}`)) * 1000; // memory in megabytes const memoryConversion = mem / 1024 / 1024; let userLimits: { soft: number, hard: number }; if (acc.tier === 1) { userLimits = { soft: memoryLimits.TIER_1_SOFT, hard: memoryLimits.TIER_1_HARD }; } else if (acc.tier === 2) { userLimits = { soft: memoryLimits.TIER_2_SOFT, hard: memoryLimits.TIER_2_HARD }; } else if (acc.tier === 3) { userLimits = { soft: memoryLimits.TIER_3_SOFT, hard: memoryLimits.TIER_3_HARD }; } /* if the user has exceeded their soft memory limit, which is the one described in the resource limit guidelines, we'll inform staff. */ console.log(memoryConversion, userLimits.soft, userLimits.hard); if (memoryConversion >= userLimits.soft) { client.signale.info(`RAM Soft Limit Reached | ${acc.username} | ${memoryConversion}/${userLimits.soft} MB`); const embed = new RichEmbed(); if (client.users.get(acc.userID)) embed.setThumbnail(client.users.get(acc.userID).avatarURL); embed.addField('User', `${acc.username} | <@${acc.userID}> | ${acc.userID}`, true); embed.addField('Tier', String(acc.tier), true); embed.addField('Memory Usage', `${String(memoryConversion)} MB`, true); embed.addField('Memory Limit', `${String(userLimits.soft)} MB`, true); embed.setFooter(client.user.username, client.user.avatarURL); embed.setTimestamp(); // if they exceed the hard limit, we'll kill all of their processes. if (memoryConversion >= userLimits.hard) { client.signale.info(`RAM Hard Limit Reached | ${acc.username} | ${memoryConversion}/${userLimits.hard} MB`); client.util.exec(`killall -9 -u ${acc.username}`); embed.setTitle('Resource Enforcement Notification'); embed.setDescription('Someone has reached the (hard) resource limit for their tier on RAM. The system has automatically killed all of their processes.'); client.util.createModerationLog(acc.userID, client.guilds.get('446067825673633794').members.get(client.user.id), 1, '[AUTO] Exceeded resource limit for RAM.'); client.util.transport.sendMail({ to: acc.emailAddress, from: 'Library of Code sp-us | Cloud Services ', subject: 'Your account has been warned', html: `

Library of Code sp-us | Cloud Services

Your account has received an official warning from a Moderator. Please get the underlying issue resolved to avoid possible moderative action.

Reason: [AUTO] Exceeded resource limit for RAM.

Moderator: ${client.user.username}

Library of Code sp-us | Support Team `, }); } else { embed.setTitle('Resource Limit Notification'); embed.setDescription('Someone has reached the (soft) resource limit for their tier on RAM.'); } // @ts-ignore client.createMessage(channelID, { embed }); } } }, 60000); }