all repos — stealth-developers @ f1905f7477593bc2b93f7d27e474d67e8ec02eba

pkgs/bot/src/server/api.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
import { CDNRoutes, ImageFormat, RouteBases } from "discord-api-types/v10";
import type { User as DiscordUser, GuildMember } from "discord.js";
import type { Attachment } from "@/database";
import { getUser } from "./discord";
import type {
	User as UserProfile,
	Attachment as ApiMessageAttachment,
} from "@stealth-developers/api";

export function avatar(id: string, avatarHash?: string | null): string {
	if (!avatarHash) {
		return "https://cdn.discordapp.com/icons/895998762630127616/36c6e14d0933eb338826599b632df818.webp?size=80&quality=lossless";
	}
	return `${RouteBases.cdn}${CDNRoutes.userAvatar(id, avatarHash, ImageFormat.WebP)}`;
}

export function name(member: GuildMember): string {
	return member.nickname ?? member.user.displayName ?? member.user.username;
}

export function marshallIntoApiUser(user: GuildMember | DiscordUser): UserProfile {
	const isMember = "roles" in user;
	const discordUser = isMember ? user.user : user;

	return {
		id: discordUser.id,
		name: isMember ? name(user) : discordUser.displayName || discordUser.username,
		avatarUrl: avatar(discordUser.id, discordUser.avatar),
		isModerator: isMember ? user.roles.cache.has("Moderator") : false,
	};
}

export async function intoApiAttachment(a: Attachment): Promise<ApiMessageAttachment> {
	const user = a.authorId ? await getUser(a.authorId) : null;

	return {
		id: a.id,
		ownerType: a.ownerType as "ticket" | "ticket_message" | "bug",
		owner: user,
		fileName: a.fileName,
		contentType: a.contentType,
		size: a.size,
		bucket: a.bucket,
		key: a.key,
		url: a.url,
		uploadedAt: a.uploadedAt.toUTCString(),
	};
}