import { upsertActor } from "@stealth-developers/db"; import { Guild, GuildMember, User } from "discord.js"; import type { AnyUser } from "@/types"; /** adds or updates a user in the database, also adds or updates the guild actor */ export async function upsertUser(input: AnyUser, 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, }); }