2020-03-13 19:57:16 -04:00
import moment from 'moment' ;
import { Message } from 'eris' ;
import { Client } from '..' ;
import { Command , RichEmbed } from '../class' ;
import { dataConversion } from '../functions' ;
import User from './whois_user' ;
export default class Whois extends Command {
constructor ( client : Client ) {
super ( client ) ;
this . name = 'whois' ;
this . description = 'Views information for a cloud account.' ;
this . aliases = [ 'account' , 'user' ] ;
this . usage = ` ${ this . client . config . prefix } account [User Name | User ID | Email Address] ` ;
2020-04-20 16:18:19 -04:00
this . permissions = { roles : [ '662163685439045632' , '701454780828221450' ] } ;
2020-03-13 19:57:16 -04:00
this . subcmds = [ User ] ;
this . enabled = true ;
}
public async run ( message : Message , args : string [ ] ) {
try {
if ( ! args [ 0 ] ) return this . client . commands . get ( 'help' ) . run ( message , [ this . name ] ) ;
2020-04-23 20:59:24 -04:00
const account = await this . client . db . Account . findOne ( { $or : [ { username : args [ 0 ] } , { userID : args [ 0 ] } , { emailAddress : args [ 0 ] } , { supportKey : args [ 0 ] . toUpperCase ( ) } ] } ) ;
2020-03-13 19:57:16 -04:00
if ( ! account ) return message . channel . createMessage ( ` ${ this . client . stores . emojis . error } ***Account not found.*** ` ) ;
const embed = new RichEmbed ( ) ;
embed . setTitle ( 'Account Information' ) ;
if ( this . client . users . get ( account . userID ) ) embed . setThumbnail ( this . client . users . get ( account . userID ) . avatarURL ) ;
embed . setColor ( 0x36393f ) ;
2020-03-30 06:47:42 -04:00
let fingerInformation = await this . client . util . exec ( ` finger ${ account . username } ` ) ;
if ( message . member && ! message . member . roles . includes ( '662163685439045632' ) ) {
fingerInformation = fingerInformation . replace ( /((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/g , '[MASKED IP ADDRESS]' ) ;
2020-03-13 19:57:16 -04:00
}
embed . setDescription ( ` ${ fingerInformation } \ n ${ await this . client . util . exec ( ` chage -l ${ account . username } ` ) } ` ) ;
embed . addField ( 'Username' , ` ${ account . username } | <@ ${ account . userID } > ` , true ) ;
embed . addField ( 'ID' , account . userID , true ) ;
embed . addField ( 'Email Address' , account . emailAddress , true ) ;
2020-03-23 22:27:00 -04:00
embed . addField ( 'Tier' , String ( account . tier ) , true ) ;
2020-03-29 04:32:17 -04:00
embed . addField ( 'Support Key' , account . supportKey , true ) ;
2020-03-13 19:57:16 -04:00
embed . addField ( 'Created By' , ` <@ ${ this . client . users . get ( account . createdBy ) . id } > ` , true ) ;
embed . addField ( 'Created At' , moment ( account . createdAt ) . format ( 'dddd, MMMM Do YYYY, h:mm:ss A' ) , true ) ;
const cpuUsage = await this . client . util . exec ( ` top -b -n 1 -u ${ account . username } | awk 'NR>7 { sum += $ 9; } END { print sum; }' ` ) ;
embed . addField ( 'CPU Usage' , cpuUsage . split ( '\n' ) [ 0 ] ? ` ${ cpuUsage . split ( '\n' ) [ 0 ] } % ` : '0%' , true ) ;
embed . addField ( 'Memory' , dataConversion ( Number ( await this . client . util . exec ( ` memory ${ account . username } ` ) ) * 1000 ) , true ) ;
const data = await this . client . redis . get ( ` storage- ${ account . username } ` ) ? dataConversion ( Number ( await this . client . redis . get ( ` storage- ${ account . username } ` ) ) ) : 'N/A' ;
embed . addField ( 'Storage' , data , true ) ;
let details = '' ;
2020-04-08 07:02:49 -04:00
if ( account . locked ) details += '__This account is currently locked.__\n' ;
2020-04-20 16:04:38 -04:00
if ( account . permissions . director ) {
details += 'This account belongs to a Director.\n' ;
2020-04-08 07:02:49 -04:00
const roleColor = this . client . guilds . get ( '446067825673633794' ) . roles . get ( '662163685439045632' ) . color ;
embed . setColor ( roleColor ) ;
2020-04-20 16:04:38 -04:00
} else if ( account . permissions . technician ) {
details += 'This account belongs to a Technician.\n' ;
2020-04-21 14:59:53 -04:00
const roleColor = this . client . guilds . get ( '446067825673633794' ) . roles . get ( '701454780828221450' ) . color ;
2020-04-08 07:02:49 -04:00
embed . setColor ( roleColor ) ;
} else if ( account . permissions . staff ) {
details += 'This account belongs to a Staff member.\n' ;
const roleColor = this . client . guilds . get ( '446067825673633794' ) . roles . get ( '453689940140883988' ) . color ;
embed . setColor ( roleColor ) ;
} else embed . setColor ( 0x36393f ) ;
if ( account . root ) details += '**This account has root/administrative privileges.**\n' ;
2020-03-13 19:57:16 -04:00
if ( details ) embed . addField ( 'Additional Details' , details , true ) ;
embed . setFooter ( this . client . user . username , this . client . user . avatarURL ) ;
embed . setTimestamp ( ) ;
2020-03-30 07:22:32 -04:00
return message . channel . createMessage ( { embed } ) ;
2020-03-13 19:57:16 -04:00
} catch ( error ) {
2020-03-30 07:22:32 -04:00
return this . client . util . handleError ( error , message , this ) ;
2020-03-13 19:57:16 -04:00
}
}
}