2020-10-30 22:33:21 -04:00
/* eslint-disable no-eval */
2020-10-29 01:36:05 -04:00
import Bull from 'bull' ;
2020-11-01 19:46:28 -05:00
import cron from 'cron' ;
2020-10-30 22:33:21 -04:00
import { TextableChannel } from 'eris' ;
import { Client , RichEmbed } from '.' ;
2020-10-29 01:36:05 -04:00
import { ScoreInterface } from '../models' ;
2020-10-28 19:44:31 -04:00
2020-10-30 22:33:21 -04:00
import { apply as Apply } from '../commands' ;
2020-10-29 01:36:05 -04:00
export default class Queue {
2020-10-28 19:44:31 -04:00
public client : Client ;
2020-10-29 01:36:05 -04:00
public queues : { score : Bull.Queue } ;
2020-10-28 19:44:31 -04:00
2020-10-29 01:36:05 -04:00
constructor ( client : Client ) {
2020-10-28 19:44:31 -04:00
this . client = client ;
2020-10-29 01:36:05 -04:00
this . queues = {
2020-10-31 00:15:47 -04:00
score : new Bull ( 'score' , { prefix : 'queue::score' , limiter : { max : 80 , duration : 1000 } } ) ,
2020-10-29 01:36:05 -04:00
} ;
this . setProcessors ( ) ;
2020-11-01 19:48:55 -05:00
this . setCronJobs ( ) ;
2020-11-01 19:46:28 -05:00
}
protected setCronJobs() {
const historialCommunityReportJob = new cron . CronJob ( '0 20 * * *' , async ( ) = > {
try {
const reports = await this . client . db . Score . find ( ) . lean ( ) . exec ( ) ;
const startDate = new Date ( ) ;
for ( const report of reports ) {
const data = new this . client . db . ScoreHistorical ( {
userID : report.userID ,
report ,
date : startDate ,
} ) ;
// eslint-disable-next-line no-await-in-loop
await data . save ( ) ;
}
} catch ( err ) {
this . client . util . handleError ( err ) ;
}
} ) ;
historialCommunityReportJob . start ( ) ;
2020-10-28 19:44:31 -04:00
}
2020-10-29 01:45:01 -04:00
public async jobCounts() {
const data = {
waiting : 0 ,
active : 0 ,
completed : 0 ,
failed : 0 ,
delayed : 0 ,
} ;
for ( const entry of Object . entries ( this . queues ) ) {
// eslint-disable-next-line no-await-in-loop
const counts = await entry [ 1 ] . getJobCounts ( ) ;
data . waiting += counts . waiting ;
data . active += counts . active ;
data . completed += counts . completed ;
data . failed += counts . failed ;
data . delayed += counts . delayed ;
}
return data ;
}
2020-10-29 01:36:05 -04:00
protected listeners() {
this . queues . score . on ( 'active' , ( job ) = > {
this . client . util . signale . pending ( ` ${ job . id } has become active. ` ) ;
2020-10-28 19:44:31 -04:00
} ) ;
2020-10-29 01:36:05 -04:00
this . queues . score . on ( 'completed' , ( job ) = > {
this . client . util . signale . success ( ` Job with id ${ job . id } has been completed ` ) ;
2020-10-28 19:44:31 -04:00
} ) ;
2020-10-30 22:33:21 -04:00
this . queues . score . on ( 'error' , async ( err ) = > {
this . client . util . handleError ( err ) ;
} ) ;
2020-10-28 19:44:31 -04:00
}
2020-10-29 01:36:05 -04:00
protected setProcessors() {
this . queues . score . process ( 'score::update' , async ( job : Bull.Job < { score : ScoreInterface , total : number , activity : number , roles : number , moderation : number , cloudServices : number , other : number , staff : number } > ) = > {
await this . client . db . Score . updateOne ( { userID : job.data.score.userID } , { $set : { total : job.data.total , activity : job.data.activity , roles : job.data.roles , moderation : job.data.moderation , cloudServices : job.data.cloudServices , other : job.data.other , staff : job.data.staff , lastUpdate : new Date ( ) } } ) ;
if ( ! job . data . score . pin || job . data . score . pin ? . length < 1 ) {
await this . client . db . Score . updateOne ( { userID : job.data.score.userID } , { $set : { pin : [ this . client . util . randomNumber ( 100 , 999 ) , this . client . util . randomNumber ( 10 , 99 ) , this . client . util . randomNumber ( 1000 , 9999 ) ] } } ) ;
}
} ) ;
2020-10-31 02:27:41 -04:00
this . queues . score . process ( 'score::apply' , async ( job : Bull.Job < { channelInformation : { messageID : string , guildID : string , channelID : string } , url : string , userID : string , func? : string } > ) = > {
2020-10-30 22:33:21 -04:00
const application = await Apply . apply ( this . client , job . data . url , job . data . userID ) ;
const guild = this . client . guilds . get ( job . data . channelInformation . guildID ) ;
const channel = < TextableChannel > guild . channels . get ( job . data . channelInformation . channelID ) ;
const message = await channel . getMessage ( job . data . channelInformation . messageID ) ;
await message . delete ( ) ;
const embed = new RichEmbed ( ) ;
embed . setTitle ( 'Application Decision' ) ;
2020-10-31 23:46:49 -04:00
embed . setDescription ( ` This application was processed by __ ${ application . processedBy } __ on behalf of the vendor, department, or service who operates this application. Please contact the vendor for further information about your application if needed. ` ) ;
2020-10-30 22:33:21 -04:00
embed . addField ( 'Status' , application . decision , true ) ;
2020-10-31 00:15:47 -04:00
embed . addField ( 'User ID' , job . data . userID , true ) ;
2020-10-31 23:46:49 -04:00
embed . addField ( 'Application ID' , application . id , true ) ;
2020-10-30 22:33:21 -04:00
embed . addField ( 'Job ID' , job . id . toString ( ) , true ) ;
embed . setFooter ( this . client . user . username , this . client . user . avatarURL ) ;
embed . setTimestamp ( ) ;
await channel . createMessage ( { content : ` <@ ${ job . data . userID } > ` , embed } ) ;
2020-10-31 02:27:41 -04:00
if ( job . data . func ) {
const func = eval ( job . data . func ) ;
if ( application . status === 'SUCCESS' && application . decision === 'APPROVED' ) await func ( this . client , job . data . userID ) ;
}
2020-10-30 22:33:21 -04:00
} ) ;
2020-10-28 19:44:31 -04:00
}
2020-10-29 01:36:05 -04:00
public updateScore ( score : ScoreInterface , total : number , activity : number , roles : number , moderation : number , cloudServices : number , other : number , staff : number ) {
this . queues . score . add ( 'score::update' , { score , total , activity , roles , moderation , cloudServices , other , staff } ) ;
2020-10-28 19:44:31 -04:00
}
2020-10-30 22:33:21 -04:00
2020-10-31 02:27:41 -04:00
public processApplication ( channelInformation : { messageID : string , guildID : string , channelID : string } , url : string , userID : string , func? : string ) {
2020-10-30 22:33:21 -04:00
return this . queues . score . add ( 'score::apply' , { channelInformation , url , userID , func } ) ;
}
2020-10-28 19:44:31 -04:00
}