import * as mfm from "mfm-js"; import config from "../../../config/index.js"; import { DriveFiles, UserProfiles } from "../../../models/index.js"; import { getUserKeypair } from "../../../misc/keypair-store.js"; import { toHtml } from "../../../mfm/to-html.js"; import renderImage from "./image.js"; import renderKey from "./key.js"; import { getEmojis } from "./note.js"; import renderEmoji from "./emoji.js"; import renderHashtag from "./hashtag.js"; export async function renderPerson(user) { const id = `${config.url}/users/${user.id}`; const isSystem = !!user.username.match(/\./); const [avatar, banner, profile] = await Promise.all([ user.avatarId ? DriveFiles.findOneBy({ id: user.avatarId }) : Promise.resolve(undefined), user.bannerId ? DriveFiles.findOneBy({ id: user.bannerId }) : Promise.resolve(undefined), UserProfiles.findOneByOrFail({ userId: user.id }) ]); const attachment = []; if (profile.fields) { for (const field of profile.fields){ const value = await toHtml(mfm.parse(field.value), profile.mentions, profile.userHost); attachment.push({ type: "PropertyValue", name: field.name, value: value ?? field.value }); } } const emojis = await getEmojis(user.emojis); const apemojis = emojis.map((emoji)=>renderEmoji(emoji)); const hashtagTags = (user.tags || []).map((tag)=>renderHashtag(tag)); const tag = [ ...apemojis, ...hashtagTags ]; const keypair = await getUserKeypair(user.id); let canBite; if (user.canBite === "anyone") { canBite = "https://www.w3.org/ns/activitystreams#Public"; } else if (user.canBite === "followers") { canBite = user.followersUri ?? `${config.url}/users/${user.id}/followers`; } const person = { type: isSystem ? "Application" : user.isBot ? "Service" : "Person", id, inbox: `${id}/inbox`, outbox: `${id}/outbox`, followers: `${id}/followers`, following: `${id}/following`, featured: `${id}/collections/featured`, sharedInbox: `${config.url}/inbox`, endpoints: { sharedInbox: `${config.url}/inbox` }, url: `${config.url}/@${user.username}`, preferredUsername: user.username, name: user.name, summary: profile.description ? await toHtml(mfm.parse(profile.description), profile.mentions, profile.userHost) : null, _misskey_summary: profile.description, icon: avatar ? renderImage(avatar) : null, image: banner ? renderImage(banner) : null, tag, manuallyApprovesFollowers: user.isLocked, discoverable: !!user.isExplorable, publicKey: renderKey(user, keypair, "#main-key"), isCat: user.isCat, attachment: attachment.length ? attachment : undefined, pronouns: profile.pronouns, canBite }; if (user.movedToUri) { person.movedTo = user.movedToUri; } if (user.alsoKnownAs) { person.alsoKnownAs = user.alsoKnownAs; } if (profile.birthday) { person["vcard:bday"] = profile.birthday; } if (profile.location) { person["vcard:Address"] = profile.location; } return person; }