forked from engineering/crv2
119 lines
3.8 KiB
TypeScript
119 lines
3.8 KiB
TypeScript
import Partner, {
|
|
PartnerCommissionType,
|
|
PartnerDepartment,
|
|
PartnerModel,
|
|
PartnerRoleType,
|
|
PartnerTitle,
|
|
} from "../database/Partner";
|
|
import Member, { MemberAdditionalAcknowledgement, MemberModel } from "../database/Member";
|
|
import { Client, GuildMember, User } from "discord.js";
|
|
import { guildID } from "../config.json";
|
|
|
|
export interface PartnerOptions {
|
|
roleType: PartnerRoleType;
|
|
commissionType: PartnerCommissionType;
|
|
department: PartnerDepartment;
|
|
title: PartnerTitle;
|
|
directReport: Partner | string;
|
|
}
|
|
|
|
export interface FormatNameOptions {
|
|
text: string;
|
|
iconURL: string;
|
|
}
|
|
|
|
// TODO: Add the rest of the remaining role configurations
|
|
export const PartnerDiscordRoleMap = {
|
|
// Director of Engineering, Management, Staff, Technician, Core Team, Play Caller
|
|
"Director of Engineering": [
|
|
"1077646568091570236",
|
|
"1077646956890951690",
|
|
"446104438969466890",
|
|
"701454780828221450",
|
|
"453689940140883988",
|
|
"1014978134573064293",
|
|
],
|
|
// Director of Operations, Management, Staff, Moderator, Core Team, Play Caller
|
|
"Director of Operations": [
|
|
"1077647072163020840",
|
|
"1077646956890951690",
|
|
"446104438969466890",
|
|
"455972169449734144",
|
|
"453689940140883988",
|
|
"1014978134573064293",
|
|
],
|
|
};
|
|
|
|
export default class MemberUtil {
|
|
public static async createNewPartner(member: Member, options: PartnerOptions) {
|
|
const partner = new PartnerModel();
|
|
partner.discordID = member.discordID;
|
|
partner.roleType = options.roleType;
|
|
partner.commissionType = options.commissionType;
|
|
partner.department = options.department;
|
|
partner.title = options.title;
|
|
partner.directReport = options.directReport;
|
|
await partner.save();
|
|
return partner;
|
|
}
|
|
|
|
public static async getPartner(member: Member) {
|
|
return PartnerModel.findOne({ discordID: member.discordID });
|
|
}
|
|
|
|
public static async deletePartner(member: Member) {
|
|
return PartnerModel.deleteOne({ discordID: member.discordID });
|
|
}
|
|
|
|
public static addAcknowledgementToMember(
|
|
member: Member,
|
|
acknowledgement: MemberAdditionalAcknowledgement
|
|
) {
|
|
if (!member.additionalAcknowledgement || member.additionalAcknowledgement?.length === 0) {
|
|
MemberModel.updateOne({ discordID: member.discordID }, { additionalAcknowledgement: [] });
|
|
}
|
|
if (member.additionalAcknowledgement?.includes(acknowledgement))
|
|
throw new Error("This member already has this acknowledgement.");
|
|
return MemberModel.updateOne(
|
|
{ discordID: member.discordID },
|
|
{ $push: { additionalAcknowledgement: acknowledgement } }
|
|
);
|
|
}
|
|
|
|
// TODO: comments and extended formatting
|
|
public static formatName(
|
|
target: GuildMember | User,
|
|
partner?: Partner | null
|
|
): FormatNameOptions {
|
|
console.log(
|
|
`[MemberUtil] Formatting name for ${target.displayName} at url ${target instanceof GuildMember ? target.user.displayAvatarURL() : target.displayAvatarURL()}`
|
|
);
|
|
// if the role type is managerial, add a [k] to the end of the name
|
|
// if the partner exists, set the iconURL to the organizational logo
|
|
if (partner?.roleType == PartnerRoleType.MANAGERIAL) {
|
|
return {
|
|
text: `${target.displayName} [k]`,
|
|
iconURL: target.displayAvatarURL(),
|
|
};
|
|
} else if (partner?.commissionType == PartnerCommissionType.CONTRACTUAL) {
|
|
// if the commission type is contractual, add a [c] to the end of the name
|
|
return {
|
|
text: `${target.displayName} [c]`,
|
|
iconURL:
|
|
target instanceof GuildMember
|
|
? target.user.displayAvatarURL()
|
|
: target.displayAvatarURL(),
|
|
};
|
|
} else {
|
|
// otherwise, just set the author to the member's display name
|
|
return {
|
|
text: target.displayName,
|
|
iconURL:
|
|
target instanceof GuildMember
|
|
? target.user.displayAvatarURL()
|
|
: target.displayAvatarURL(),
|
|
};
|
|
}
|
|
}
|
|
}
|