2020-03-23 22:26:06 -04:00
/* eslint-disable no-await-in-loop */
import { Client } from '..' ;
import { RichEmbed } from '../class' ;
const channelID = '691824484230889546' ;
export const memoryLimits = {
2020-03-28 11:37:01 -04:00
TIER_1_SOFT : 200 ,
TIER_1_HARD : 350 ,
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 ( ) = > {
const accounts = await client . db . Account . find ( ) ;
for ( const acc of accounts ) {
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 } ;
}
2020-03-23 22:26:06 -04:00
2020-03-28 12:10:58 -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 ( acc . tier === 1 && memoryConversion >= userLimits . soft ) {
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-28 12:10:58 -04:00
// if they exceed the hard limit, we'll kill all of their processes.
if ( memoryConversion >= userLimits . hard ) {
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-23 22:26:06 -04:00
}
}
2020-03-28 12:10:58 -04:00
} , 300000 ) ;
2020-03-23 22:26:06 -04:00
}