UNPKG

@atproto/api

Version:

Client library for atproto and Bluesky

112 lines (104 loc) 3.6 kB
import { AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, AppBskyLabelerDefs, ComAtprotoLabelDefs, } from '../client' import { asPredicate } from '../client/util' import { InterpretedLabelValueDefinition, LabelPreference, LabelValueDefinitionFlag, ModerationBehavior, } from './types' export function isQuotedPost(embed: unknown): embed is AppBskyEmbedRecord.View { return Boolean(embed && AppBskyEmbedRecord.isView(embed)) } export function isQuotedPostWithMedia( embed: unknown, ): embed is AppBskyEmbedRecordWithMedia.View { return Boolean(embed && AppBskyEmbedRecordWithMedia.isView(embed)) } export function interpretLabelValueDefinition( def: ComAtprotoLabelDefs.LabelValueDefinition, definedBy: string | undefined, ): InterpretedLabelValueDefinition { const behaviors: { account: ModerationBehavior profile: ModerationBehavior content: ModerationBehavior } = { account: {}, profile: {}, content: {}, } const alertOrInform: 'alert' | 'inform' | undefined = def.severity === 'alert' ? 'alert' : def.severity === 'inform' ? 'inform' : undefined if (def.blurs === 'content') { // target=account, blurs=content behaviors.account.profileList = alertOrInform behaviors.account.profileView = alertOrInform behaviors.account.contentList = 'blur' behaviors.account.contentView = def.adultOnly ? 'blur' : alertOrInform // target=profile, blurs=content behaviors.profile.profileList = alertOrInform behaviors.profile.profileView = alertOrInform // target=content, blurs=content behaviors.content.contentList = 'blur' behaviors.content.contentView = def.adultOnly ? 'blur' : alertOrInform } else if (def.blurs === 'media') { // target=account, blurs=media behaviors.account.profileList = alertOrInform behaviors.account.profileView = alertOrInform behaviors.account.avatar = 'blur' behaviors.account.banner = 'blur' // target=profile, blurs=media behaviors.profile.profileList = alertOrInform behaviors.profile.profileView = alertOrInform behaviors.profile.avatar = 'blur' behaviors.profile.banner = 'blur' // target=content, blurs=media behaviors.content.contentMedia = 'blur' } else if (def.blurs === 'none') { // target=account, blurs=none behaviors.account.profileList = alertOrInform behaviors.account.profileView = alertOrInform behaviors.account.contentList = alertOrInform behaviors.account.contentView = alertOrInform // target=profile, blurs=none behaviors.profile.profileList = alertOrInform behaviors.profile.profileView = alertOrInform // target=content, blurs=none behaviors.content.contentList = alertOrInform behaviors.content.contentView = alertOrInform } let defaultSetting: LabelPreference = 'warn' if (def.defaultSetting === 'hide' || def.defaultSetting === 'ignore') { defaultSetting = def.defaultSetting as LabelPreference } const flags: LabelValueDefinitionFlag[] = ['no-self'] if (def.adultOnly) { flags.push('adult') } return { ...def, definedBy, configurable: true, defaultSetting, flags, behaviors, } } export function interpretLabelValueDefinitions( labelerView: AppBskyLabelerDefs.LabelerViewDetailed, ): InterpretedLabelValueDefinition[] { return (labelerView.policies?.labelValueDefinitions || []) .filter(asPredicate(ComAtprotoLabelDefs.validateLabelValueDefinition)) .map((labelValDef) => interpretLabelValueDefinition(labelValDef, labelerView.creator.did), ) }