2020-03-29 05:43:40 -04:00
/* eslint-disable no-continue */
2020-03-23 22:26:06 -04:00
/* eslint-disable no-await-in-loop */
import { Client } from '..' ;
import { RichEmbed } from '../class' ;
2020-05-02 02:35:17 -04:00
import { TierInterface } from '../models' ;
2020-03-23 22:26:06 -04:00
const channelID = '691824484230889546' ;
2020-03-29 05:47:42 -04:00
const memoryLimits = {
2020-04-02 01:51:46 -04:00
TIER_1_SOFT : 250 ,
TIER_1_HARD : 300 ,
2020-03-28 11:37:01 -04:00
TIER_2_SOFT : 350 ,
TIER_2_HARD : 400 ,
TIER_3_SOFT : 500 ,
TIER_3_HARD : 550 ,
2020-03-23 22:26:06 -04:00
} ;
2020-03-28 12:10:58 -04:00
export default function memory ( client : Client ) {
setInterval ( async ( ) = > {
2020-03-29 05:33:43 -04:00
try {
const accounts = await client . db . Account . find ( ) ;
for ( const acc of accounts ) {
2020-03-29 05:43:40 -04:00
if ( acc . root === true ) continue ;
2020-03-29 05:33:43 -04:00
// memory in bytes
const mem = Number ( await client . util . exec ( ` memory ${ acc . username } ` ) ) * 1000 ;
// memory in megabytes
const memoryConversion = mem / 1024 / 1024 ;
2020-03-29 05:53:15 -04:00
const userLimits : { soft? : number , hard? : number } = { } ;
2020-05-02 02:35:17 -04:00
const tier : TierInterface = await client . db . Tier . findOne ( { id : acc.tier } ) . lean ( ) . exec ( ) ;
userLimits . soft = tier . resourceLimits . ram ;
userLimits . hard = tier . resourceLimits . ram + 50 ;
2020-03-23 22:26:06 -04:00
2020-03-29 05:33:43 -04:00
/ * i f t h e u s e r h a s e x c e e d e d t h e i r s o f t m e m o r y l i m i t , w h i c h i s t h e o n e d e s c r i b e d i n t h e
resource limit guidelines , we ' ll inform staff .
* /
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 ( ) ;
2020-03-23 22:26:06 -04:00
2020-03-29 05:33:43 -04:00
// 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 <help@libraryofcode.org>' ,
subject : 'Your account has been warned' ,
html : `
< h1 > Library of Code sp - us | Cloud Services < / h1 >
< p > Your account has received an official warning from a Moderator . Please get the underlying issue resolved to avoid < i > possible < / i > moderative action . < / p >
< p > < strong > Reason : < / strong > [ AUTO ] Exceeded resource limit for RAM . < / p >
< p > < strong > Moderator : < / strong > $ { client . user . username } < / p >
< b > < i > Library of Code sp - us | Support Team < / i > < / b >
` ,
} ) ;
} 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 } ) ;
2020-03-28 12:10:58 -04:00
}
2020-03-23 22:26:06 -04:00
}
2020-03-29 05:33:43 -04:00
} catch ( err ) {
client . util . handleError ( err ) ;
2020-03-23 22:26:06 -04:00
}
2020-03-29 05:53:15 -04:00
} , 60000 ) ;
2020-03-23 22:26:06 -04:00
}