tg-bot-ts/src/systems/users.ts

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