57 lines
No EOL
2.3 KiB
TypeScript
57 lines
No EOL
2.3 KiB
TypeScript
import { GuildMember } from "discord.js";
|
|
import { getImpersonation } from "@systems/impersonate";
|
|
import { ResolvedUser } from "@src/types";
|
|
import { getUsermapEntry, getUsermapEntryById } from "@systems/messages";
|
|
import { getActiveCharacter } from "@systems/characters";
|
|
import { Discord } from "@discord";
|
|
|
|
// Resolves a full user context from a GuildMember + discord username
|
|
export async function resolveUser(member: GuildMember): Promise<ResolvedUser> {
|
|
const discordUsername = member.user.username;
|
|
const serverNickname = member.nickname ?? null;
|
|
const globalNickname = member.user.globalName ?? null;
|
|
const displayName = serverNickname ?? globalNickname ?? discordUsername;
|
|
|
|
// Check for active impersonation
|
|
const impersonatedKey = getImpersonation(member.user.id);
|
|
|
|
const entry = impersonatedKey ? { file: impersonatedKey, aliases: [] } : getUsermapEntryById(member.user.id, member.user.username);
|
|
const userKey = entry?.file ?? null;
|
|
const aliases = entry?.aliases ?? [];
|
|
const activeChar = userKey ? getActiveCharacter(userKey) : null;
|
|
|
|
// lookupUsername is used for message system lookups — use impersonated key if impersonating
|
|
const idEntry = getUsermapEntry(member.user.id);
|
|
const lookupUsername = impersonatedKey ?? (idEntry ? member.user.id : discordUsername);
|
|
|
|
return {
|
|
userId: member.user.id,
|
|
discordUsername: member.user.username,
|
|
lookupUsername,
|
|
userKey,
|
|
displayName,
|
|
serverNickname,
|
|
globalNickname,
|
|
aliases,
|
|
activeCharacter: activeChar,
|
|
};
|
|
}
|
|
|
|
// Resolve a user by their usermap key (for officer commands using <name> arg)
|
|
export function resolveByUsermapKey(key: string): { userKey: string; activeCharacter: ReturnType<typeof getActiveCharacter> } {
|
|
return {
|
|
userKey: key,
|
|
activeCharacter: getActiveCharacter(key),
|
|
};
|
|
}
|
|
|
|
export function hasOfficerRole(member: GuildMember, officerRoles: string[]): boolean {
|
|
return member.roles.cache.some((r) => officerRoles.includes(r.name));
|
|
}
|
|
|
|
export const User = {
|
|
hasOfficerRole({member, officerRoles}: { member: GuildMember, officerRoles: string[] }): boolean {
|
|
return Discord.Guild.hasRole({ member: member, roles: officerRoles });
|
|
return member.roles.cache.some((r) => officerRoles.includes(r.name));
|
|
},
|
|
}; |