import { User, type APIInteractionGuildMember, GuildMember, Guild } from "discord.js"; import { upsertActor } from "@stealth-developers/db"; export async function upsertUser( input: APIInteractionGuildMember | GuildMember | User, guild: Guild, ) { let discordId: string; let username: string; let displayName: string | null = null; let avatar: string | null = null; let isModerator = false; if ("user" in input) { const member = input; const user = member.user; discordId = user.id; username = user.username; const nick = member instanceof GuildMember ? member.nickname : member.nick; const globalName = user instanceof User ? user.globalName : user.global_name; displayName = nick || globalName || user.username; avatar = member.avatar || user.avatar; if (member instanceof GuildMember) { isModerator = member.permissions.has("ModerateMembers"); } else if (member.permissions) { const { PermissionsBitField } = await import("discord.js"); const perms = new PermissionsBitField(BigInt(member.permissions)); isModerator = perms.has("ModerateMembers"); } } else { const user = input; discordId = user.id; username = user.username; displayName = user.displayName; avatar = user.avatar; try { const member = await guild.members.fetch(user.id); isModerator = member.permissions.has("ModerateMembers"); } catch {} } return upsertActor({ guild: { discordId: guild.id, name: guild.name, icon: guild.iconURL() || guild.icon, }, user: { discordId, username, displayName, avatar, }, moderator: isModerator, }); }