import { upsertActor } from "@stealth-developers/db"; import { Guild, GuildMember, PermissionsBitField, 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(PermissionsBitField.Flags.ModerateMembers); } else if (member.permissions) { const perms = new PermissionsBitField(BigInt(member.permissions)); isModerator = perms.has(PermissionsBitField.Flags.ModerateMembers); } } else { const user = input; discordId = user.id; username = user.username; displayName = user.displayName; avatar = user.avatar; const cachedMember = guild.members.cache.get(user.id); if (cachedMember) { isModerator = cachedMember.permissions.has(PermissionsBitField.Flags.ModerateMembers); } else { try { const member = await guild.members.fetch(user.id); isModerator = member.permissions.has(PermissionsBitField.Flags.ModerateMembers); } catch {} } } return upsertActor({ guild: { discordId: guild.id, name: guild.name, icon: guild.iconURL() || guild.icon, }, user: { discordId, username, displayName, avatar, }, moderator: isModerator, }); }