2021-02-02 01:45:03 -05:00
/* eslint-disable no-plusplus */
2020-10-06 15:06:02 -04:00
/* eslint-disable no-continue */
2020-09-10 00:54:19 -04:00
/* eslint-disable default-case */
2020-10-28 20:33:21 -04:00
import moment from 'moment' ;
2020-10-24 02:54:01 -04:00
import { v4 as uuid } from 'uuid' ;
2020-10-02 18:00:05 -04:00
import { Message , User , TextChannel } from 'eris' ;
2020-09-03 03:47:24 -04:00
import { Client , Command , RichEmbed } from '../class' ;
2020-11-12 20:37:24 -05:00
import { getTotalMessageCount } from '../intervals/score' ;
2020-11-07 04:30:53 -05:00
import Score_Hist from './score_hist' ;
import Score_Notify from './score_notify' ;
import Score_Pref from './score_pref' ;
2020-09-03 03:47:24 -04:00
export default class Score extends Command {
constructor ( client : Client ) {
super ( client ) ;
this . name = 'score' ;
2021-02-02 01:45:03 -05:00
this . description = 'Retrieves your Community Report' ;
2020-11-07 04:30:53 -05:00
this . usage = ` ${ this . client . config . prefix } score \ n ${ this . client . config . prefix } score <member> <type: 'hard' | 'soft'> <reporting department: ex. Library of Code sp-us | Cloud Account Services>:<reason> ` ;
2021-02-02 01:45:03 -05:00
this . aliases = [ 'report' ] ;
2020-11-07 04:30:53 -05:00
this . subcmds = [ Score_Hist , Score_Notify , Score_Pref ] ;
2020-09-03 03:47:24 -04:00
this . permissions = 0 ;
2020-09-19 16:30:44 -04:00
this . guildOnly = false ;
2020-09-03 03:47:24 -04:00
this . enabled = true ;
}
2020-09-07 01:22:06 -04:00
public async run ( message : Message , args : string [ ] ) {
2020-09-03 03:47:24 -04:00
try {
2020-09-20 22:33:56 -04:00
let check = false ;
2020-09-19 16:30:44 -04:00
let user : User ;
2020-10-02 21:48:53 -04:00
if ( ! args [ 0 ] || ! this . checkCustomPermissions ( this . client . util . resolveMember ( message . author . id , this . mainGuild ) , 4 ) ) {
2020-09-19 16:30:44 -04:00
user = message . author ;
if ( ! user ) return this . error ( message . channel , 'Member not found.' ) ;
2021-02-02 01:45:03 -05:00
await this . client . report . createInquiry ( user . id , ` ${ user . username } via Discord ` , 1 ) ;
2020-09-20 22:33:56 -04:00
check = true ;
2020-09-07 01:22:06 -04:00
} else {
2020-10-24 02:54:01 -04:00
user = this . client . util . resolveMember ( args [ 0 ] , this . mainGuild ) ? . user ;
2020-09-19 16:30:44 -04:00
if ( ! user ) {
const sc = await this . client . db . Score . findOne ( { pin : [ Number ( args [ 0 ] . split ( '-' ) [ 0 ] ) , Number ( args [ 0 ] . split ( '-' ) [ 1 ] ) , Number ( args [ 0 ] . split ( '-' ) [ 2 ] ) ] } ) ;
2020-11-09 23:55:10 -05:00
if ( ! sc ) return this . error ( message . channel , 'Member not found.' ) ;
user = this . client . util . resolveMember ( sc . userID , this . mainGuild ) ? . user ;
2020-09-19 16:30:44 -04:00
}
if ( ! user ) return this . error ( message . channel , 'Member not found.' ) ;
if ( message . channel . type !== 0 ) return this . error ( message . channel , 'Hard Inquiries must be initiated in a guild.' ) ;
2020-09-07 01:22:06 -04:00
if ( args [ 1 ] === 'hard' ) {
if ( args . length < 3 ) return this . client . commands . get ( 'help' ) . run ( message , [ this . name ] ) ;
const name = args . slice ( 2 ) . join ( ' ' ) . split ( ':' ) [ 0 ] ;
const reason = args . slice ( 2 ) . join ( ' ' ) . split ( ':' ) [ 1 ] ;
2020-09-19 16:30:44 -04:00
const score = await this . client . db . Score . findOne ( { userID : user.id } ) ;
2020-09-07 01:22:06 -04:00
if ( ! score ) return this . error ( message . channel , 'Score not calculated yet.' ) ;
2020-09-14 11:21:00 -04:00
if ( score . locked ) return this . error ( message . channel , 'The score report you have requested has been locked.' ) ;
2021-02-02 01:45:03 -05:00
await this . client . report . createInquiry ( score . userID , name , 0 , reason ) ;
2020-09-07 01:22:06 -04:00
}
}
2020-09-19 16:30:44 -04:00
if ( ! user ) return this . error ( message . channel , 'Member not found.' ) ;
const score = await this . client . db . Score . findOne ( { userID : user.id } ) ;
2021-02-02 01:45:03 -05:00
const inqs = await this . client . db . Inquiry . find ( { userID : user.id , type : 0 } ) ;
2020-09-27 02:11:26 -04:00
if ( ! score ) return this . error ( message . channel , 'Community Report has not been generated yet.' ) ;
2020-09-03 03:47:24 -04:00
let totalScore = '0' ;
let activityScore = '0' ;
let moderationScore = '0' ;
let roleScore = '0' ;
let cloudServicesScore = '0' ;
2020-09-13 23:54:37 -04:00
let otherScore = '0' ;
2020-09-03 03:47:24 -04:00
let miscScore = '0' ;
if ( score ) {
if ( score . total < 200 ) totalScore = '---' ;
else if ( score . total > 800 ) totalScore = '800' ;
else totalScore = ` ${ score . total } ` ;
2020-09-03 03:57:04 -04:00
if ( score . activity < 10 ) activityScore = '---' ;
2020-11-12 20:37:24 -05:00
else if ( score . activity > Math . floor ( ( Math . log1p ( getTotalMessageCount ( this . client ) ) * 12 ) ) ) activityScore = String ( Math . floor ( ( Math . log1p ( getTotalMessageCount ( this . client ) ) * 12 ) ) ) ;
2020-09-03 03:47:24 -04:00
else activityScore = ` ${ score . activity } ` ;
if ( score . roles <= 0 ) roleScore = '---' ;
else if ( score . roles > 54 ) roleScore = '54' ;
else roleScore = ` ${ score . roles } ` ;
moderationScore = ` ${ score . moderation } ` ;
2020-09-13 23:54:37 -04:00
if ( score . other === 0 ) otherScore = '---' ;
else otherScore = ` ${ score . other } ` ;
2020-09-03 03:47:24 -04:00
if ( score . staff <= 0 ) miscScore = '---' ;
else miscScore = ` ${ score . staff } ` ;
if ( score . cloudServices === 0 ) cloudServicesScore = '---' ;
2020-09-13 23:54:37 -04:00
else if ( score . cloudServices > 10 ) cloudServicesScore = '10' ;
2020-09-03 03:47:24 -04:00
else cloudServicesScore = ` ${ score . cloudServices } ` ;
2020-09-13 23:54:37 -04:00
} // else return this.error(message.channel, 'Community Score has not been calculated yet.');
2020-09-03 03:47:24 -04:00
2020-10-06 15:06:02 -04:00
const set = [ ] ;
const accounts = await this . client . db . Score . find ( ) . lean ( ) . exec ( ) ;
for ( const sc of accounts ) {
if ( sc . total < 200 ) { continue ; }
if ( sc . total > 800 ) { set . push ( 800 ) ; continue ; }
set . push ( sc . total ) ;
}
const percentile = this . client . util . percentile ( set , score . total ) ;
2020-09-03 03:47:24 -04:00
const embed = new RichEmbed ( ) ;
2020-10-28 21:02:03 -04:00
embed . setTitle ( 'Community Report' ) ;
2020-09-19 16:30:44 -04:00
embed . setAuthor ( user . username , user . avatarURL ) ;
embed . setThumbnail ( user . avatarURL ) ;
2020-09-13 01:09:25 -04:00
/ * f o r ( c o n s t r o l e o f m e m b e r . r o l e s . m a p ( ( r ) = > t h i s . m a i n G u i l d . r o l e s . g e t ( r ) ) . s o r t ( ( a , b ) = > b . p o s i t i o n - a . p o s i t i o n ) ) {
if ( role ? . color !== 0 ) {
embed . setColor ( role . color ) ;
break ;
}
} * /
2021-02-02 01:45:03 -05:00
let inqAdded = 0 ;
if ( inqs ? . length > 0 ) {
2020-10-28 20:46:01 -04:00
let desc = '__**Hard Inquiries**__\n*These inquiries will fall off your report within 2 months, try to keep your hard inquiries to a minimum. If you want to file a dispute, please DM Ramirez.*\n\n' ;
2021-02-02 01:45:03 -05:00
inqs . forEach ( ( inq ) = > {
2020-10-28 20:46:01 -04:00
const testDate = ( new Date ( new Date ( inq . date ) . setHours ( 1460 ) ) ) ;
2020-10-11 13:16:00 -04:00
// eslint-disable-next-line no-useless-escape
2021-02-02 01:45:03 -05:00
if ( testDate > new Date ( ) ) desc += ` ${ inq . iid ? ` __[ ${ inq . iid } ]__ \ n ` : '' } **Department/Service:** ${ inq . name . replace ( /\*/gmi , '' ) } \ n**Reason:** ${ inq . reason } \ n**Date:** ${ inq . date . toLocaleString ( 'en-us' ) } ET \ n**Expires:** ${ moment ( testDate ) . calendar ( ) } \ n \ n ` ;
inqAdded ++ ;
2020-09-07 01:22:06 -04:00
} ) ;
2021-02-02 01:45:03 -05:00
if ( inqAdded <= 0 ) desc = '' ;
2020-10-31 02:52:22 -04:00
if ( desc . length >= 1900 ) {
2020-10-31 02:54:59 -04:00
embed . setDescription ( '__***Too many Hard Inquiries to show, please see https://report.libraryofcode.org***__' ) ;
2020-10-31 02:52:22 -04:00
} else {
embed . setDescription ( desc ) ;
}
2020-09-07 01:22:06 -04:00
}
2020-09-13 01:09:25 -04:00
let color = '🔴' ;
2020-09-19 16:30:44 -04:00
let additionalText = 'POOR' ;
2020-09-13 01:09:25 -04:00
embed . setColor ( 'FF0000' ) ;
2020-09-22 19:19:38 -04:00
if ( score . total >= 550 ) { color = '🟠' ; additionalText = 'FAIR' ; embed . setColor ( 'FFA500' ) ; }
if ( score . total >= 630 ) { color = '🟡' ; additionalText = 'GOOD' ; embed . setColor ( 'FFFF00' ) ; }
2020-09-19 16:30:44 -04:00
if ( score . total >= 700 ) { color = '🟢' ; additionalText = 'EXCELLENT' ; embed . setColor ( '66FF66' ) ; }
2020-10-02 15:43:24 -04:00
if ( score . total >= 770 ) { color = '✨' ; additionalText = 'EXCEPTIONAL' ; embed . setColor ( '#99FFFF' ) ; }
2020-10-28 21:02:03 -04:00
embed . addField ( 'CommScore™ | 200 to 800' , score ? ` ${ color } ${ totalScore } | ${ additionalText } | ${ this . client . util . ordinal ( Math . round ( percentile ) ) } Percentile ` : 'N/C' , true ) ;
2020-11-12 20:37:24 -05:00
embed . addField ( ` Activity | 10 to ${ Math . floor ( Math . log1p ( getTotalMessageCount ( this . client ) ) * 12 ) } ` , activityScore || 'N/C' , true ) ;
2020-09-13 23:54:37 -04:00
embed . addField ( 'Roles | 1 to N/A' , roleScore || 'N/C' , true ) ;
embed . addField ( 'Moderation | N/A to 2' || 'N/C' , moderationScore , true ) ;
2020-09-14 02:49:51 -04:00
embed . addField ( 'Cloud Services | N/A to 10+' , cloudServicesScore || 'N/C' , true ) ;
2020-09-13 23:54:37 -04:00
embed . addField ( 'Other' , otherScore || 'N/C' , true ) ;
embed . addField ( 'Misc' , miscScore || 'N/C' , true ) ;
2020-09-14 11:21:00 -04:00
if ( score . locked ) {
embed . addField ( 'Status' , 'Score Report Locked' ) ;
}
2020-09-19 16:30:44 -04:00
if ( score . pin ? . length > 0 && message . channel . type === 1 ) {
embed . addField ( 'PIN' , score . pin . join ( '-' ) , true ) ;
}
2020-09-13 18:58:58 -04:00
if ( score . lastUpdate ) {
embed . setFooter ( 'Report last updated' , this . client . user . avatarURL ) ;
embed . setTimestamp ( score . lastUpdate ) ;
} else {
embed . setFooter ( this . client . user . username , this . client . user . avatarURL ) ;
}
2020-09-20 15:29:25 -04:00
// eslint-disable-next-line no-mixed-operators
2020-10-02 21:48:53 -04:00
if ( ( args [ 1 ] === 'hard' || args [ 1 ] === 'soft' ) && this . checkCustomPermissions ( this . client . util . resolveMember ( message . author . id , this . mainGuild ) , 4 ) ) {
2020-09-20 15:24:33 -04:00
if ( score . pin ? . length > 0 ) embed . addField ( 'PIN' , score . pin . join ( '-' ) , true ) ;
2020-09-20 22:33:56 -04:00
if ( args [ 1 ] === 'soft' && ! check ) {
let name = '' ;
for ( const role of this . client . util . resolveMember ( message . author . id , this . mainGuild ) . roles . map ( ( r ) = > this . mainGuild . roles . get ( r ) ) . sort ( ( a , b ) = > b . position - a . position ) ) {
name = ` Library of Code sp-us | ${ role . name } ` ;
break ;
}
2021-02-02 01:45:03 -05:00
await this . client . report . createInquiry ( user . id , name , 1 ) ;
2020-09-20 22:33:56 -04:00
}
2020-09-20 15:29:25 -04:00
}
if ( args [ 1 ] === 'hard' && this . checkCustomPermissions ( this . client . util . resolveMember ( message . author . id , this . mainGuild ) , 6 ) ) {
2020-09-17 23:07:47 -04:00
await message . channel . createMessage ( { embed } ) ;
await message . channel . createMessage ( '***===BEGIN ADDITIONAL INFORMATION===***' ) ;
2020-11-07 04:30:53 -05:00
await this . client . commands . get ( 'score' ) . subcommands . get ( 'hist' ) . run ( message , [ user . id ] ) ;
2020-09-19 16:30:44 -04:00
await this . client . commands . get ( 'whois' ) . run ( message , [ user . id ] ) ;
await this . client . commands . get ( 'notes' ) . run ( message , [ user . id ] ) ;
const whoisMessage = await message . channel . createMessage ( ` =whois ${ user . id } --full ` ) ;
2020-09-17 23:07:47 -04:00
await whoisMessage . delete ( ) ;
2020-09-25 20:38:16 -04:00
const modlogsMessage = await message . channel . createMessage ( ` =modlogs ${ user . id } ` ) ;
2020-09-17 23:07:47 -04:00
await modlogsMessage . delete ( ) ;
return await message . channel . createMessage ( '***===END ADDITIONAL INFORMATION===***' ) ;
}
2020-09-03 03:47:24 -04:00
return message . channel . createMessage ( { embed } ) ;
} catch ( err ) {
return this . client . util . handleError ( err , message , this ) ;
}
}
}