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