47 lines
No EOL
1.8 KiB
TypeScript
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));
|
|
} |