tg-bot-ts/src/systems/users.ts
2026-06-03 01:51:26 +01:00

47 lines
No EOL
1.8 KiB
TypeScript

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<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: [] } : 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 <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));
}