crv2/util/MemberUtil.ts

87 lines
4.0 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 {
// 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) {
console.log(`[MemberUtil] Formatting name for ${target.displayName}`)
return {
text: `${target.displayName} [k]`,
iconURL: "https://static.libraryofcode.org/library_of_code_redeg.png"
}
} else if (partner?.commissionType == PartnerCommissionType.CONTRACTUAL) { // if the commission type is contractual, add a [c] to the end of the name
console.log(`[MemberUtil] Formatting name for ${target.displayName}`)
return {
text: `${target.displayName} [c]`,
iconURL: "https://static.libraryofcode.org/library_of_code_redeg.png"
}
} else { // otherwise, just set the author to the member's display name
console.log(`[MemberUtil] Formatting name for ${target.displayName} at url ${target instanceof GuildMember ? target.user.displayAvatarURL() : target.displayAvatarURL()}`);
return {
text: target.displayName,
iconURL: target instanceof GuildMember ? target.user.displayAvatarURL() : target.displayAvatarURL()
}
}
}
}