From a7195ccbd61939253499c50c2d76af1cd292da9b Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 1 Mar 2024 18:03:34 -0600 Subject: [PATCH] Fix muting of embedded data (#3071) --- src/lib/moderatePost_wrapped.ts | 177 ++++++++++++++++++++++++++------ 1 file changed, 148 insertions(+), 29 deletions(-) diff --git a/src/lib/moderatePost_wrapped.ts b/src/lib/moderatePost_wrapped.ts index 92543b42..9f6fa9c0 100644 --- a/src/lib/moderatePost_wrapped.ts +++ b/src/lib/moderatePost_wrapped.ts @@ -6,6 +6,7 @@ import { AppBskyFeedPost, AppBskyRichtextFacet, AppBskyEmbedImages, + AppBskyEmbedExternal, } from '@atproto/api' type ModeratePost = typeof moderatePost @@ -205,44 +206,151 @@ export function moderatePost_wrapped( if (subject.embed) { let embedHidden = false + let embedMuted = false + let externalMuted = false + if (AppBskyEmbedRecord.isViewRecord(subject.embed.record)) { embedHidden = hiddenPosts.includes(subject.embed.record.uri) - - if (AppBskyFeedPost.isRecord(subject.embed.record.value)) { - embedHidden = - embedHidden || - hasMutedWord({ - mutedWords, - text: subject.embed.record.value.text, - facets: subject.embed.record.value.facets, - outlineTags: subject.embed.record.value.tags, - languages: subject.embed.record.value.langs, - isOwnPost, - }) - - if (AppBskyEmbedImages.isMain(subject.embed.record.value.embed)) { - for (const image of subject.embed.record.value.embed.images) { - embedHidden = - embedHidden || - hasMutedWord({ - mutedWords, - text: image.alt, - facets: [], - outlineTags: [], - languages: subject.embed.record.value.langs, - isOwnPost, - }) - } - } - } } if ( AppBskyEmbedRecordWithMedia.isView(subject.embed) && AppBskyEmbedRecord.isViewRecord(subject.embed.record.record) ) { - // TODO what embedHidden = hiddenPosts.includes(subject.embed.record.record.uri) } + + if (AppBskyEmbedRecord.isViewRecord(subject.embed.record)) { + if (AppBskyFeedPost.isRecord(subject.embed.record.value)) { + const embeddedPost = subject.embed.record.value + + embedMuted = + embedMuted || + hasMutedWord({ + mutedWords, + text: embeddedPost.text, + facets: embeddedPost.facets, + outlineTags: embeddedPost.tags, + languages: embeddedPost.langs, + isOwnPost, + }) + + if (AppBskyEmbedImages.isMain(embeddedPost.embed)) { + for (const image of embeddedPost.embed.images) { + embedMuted = + embedMuted || + hasMutedWord({ + mutedWords, + text: image.alt, + facets: [], + outlineTags: [], + languages: embeddedPost.langs, + isOwnPost, + }) + } + } + + if (AppBskyEmbedExternal.isMain(embeddedPost.embed)) { + const {external} = embeddedPost.embed + + embedMuted = + embedMuted || + hasMutedWord({ + mutedWords, + text: external.title + ' ' + external.description, + facets: [], + outlineTags: [], + languages: [], + isOwnPost, + }) + } + + if (AppBskyEmbedRecordWithMedia.isMain(embeddedPost.embed)) { + if (AppBskyEmbedExternal.isMain(embeddedPost.embed.media)) { + const {external} = embeddedPost.embed.media + + embedMuted = + embedMuted || + hasMutedWord({ + mutedWords, + text: external.title + ' ' + external.description, + facets: [], + outlineTags: [], + languages: [], + isOwnPost, + }) + } + + if (AppBskyEmbedImages.isMain(embeddedPost.embed.media)) { + for (const image of embeddedPost.embed.media.images) { + embedMuted = + embedMuted || + hasMutedWord({ + mutedWords, + text: image.alt, + facets: [], + outlineTags: [], + languages: AppBskyFeedPost.isRecord(embeddedPost.record) + ? embeddedPost.langs + : [], + isOwnPost, + }) + } + } + } + } + } + + if (AppBskyEmbedExternal.isView(subject.embed)) { + const {external} = subject.embed + + externalMuted = + externalMuted || + hasMutedWord({ + mutedWords, + text: external.title + ' ' + external.description, + facets: [], + outlineTags: [], + languages: [], + isOwnPost, + }) + } + + if ( + AppBskyEmbedRecordWithMedia.isView(subject.embed) && + AppBskyEmbedRecord.isViewRecord(subject.embed.record.record) + ) { + if (AppBskyFeedPost.isRecord(subject.embed.record.record.value)) { + const post = subject.embed.record.record.value + embedMuted = + embedMuted || + hasMutedWord({ + mutedWords, + text: post.text, + facets: post.facets, + outlineTags: post.tags, + languages: post.langs, + isOwnPost, + }) + } + + if (AppBskyEmbedImages.isView(subject.embed.media)) { + for (const image of subject.embed.media.images) { + embedMuted = + embedMuted || + hasMutedWord({ + mutedWords, + text: image.alt, + facets: [], + outlineTags: [], + languages: AppBskyFeedPost.isRecord(subject.record) + ? subject.record.langs + : [], + isOwnPost, + }) + } + } + } + if (embedHidden) { moderations.embed.filter = true moderations.embed.blur = true @@ -254,6 +362,17 @@ export function moderatePost_wrapped( priority: 1, } } + } else if (externalMuted || embedMuted) { + moderations.content.filter = true + moderations.content.blur = true + if (!moderations.content.cause) { + moderations.content.cause = { + // @ts-ignore Temporary extension to the moderation system -prf + type: 'muted-word', + source: {type: 'user'}, + priority: 1, + } + } } }