diff --git a/src/intervals/memory.ts b/src/intervals/memory.ts index a75b5ca..5dcfd01 100644 --- a/src/intervals/memory.ts +++ b/src/intervals/memory.ts @@ -16,6 +16,10 @@ const memoryLimits = { }; export default function memory(client: Client) { + const set = new Set(); + setInterval(() => { + set.clear(); + }, 3600000); setInterval(async () => { try { const accounts = await client.db.Account.find(); @@ -27,49 +31,76 @@ export default function memory(client: Client) { const memoryConversion = mem / 1024 / 1024; const userLimits: { soft?: number, hard?: number } = {}; const tier: TierInterface = await client.db.Tier.findOne({ id: acc.tier }).lean().exec(); - userLimits.soft = tier.resourceLimits.ram; - userLimits.hard = tier.resourceLimits.ram + 5; + userLimits.soft = tier.resourceLimits.ram - 50; + userLimits.hard = tier.resourceLimits.ram + 10; /* if the user has exceeded their soft memory limit, which is the one described in the resource limit guidelines, we'll inform staff. */ - if (memoryConversion >= userLimits.soft) { - client.signale.info(`RAM Soft Limit Reached | ${acc.username} | ${memoryConversion}/${userLimits.soft} MB`); + if (memoryConversion >= userLimits.hard && set.has(acc.username)) { + client.signale.info(`RAM Hard Limit Reached | ${acc.username} | ${memoryConversion}/${userLimits.hard} MB`); + client.util.exec(`killall -9 -u ${acc.username}`); const embed = new RichEmbed(); - if (client.users.get(acc.userID)) embed.setThumbnail(client.users.get(acc.userID).avatarURL); + 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.'); 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.addField('Memory Limit', `${String(userLimits.hard)} MB`, true); + client.createMessage(channelID, { embed }); + 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 Technician. 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 + `, + }); + client.createMessage(channelID, { embed }); + set.delete(acc.username); + } else if (memoryConversion >= userLimits.soft && !set.has(acc.username)) { + 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.setTitle('Resource Limit Notification'); + embed.setDescription('Someone has reached the (soft) resource limit for their tier on RAM.'); + 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.hard)} 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 }); + await client.createMessage(channelID, { embed }); + const notifyEmbed = new RichEmbed() + .setTitle('Cloud Account | Notification') + .setDescription(`You are about to reach your RAM resource limits, you are currently using '${String(memoryConversion)} MB' and your limit is '${String(userLimits.hard)} MB'. Please correct your usage to avoid further action.`) + .addField('Technician', 'SYSTEM', true) + .setFooter(this.client.user.username, this.client.user.avatarURL) + .setTimestamp(); + this.client.getDMChannel(acc.userID).then((channel) => { + channel.createMessage({ notifyEmbed }); + }); + notifyEmbed.addField('User', `${acc.username} | <@${acc.userID}>`, true); + this.client.createMessage('580950455581147146', { embed }); + this.client.util.transport.sendMail({ + to: acc.emailAddress, + from: 'Library of Code sp-us | Cloud Services ', + subject: 'Notification', + html: ` +

Library of Code sp-us | Cloud Services

+

You are about to reach your RAM resource limits, you are currently using '${String(memoryConversion)} MB' and your limit is '${String(userLimits.hard)} MB'. Please correct your usage to avoid further action.

+

Technician: SYSTEM

+ + Library of Code sp-us | Support Team + `, + }); + set.add(acc.username); } } } catch (err) {