import { GuildMember } from "discord.js"; import { getImpersonation } from "./impersonate"; import { ResolvedUser } from "../types"; import { getUsermapEntry } from "./messages"; import { getActiveCharacter } from "./characters"; // Resolves a full user context from a GuildMember + discord username export async function resolveUser(member: GuildMember): Promise { 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: [] } : getUsermapEntry(discordUsername); 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 lookupUsername = impersonatedKey ?? discordUsername; return { userId: member.user.id, discordUsername, lookupUsername, userKey, displayName, serverNickname, globalNickname, aliases, activeCharacter: activeChar, }; } // Resolve a user by their usermap key (for officer commands using arg) export function resolveByUsermapKey(key: string): { userKey: string; activeCharacter: ReturnType } { return { userKey: key, activeCharacter: getActiveCharacter(key), }; } export function hasOfficerRole(member: GuildMember, officerRoles: string[]): boolean { return member.roles.cache.some((r) => officerRoles.includes(r.name)); }