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 ) {
2020-05-03 16:35:47 -04:00
const set = new Set < string > ( ) ;
setInterval ( ( ) = > {
set . clear ( ) ;
} , 3600000 ) ;
2020-03-28 12:10:58 -04:00
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 ( ) ;
2020-05-03 16:35:47 -04:00
userLimits . soft = tier . resourceLimits . ram - 50 ;
userLimits . hard = tier . resourceLimits . ram + 10 ;
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 .
* /
2020-05-03 16:35:47 -04:00
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 ( ) ;
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 . 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 <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 Technician . 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 >
` ,
} ) ;
client . createMessage ( channelID , { embed } ) ;
set . delete ( acc . username ) ;
} else if ( memoryConversion >= userLimits . soft && ! set . has ( acc . username ) ) {
2020-03-29 05:33:43 -04:00
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 ) ;
2020-05-03 16:35:47 -04:00
embed . setTitle ( 'Resource Limit Notification' ) ;
embed . setDescription ( 'Someone has reached the (soft) resource limit for their tier on RAM.' ) ;
2020-03-29 05:33:43 -04:00
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 ) ;
2020-05-03 16:35:47 -04:00
embed . addField ( 'Memory Limit' , ` ${ String ( userLimits . hard ) } MB ` , true ) ;
2020-03-29 05:33:43 -04:00
embed . setFooter ( client . user . username , client . user . avatarURL ) ;
embed . setTimestamp ( ) ;
2020-05-03 16:35:47 -04:00
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 <help@libraryofcode.org>' ,
subject : 'Notification' ,
html : `
< h1 > Library of Code sp - us | Cloud Services < / h1 >
< p > 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 . < / p >
< p > < strong > Technician : < / strong > SYSTEM < / p >
< b > < i > Library of Code sp - us | Support Team < / i > < / b >
` ,
} ) ;
set . add ( acc . username ) ;
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
}