all repos — stealth-developers @ d206557e10ffca892f403def6d3d8f04e432f01a

apps/bot/src/lib/db.ts (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
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,
	});
}