350 lines
17 KiB
TypeScript
350 lines
17 KiB
TypeScript
/* eslint-disable no-bitwise */
|
|
/* eslint-disable no-continue */
|
|
import { TextChannel } from 'eris';
|
|
import { Route, Server, RichEmbed } from '../../../class';
|
|
|
|
export default class Report extends Route {
|
|
constructor(server: Server) {
|
|
super(server);
|
|
this.conf = {
|
|
path: '/report',
|
|
};
|
|
}
|
|
|
|
public bind() {
|
|
this.router.all('*', (_req, res, next) => {
|
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
res.setHeader('Access-Control-Allow-Methods', '*');
|
|
res.setHeader('Access-Control-Allow-Headers', '*');
|
|
next();
|
|
});
|
|
|
|
this.router.post('/hard', async (req, res) => {
|
|
try {
|
|
if (!req.headers.authorization) return res.status(401).json({ code: this.constants.codes.UNAUTHORIZED, message: this.constants.messages.UNAUTHORIZED });
|
|
if (!req.body.pin || !req.body.userID || !req.body.reason) return res.status(400).json({ code: this.constants.codes.CLIENT_ERROR, message: this.constants.messages.CLIENT_ERROR });
|
|
if (req.body.reason?.length < 1) return res.status(400).json({ code: this.constants.codes.CLIENT_ERROR, message: this.constants.codes.CLIENT_ERROR });
|
|
|
|
const merchant = await this.server.client.db.Merchant.findOne({ key: req.headers.authorization }).lean().exec();
|
|
if (!merchant) return res.status(401).json({ code: this.constants.codes.UNAUTHORIZED, message: this.constants.messages.UNAUTHORIZED });
|
|
|
|
const member = await this.server.client.db.Score.findOne({ userID: req.body.userID, 'pin.2': req.body.pin }).lean().exec();
|
|
if (!member) return res.status(401).json({ code: this.constants.codes.UNAUTHORIZED, message: this.constants.messages.UNAUTHORIZED });
|
|
|
|
const mem = this.server.client.util.resolveMember(member.userID, this.server.client.guilds.get(this.server.client.config.guildID));
|
|
if (!mem) return res.status(404).json({ code: this.constants.codes.NOT_FOUND, message: this.constants.codes.NOT_FOUND });
|
|
|
|
if (member.locked) return res.status(403).json({ code: this.constants.codes.PERMISSION_DENIED, message: this.constants.messages.PERMISSION_DENIED });
|
|
if (merchant.type !== 1) return res.status(403).json({ code: this.constants.codes.PERMISSION_DENIED, message: this.constants.messages.PERMISSION_DENIED });
|
|
|
|
|
|
const flags = [];
|
|
if (mem.user.publicFlags) {
|
|
if ((mem.user.publicFlags & (1 << 0)) === 1 << 0) flags.push('DISCORD_EMPLOYEE');
|
|
if ((mem.user.publicFlags & (1 << 1)) === 1 << 1) flags.push('PARTNERED_SERVER_OWNER');
|
|
if ((mem.user.publicFlags & (1 << 2)) === 1 << 2) flags.push('HYPESQUAD_EVENTS');
|
|
if ((mem.user.publicFlags & (1 << 3)) === 1 << 3) flags.push('BUG_HUNTER_1');
|
|
if ((mem.user.publicFlags & (1 << 6)) === 1 << 6) flags.push('HOUSE_BRAVERY');
|
|
if ((mem.user.publicFlags & (1 << 7)) === 1 << 7) flags.push('HOUSE_BRILLIANCE');
|
|
if ((mem.user.publicFlags & (1 << 8)) === 1 << 8) flags.push('HOUSE_BALANCE');
|
|
if ((mem.user.publicFlags & (1 << 9)) === 1 << 9) flags.push('EARLY_SUPPORTER');
|
|
if ((mem.user.publicFlags & (1 << 10)) === 1 << 10) flags.push('TEAM_USER');
|
|
if ((mem.user.publicFlags & (1 << 12)) === 1 << 12) flags.push('SYSTEM');
|
|
if ((mem.user.publicFlags & (1 << 14)) === 1 << 14) flags.push('BUG_HUNTER_2');
|
|
if ((mem.user.publicFlags & (1 << 16)) === 1 << 16) flags.push('VERIFIED_BOT');
|
|
if ((mem.user.publicFlags & (1 << 17)) === 1 << 17) flags.push('EARLY_VERIFIED_BOT_DEVELOPER');
|
|
}
|
|
const set = [];
|
|
const accounts = await this.server.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);
|
|
}
|
|
|
|
let totalScore: number;
|
|
let activityScore: number;
|
|
const moderationScore = Math.round(member.moderation);
|
|
let roleScore: number;
|
|
let cloudServicesScore: number;
|
|
const otherScore = Math.round(member.other);
|
|
let miscScore: number;
|
|
|
|
if (member.total < 200) totalScore = 0;
|
|
else if (member.total > 800) totalScore = 800;
|
|
else totalScore = Math.round(member.total);
|
|
|
|
if (member.activity < 10) activityScore = 0;
|
|
else if (member.activity > Math.floor((Math.log1p(3000 + 300 + 200 + 100) * 12))) activityScore = Math.floor((Math.log1p(3000 + 300 + 200 + 100) * 12));
|
|
else activityScore = Math.round(member.activity);
|
|
|
|
if (member.roles <= 0) roleScore = 0;
|
|
else if (member.roles > 54) roleScore = 54;
|
|
else roleScore = Math.round(member.roles);
|
|
|
|
if (member.staff <= 0) miscScore = 0;
|
|
else miscScore = Math.round(member.staff);
|
|
|
|
if (member.cloudServices === 0) cloudServicesScore = 0;
|
|
else if (member.cloudServices > 10) cloudServicesScore = 10;
|
|
else cloudServicesScore = Math.round(member.cloudServices);
|
|
|
|
const inquiries: [{ name: string, date: Date }?] = [];
|
|
if (member.inquiries?.length > 0) {
|
|
for (const inq of member.inquiries) {
|
|
const testDate = (new Date(new Date(inq.date).setHours(2190)));
|
|
if (testDate > new Date()) inquiries.push({ name: inq.name, date: inq.date });
|
|
}
|
|
}
|
|
|
|
if (member.notify) {
|
|
const chan = await this.server.client.getDMChannel(member.userID);
|
|
try {
|
|
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:** ${merchant.name.toUpperCase()}`);
|
|
} catch (err) {
|
|
this.server.client.util.signale.error(`Unable to DM user: ${member.userID} | ${err}`);
|
|
}
|
|
}
|
|
|
|
await this.server.client.db.Merchant.updateOne({ key: req.headers.authorization }, { $addToSet: { pulls: { type: 0, reason: req.body.reason, date: new Date() } } });
|
|
await this.server.client.db.Score.updateOne({ userID: member.userID }, { $addToSet: { inquiries: { name: merchant.name, reason: req.body.reason, date: new Date() } } });
|
|
const embed = new RichEmbed();
|
|
embed.setTitle('Inquiry Notification');
|
|
embed.setColor('#800080');
|
|
embed.addField('Member', `${mem.user.username}#${mem.user.discriminator} | <@${member.userID}>`, true);
|
|
embed.addField('Type', 'HARD', true);
|
|
embed.addField('Department/Service', merchant.name.toUpperCase(), true);
|
|
embed.addField('Reason', req.body.reason ?? 'N/A', true);
|
|
embed.setTimestamp();
|
|
embed.setFooter(this.server.client.user.username, this.server.client.user.avatarURL);
|
|
const chan = <TextChannel> this.server.client.guilds.get(this.server.client.config.guildID).channels.get('611584771356622849');
|
|
chan.createMessage({ embed }).catch(() => {});
|
|
|
|
return res.status(200).json({
|
|
code: this.constants.codes.SUCCESS,
|
|
message: {
|
|
userID: member.userID,
|
|
memberInformation: {
|
|
username: mem.user.username,
|
|
discriminator: mem.user.discriminator,
|
|
joinedServerAt: new Date(mem.joinedAt),
|
|
createdAt: new Date(mem.createdAt),
|
|
avatarURL: mem.avatarURL,
|
|
flags,
|
|
nitroBoost: mem.premiumSince === null,
|
|
},
|
|
percentile: Math.round(this.server.client.util.percentile(set, member.total)),
|
|
totalScore,
|
|
activityScore,
|
|
roleScore,
|
|
moderationScore,
|
|
cloudServicesScore,
|
|
miscScore,
|
|
otherScore,
|
|
inquiries,
|
|
},
|
|
});
|
|
} catch (err) {
|
|
return this.handleError(err, res);
|
|
}
|
|
});
|
|
|
|
this.router.post('/v2/soft', async (req, res) => {
|
|
try {
|
|
if (!req.headers.authorization) return res.status(401).json({ code: this.constants.codes.UNAUTHORIZED, message: this.constants.messages.UNAUTHORIZED });
|
|
if (!req.body.userID) return res.status(400).json({ code: this.constants.codes.CLIENT_ERROR, message: this.constants.messages.CLIENT_ERROR });
|
|
|
|
const merchant = await this.server.client.db.Merchant.findOne({ key: req.headers.authorization }).lean().exec();
|
|
if (!merchant) return res.status(401).json({ code: this.constants.codes.UNAUTHORIZED, message: this.constants.messages.UNAUTHORIZED });
|
|
|
|
const member = await this.server.client.db.Score.findOne({ userID: req.body.userID }).lean().exec();
|
|
if (!member) return res.status(401).json({ code: this.constants.codes.UNAUTHORIZED, message: this.constants.messages.UNAUTHORIZED });
|
|
|
|
let totalScore: number;
|
|
|
|
if (member.total < 200) totalScore = 0;
|
|
else if (member.total > 800) totalScore = 800;
|
|
else totalScore = Math.round(member.total);
|
|
|
|
await this.server.client.db.Merchant.updateOne({ key: req.headers.authorization }, { $addToSet: { pulls: { type: 1, reason: 'N/A', date: new Date() } } });
|
|
await this.server.client.db.Score.updateOne({ userID: member.userID }, { $addToSet: { softInquiries: { name: merchant.name, date: new Date() } } });
|
|
const embed = new RichEmbed();
|
|
embed.setTitle('Inquiry Notification');
|
|
embed.setColor('#00FFFF');
|
|
const mem = this.server.client.util.resolveMember(member.userID, this.server.client.guilds.get(this.server.client.config.guildID));
|
|
if (!mem) return res.status(404).json({ code: this.constants.codes.NOT_FOUND, message: this.constants.codes.NOT_FOUND });
|
|
embed.addField('Member', `${mem.user.username}#${mem.user.discriminator} | <@${member.userID}>`, true);
|
|
embed.addField('Type', 'SOFT', true);
|
|
embed.addField('Department/Service', merchant.name.toUpperCase(), true);
|
|
embed.setTimestamp();
|
|
embed.setFooter(this.server.client.user.username, this.server.client.user.avatarURL);
|
|
const chan = <TextChannel> this.server.client.guilds.get(this.server.client.config.guildID).channels.get('611584771356622849');
|
|
chan.createMessage({ embed }).catch(() => {});
|
|
|
|
if (!merchant.privileged) {
|
|
return res.status(200).json({
|
|
code: this.constants.codes.SUCCESS,
|
|
message: {
|
|
userID: member.userID,
|
|
totalScore,
|
|
},
|
|
});
|
|
}
|
|
const flags = [];
|
|
if (mem.user.publicFlags) {
|
|
if ((mem.user.publicFlags & (1 << 0)) === 1 << 0) flags.push('DISCORD_EMPLOYEE');
|
|
if ((mem.user.publicFlags & (1 << 1)) === 1 << 1) flags.push('PARTNERED_SERVER_OWNER');
|
|
if ((mem.user.publicFlags & (1 << 2)) === 1 << 2) flags.push('HYPESQUAD_EVENTS');
|
|
if ((mem.user.publicFlags & (1 << 3)) === 1 << 3) flags.push('BUG_HUNTER_1');
|
|
if ((mem.user.publicFlags & (1 << 6)) === 1 << 6) flags.push('HOUSE_BRAVERY');
|
|
if ((mem.user.publicFlags & (1 << 7)) === 1 << 7) flags.push('HOUSE_BRILLIANCE');
|
|
if ((mem.user.publicFlags & (1 << 8)) === 1 << 8) flags.push('HOUSE_BALANCE');
|
|
if ((mem.user.publicFlags & (1 << 9)) === 1 << 9) flags.push('EARLY_SUPPORTER');
|
|
if ((mem.user.publicFlags & (1 << 10)) === 1 << 10) flags.push('TEAM_USER');
|
|
if ((mem.user.publicFlags & (1 << 12)) === 1 << 12) flags.push('SYSTEM');
|
|
if ((mem.user.publicFlags & (1 << 14)) === 1 << 14) flags.push('BUG_HUNTER_2');
|
|
if ((mem.user.publicFlags & (1 << 16)) === 1 << 16) flags.push('VERIFIED_BOT');
|
|
if ((mem.user.publicFlags & (1 << 17)) === 1 << 17) flags.push('EARLY_VERIFIED_BOT_DEVELOPER');
|
|
}
|
|
const set = [];
|
|
const accounts = await this.server.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);
|
|
}
|
|
|
|
let activityScore: number;
|
|
const moderationScore = Math.round(member.moderation);
|
|
let roleScore: number;
|
|
let cloudServicesScore: number;
|
|
const otherScore = Math.round(member.other);
|
|
let miscScore: number;
|
|
|
|
if (member.activity < 10) activityScore = 0;
|
|
else if (member.activity > Math.floor((Math.log1p(3000 + 300 + 200 + 100) * 12))) activityScore = Math.floor((Math.log1p(3000 + 300 + 200 + 100) * 12));
|
|
else activityScore = Math.round(member.activity);
|
|
|
|
if (member.roles <= 0) roleScore = 0;
|
|
else if (member.roles > 54) roleScore = 54;
|
|
else roleScore = Math.round(member.roles);
|
|
|
|
if (member.staff <= 0) miscScore = 0;
|
|
else miscScore = Math.round(member.staff);
|
|
|
|
if (member.cloudServices === 0) cloudServicesScore = 0;
|
|
else if (member.cloudServices > 10) cloudServicesScore = 10;
|
|
else cloudServicesScore = Math.round(member.cloudServices);
|
|
|
|
|
|
return res.status(200).json({
|
|
code: this.constants.codes.SUCCESS,
|
|
message: {
|
|
userID: member.userID,
|
|
memberInformation: {
|
|
username: mem.user.username,
|
|
discriminator: mem.user.discriminator,
|
|
joinedServerAt: new Date(mem.joinedAt),
|
|
createdAt: new Date(mem.createdAt),
|
|
avatarURL: mem.avatarURL,
|
|
flags,
|
|
nitroBoost: mem.premiumSince === null,
|
|
},
|
|
totalScore,
|
|
percentile: Math.round(this.server.client.util.percentile(set, member.total)),
|
|
activityScore,
|
|
moderationScore,
|
|
roleScore,
|
|
cloudServicesScore,
|
|
otherScore,
|
|
miscScore,
|
|
},
|
|
});
|
|
} catch (err) {
|
|
return this.handleError(err, res);
|
|
}
|
|
});
|
|
|
|
this.router.post('/soft', async (req, res) => {
|
|
try {
|
|
if (!req.headers.authorization) return res.status(401).json({ code: this.constants.codes.UNAUTHORIZED, message: this.constants.messages.UNAUTHORIZED });
|
|
if (!req.body.pin || !req.body.userID) return res.status(400).json({ code: this.constants.codes.CLIENT_ERROR, message: this.constants.messages.CLIENT_ERROR });
|
|
|
|
const merchant = await this.server.client.db.Merchant.findOne({ key: req.headers.authorization }).lean().exec();
|
|
if (!merchant) return res.status(401).json({ code: this.constants.codes.UNAUTHORIZED, message: this.constants.messages.UNAUTHORIZED });
|
|
|
|
const member = await this.server.client.db.Score.findOne({ userID: req.body.userID, 'pin.2': req.body.pin }).lean().exec();
|
|
if (!member) return res.status(401).json({ code: this.constants.codes.UNAUTHORIZED, message: this.constants.messages.UNAUTHORIZED });
|
|
|
|
let totalScore: number;
|
|
|
|
if (member.total < 200) totalScore = 0;
|
|
else if (member.total > 800) totalScore = 800;
|
|
else totalScore = Math.round(member.total);
|
|
|
|
await this.server.client.db.Merchant.updateOne({ key: req.headers.authorization }, { $addToSet: { pulls: { type: 1, reason: 'N/A', date: new Date() } } });
|
|
await this.server.client.db.Score.updateOne({ userID: member.userID }, { $addToSet: { softInquiries: { name: merchant.name, date: new Date() } } });
|
|
const embed = new RichEmbed();
|
|
embed.setTitle('Inquiry Notification');
|
|
embed.setColor('#00FFFF');
|
|
const mem = this.server.client.util.resolveMember(member.userID, this.server.client.guilds.get(this.server.client.config.guildID));
|
|
embed.addField('Member', `${mem.user.username}#${mem.user.discriminator} | <@${member.userID}>`, true);
|
|
embed.addField('Type', 'SOFT', true);
|
|
embed.addField('Department/Service', merchant.name.toUpperCase(), true);
|
|
embed.setTimestamp();
|
|
embed.setFooter(this.server.client.user.username, this.server.client.user.avatarURL);
|
|
const chan = <TextChannel> this.server.client.guilds.get(this.server.client.config.guildID).channels.get('611584771356622849');
|
|
chan.createMessage({ embed }).catch(() => {});
|
|
|
|
if (!merchant.privileged) {
|
|
return res.status(200).json({
|
|
code: this.constants.codes.SUCCESS,
|
|
message: {
|
|
userID: member.userID,
|
|
totalScore,
|
|
},
|
|
});
|
|
}
|
|
let activityScore: number;
|
|
const moderationScore = Math.round(member.moderation);
|
|
let roleScore: number;
|
|
let cloudServicesScore: number;
|
|
const otherScore = Math.round(member.other);
|
|
let miscScore: number;
|
|
|
|
if (member.activity < 10) activityScore = 0;
|
|
else if (member.activity > Math.floor((Math.log1p(3000 + 300 + 200 + 100) * 12))) activityScore = Math.floor((Math.log1p(3000 + 300 + 200 + 100) * 12));
|
|
else activityScore = Math.round(member.activity);
|
|
|
|
if (member.roles <= 0) roleScore = 0;
|
|
else if (member.roles > 54) roleScore = 54;
|
|
else roleScore = Math.round(member.roles);
|
|
|
|
if (member.staff <= 0) miscScore = 0;
|
|
else miscScore = Math.round(member.staff);
|
|
|
|
if (member.cloudServices === 0) cloudServicesScore = 0;
|
|
else if (member.cloudServices > 10) cloudServicesScore = 10;
|
|
else cloudServicesScore = Math.round(member.cloudServices);
|
|
|
|
|
|
return res.status(200).json({
|
|
code: this.constants.codes.SUCCESS,
|
|
message: {
|
|
userID: member.userID,
|
|
totalScore,
|
|
activityScore,
|
|
moderationScore,
|
|
roleScore,
|
|
cloudServicesScore,
|
|
otherScore,
|
|
miscScore,
|
|
},
|
|
});
|
|
} catch (err) {
|
|
return this.handleError(err, res);
|
|
}
|
|
});
|
|
}
|
|
}
|