/* eslint-disable no-continue */ /* eslint-disable default-case */ import moment from 'moment'; import { v4 as uuid } from 'uuid'; import { Message, User, TextChannel } from 'eris'; import { Client, Command, RichEmbed } from '../class'; export default class Score extends Command { constructor(client: Client) { super(client); this.name = 'score'; this.description = 'Pulls a hard score report for a member.'; this.usage = `${this.client.config.prefix}score :\n${this.client.config.prefix}score notify \n${this.client.config.prefix}score `; this.permissions = 0; this.guildOnly = false; this.enabled = true; } public async run(message: Message, args: string[]) { try { let check = false; let user: User; if (args[0] === 'notify') { user = message.author; if (!user) return this.error(message.channel, 'Member not found.'); const score = await this.client.db.Score.findOne({ userID: message.author.id }); if (!score) return this.error(message.channel, 'Score not calculated yet.'); if (!score.notify) await this.client.db.Score.updateOne({ userID: message.author.id }, { $set: { notify: false } }); switch (args[1]) { case 'on': await this.client.db.Score.updateOne({ userID: message.author.id }, { $set: { notify: true } }); return this.success(message.channel, 'You will now be sent notifications whenever your score is hard-pulled.'); case 'off': await this.client.db.Score.updateOne({ userID: message.author.id }, { $set: { notify: false } }); return this.success(message.channel, 'You will no longer be sent notifications when your score is hard-pulled.'); default: return this.error(message.channel, 'Invalid option. Valid options are `yes` and `no`.'); } } if (args[0] === 'lock' || args[0] === 'unlock') { user = message.author; if (!user) return this.error(message.channel, 'Member not found.'); const score = await this.client.db.Score.findOne({ userID: message.author.id }); if (!score) return this.error(message.channel, 'Score not calculated yet.'); if (!score.locked) await this.client.db.Score.updateOne({ userID: message.author.id }, { $set: { locked: false } }); switch (args[0]) { case 'lock': await this.client.db.Score.updateOne({ userID: message.author.id }, { $set: { locked: true } }); return this.success(message.channel, 'Your report is now locked.'); case 'unlock': await this.client.db.Score.updateOne({ userID: message.author.id }, { $set: { locked: false } }); return this.success(message.channel, 'Your report is now unlocked.'); } } if (!args[0] || !this.checkCustomPermissions(this.client.util.resolveMember(message.author.id, this.mainGuild), 4)) { user = message.author; if (!user) return this.error(message.channel, 'Member not found.'); await this.client.db.Score.updateOne({ userID: user.id }, { $addToSet: { softInquiries: { name: `${user.username} via Discord`, date: new Date() } } }); const embed = new RichEmbed(); embed.setTitle('Inquiry Notification'); embed.setColor('#00FFFF'); const mem = this.client.util.resolveMember(user.id, this.client.guilds.get(this.client.config.guildID)); embed.addField('Member', `${mem.user.username}#${mem.user.discriminator} | <@${user.id}>`, true); embed.addField('Type', 'SOFT', true); embed.addField('Department/Service', `${user.username} via Discord`.toUpperCase(), true); embed.setTimestamp(); embed.setFooter(this.client.user.username, this.client.user.avatarURL); const log = this.client.guilds.get(this.client.config.guildID).channels.get('611584771356622849'); log.createMessage({ embed }).catch(() => {}); check = true; } else { user = this.client.util.resolveMember(args[0], this.mainGuild)?.user; 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])] }); user = this.client.util.resolveMember(sc.userID, this.mainGuild).user; } 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.'); 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]; const score = await this.client.db.Score.findOne({ userID: user.id }); if (!score) return this.error(message.channel, 'Score not calculated yet.'); if (score.locked) return this.error(message.channel, 'The score report you have requested has been locked.'); const reportID = uuid(); await this.client.db.Score.updateOne({ userID: user.id }, { $addToSet: { inquiries: { id: reportID, name, reason, date: new Date(), report: score.toObject() } } }); const embed = new RichEmbed(); embed.setTitle('Inquiry Notification'); embed.setDescription(reportID); embed.setColor('#800080'); const mem = this.client.util.resolveMember(score.userID, this.client.guilds.get(this.client.config.guildID)); embed.addField('Member', `${mem.user.username}#${mem.user.discriminator} | <@${score.userID}>`, true); embed.addField('Type', 'HARD', true); embed.addField('Department/Service', name.toUpperCase(), true); embed.addField('Reason', reason ?? 'N/A', true); embed.setTimestamp(); embed.setFooter(this.client.user.username, this.client.user.avatarURL); const log = this.client.guilds.get(this.client.config.guildID).channels.get('611584771356622849'); log.createMessage({ embed }).catch(() => {}); if (score.notify === true) { await this.client.getDMChannel(user.id).then((chan) => { chan.createMessage(`__**Community Score - Hard Pull Notification**__\n*You have signed up to be notified whenever your hard score has been pulled. See \`?score\` for more information.*\n\n**Department/Service:** ${name.toUpperCase()}`); }).catch(() => {}); } } } if (!user) return this.error(message.channel, 'Member not found.'); const score = await this.client.db.Score.findOne({ userID: user.id }); if (!score) return this.error(message.channel, 'Community Report has not been generated yet.'); let totalScore = '0'; let activityScore = '0'; let moderationScore = '0'; let roleScore = '0'; let cloudServicesScore = '0'; let otherScore = '0'; let miscScore = '0'; if (score) { if (score.total < 200) totalScore = '---'; else if (score.total > 800) totalScore = '800'; else totalScore = `${score.total}`; if (score.activity < 10) activityScore = '---'; else if (score.activity > Math.floor((Math.log1p(3000 + 300 + 200 + 100) * 12))) activityScore = String(Math.floor((Math.log1p(3000 + 300 + 200 + 100) * 12))); else activityScore = `${score.activity}`; if (score.roles <= 0) roleScore = '---'; else if (score.roles > 54) roleScore = '54'; else roleScore = `${score.roles}`; moderationScore = `${score.moderation}`; if (score.other === 0) otherScore = '---'; else otherScore = `${score.other}`; if (score.staff <= 0) miscScore = '---'; else miscScore = `${score.staff}`; if (score.cloudServices === 0) cloudServicesScore = '---'; else if (score.cloudServices > 10) cloudServicesScore = '10'; else cloudServicesScore = `${score.cloudServices}`; } // else return this.error(message.channel, 'Community Score has not been calculated yet.'); 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); const embed = new RichEmbed(); embed.setTitle('Community Report'); embed.setAuthor(user.username, user.avatarURL); embed.setThumbnail(user.avatarURL); /* for (const role of member.roles.map((r) => this.mainGuild.roles.get(r)).sort((a, b) => b.position - a.position)) { if (role?.color !== 0) { embed.setColor(role.color); break; } } */ if (score?.inquiries?.length > 0) { 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'; score.inquiries.forEach((inq) => { const testDate = (new Date(new Date(inq.date).setHours(1460))); // eslint-disable-next-line no-useless-escape if (testDate > new Date()) desc += `${inq.id ? `__[${inq.id}]__\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`; }); embed.setDescription(desc); } let color = '🔴'; let additionalText = 'POOR'; embed.setColor('FF0000'); if (score.total >= 550) { color = '🟠'; additionalText = 'FAIR'; embed.setColor('FFA500'); } if (score.total >= 630) { color = '🟡'; additionalText = 'GOOD'; embed.setColor('FFFF00'); } if (score.total >= 700) { color = '🟢'; additionalText = 'EXCELLENT'; embed.setColor('66FF66'); } if (score.total >= 770) { color = '✨'; additionalText = 'EXCEPTIONAL'; embed.setColor('#99FFFF'); } embed.addField('CommScore™ | 200 to 800', score ? `${color} ${totalScore} | ${additionalText} | ${this.client.util.ordinal(Math.round(percentile))} Percentile` : 'N/C', true); embed.addField(`Activity | 10 to ${Math.floor(Math.log1p(3000 + 300 + 200 + 100) * 12)}`, activityScore || 'N/C', true); embed.addField('Roles | 1 to N/A', roleScore || 'N/C', true); embed.addField('Moderation | N/A to 2' || 'N/C', moderationScore, true); embed.addField('Cloud Services | N/A to 10+', cloudServicesScore || 'N/C', true); embed.addField('Other', otherScore || 'N/C', true); embed.addField('Misc', miscScore || 'N/C', true); if (score.locked) { embed.addField('Status', 'Score Report Locked'); } if (score.pin?.length > 0 && message.channel.type === 1) { embed.addField('PIN', score.pin.join('-'), true); } 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); } // eslint-disable-next-line no-mixed-operators if ((args[1] === 'hard' || args[1] === 'soft') && this.checkCustomPermissions(this.client.util.resolveMember(message.author.id, this.mainGuild), 4)) { if (score.pin?.length > 0) embed.addField('PIN', score.pin.join('-'), true); 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; } await this.client.db.Score.updateOne({ userID: user.id }, { $addToSet: { softInquiries: { name, date: new Date() } } }); const embed2 = new RichEmbed(); embed2.setTitle('Inquiry Notification'); embed2.setColor('#00FFFF'); const mem = this.client.util.resolveMember(score.userID, this.client.guilds.get(this.client.config.guildID)); embed2.addField('Member', `${mem.user.username}#${mem.user.discriminator} | <@${score.userID}>`, true); embed2.addField('Type', 'SOFT', true); embed2.addField('Department/Service', name.toUpperCase(), true); embed2.setTimestamp(); embed2.setFooter(this.client.user.username, this.client.user.avatarURL); const log = this.client.guilds.get(this.client.config.guildID).channels.get('611584771356622849'); log.createMessage({ embed: embed2 }).catch(() => {}); } } if (args[1] === 'hard' && this.checkCustomPermissions(this.client.util.resolveMember(message.author.id, this.mainGuild), 6)) { await message.channel.createMessage({ embed }); await message.channel.createMessage('***===BEGIN ADDITIONAL INFORMATION===***'); 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`); await whoisMessage.delete(); const modlogsMessage = await message.channel.createMessage(`=modlogs ${user.id}`); await modlogsMessage.delete(); return await message.channel.createMessage('***===END ADDITIONAL INFORMATION===***'); } return message.channel.createMessage({ embed }); } catch (err) { return this.client.util.handleError(err, message, this); } } }