crv2/util/MemberUtil.ts

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(),
};
}
}
}