@atproto/api
Version:
Client library for atproto and Bluesky
287 lines • 11.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.decidePost = decidePost;
const client_1 = require("../../client");
const decision_1 = require("../decision");
const mutewords_1 = require("../mutewords");
const account_1 = require("./account");
const profile_1 = require("./profile");
function decidePost(subject, opts) {
return decision_1.ModerationDecision.merge(decideSubject(subject, opts), decideEmbed(subject.embed, opts)?.downgrade(), (0, account_1.decideAccount)(subject.author, opts), (0, profile_1.decideProfile)(subject.author, opts));
}
function decideSubject(subject, opts) {
const acc = new decision_1.ModerationDecision();
acc.setDid(subject.author.did);
acc.setIsMe(subject.author.did === opts.userDid);
if (subject.labels?.length) {
for (const label of subject.labels) {
acc.addLabel('content', label, opts);
}
}
acc.addHidden(checkHiddenPost(subject, opts.prefs.hiddenPosts));
if (!acc.isMe) {
acc.addMutedWord(matchAllMuteWords(subject, opts.prefs.mutedWords));
}
return acc;
}
function decideEmbed(embed, opts) {
if (embed) {
if ((client_1.AppBskyEmbedRecord.isView(embed) ||
client_1.AppBskyEmbedRecordWithMedia.isView(embed)) &&
client_1.AppBskyEmbedRecord.isViewRecord(embed.record)) {
// quote post
return decideQuotedPost(embed.record, opts);
}
else if (client_1.AppBskyEmbedRecordWithMedia.isView(embed) &&
client_1.AppBskyEmbedRecord.isViewRecord(embed.record.record)) {
// quoted post with media
return decideQuotedPost(embed.record.record, opts);
}
else if ((client_1.AppBskyEmbedRecord.isView(embed) ||
client_1.AppBskyEmbedRecordWithMedia.isView(embed)) &&
client_1.AppBskyEmbedRecord.isViewBlocked(embed.record)) {
// blocked quote post
return decideBlockedQuotedPost(embed.record, opts);
}
else if (client_1.AppBskyEmbedRecordWithMedia.isView(embed) &&
client_1.AppBskyEmbedRecord.isViewBlocked(embed.record.record)) {
// blocked quoted post with media
return decideBlockedQuotedPost(embed.record.record, opts);
}
}
return undefined;
}
function decideQuotedPost(subject, opts) {
const acc = new decision_1.ModerationDecision();
acc.setDid(subject.author.did);
acc.setIsMe(subject.author.did === opts.userDid);
if (subject.labels?.length) {
for (const label of subject.labels) {
acc.addLabel('content', label, opts);
}
}
return decision_1.ModerationDecision.merge(acc, (0, account_1.decideAccount)(subject.author, opts), (0, profile_1.decideProfile)(subject.author, opts));
}
function decideBlockedQuotedPost(subject, opts) {
const acc = new decision_1.ModerationDecision();
acc.setDid(subject.author.did);
acc.setIsMe(subject.author.did === opts.userDid);
if (subject.author.viewer?.muted) {
if (subject.author.viewer?.mutedByList) {
acc.addMutedByList(subject.author.viewer?.mutedByList);
}
else {
acc.addMuted(subject.author.viewer?.muted);
}
}
if (subject.author.viewer?.blocking) {
if (subject.author.viewer?.blockingByList) {
acc.addBlockingByList(subject.author.viewer?.blockingByList);
}
else {
acc.addBlocking(subject.author.viewer?.blocking);
}
}
acc.addBlockedBy(subject.author.viewer?.blockedBy);
return acc;
}
function checkHiddenPost(subject, hiddenPosts) {
if (!hiddenPosts?.length) {
return false;
}
if (hiddenPosts.includes(subject.uri)) {
return true;
}
if (subject.embed) {
if (client_1.AppBskyEmbedRecord.isView(subject.embed) &&
client_1.AppBskyEmbedRecord.isViewRecord(subject.embed.record) &&
hiddenPosts.includes(subject.embed.record.uri)) {
return true;
}
if (client_1.AppBskyEmbedRecordWithMedia.isView(subject.embed) &&
client_1.AppBskyEmbedRecord.isViewRecord(subject.embed.record.record) &&
hiddenPosts.includes(subject.embed.record.record.uri)) {
return true;
}
}
return false;
}
function matchAllMuteWords(subject, mutedWords) {
if (!mutedWords?.length) {
return;
}
const postAuthor = subject.author;
if (client_1.AppBskyFeedPost.isRecord(subject.record)) {
const post = subject.record;
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: post.text,
facets: post.facets,
outlineTags: post.tags,
languages: post.langs,
actor: postAuthor,
});
// post text
if (matches) {
return matches;
}
if (post.embed && client_1.AppBskyEmbedImages.isMain(post.embed)) {
// post images
for (const image of post.embed.images) {
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: image.alt,
languages: post.langs,
actor: postAuthor,
});
if (matches) {
return matches;
}
}
}
}
const { embed } = subject;
if (embed) {
// quote post
if ((client_1.AppBskyEmbedRecord.isView(embed) ||
client_1.AppBskyEmbedRecordWithMedia.isView(embed)) &&
client_1.AppBskyEmbedRecord.isViewRecord(embed.record)) {
if (client_1.AppBskyFeedPost.isRecord(embed.record.value)) {
const embeddedPost = embed.record.value;
const embedAuthor = embed.record.author;
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: embeddedPost.text,
facets: embeddedPost.facets,
outlineTags: embeddedPost.tags,
languages: embeddedPost.langs,
actor: embedAuthor,
});
// quoted post text
if (matches) {
return matches;
}
// quoted post's images
if (client_1.AppBskyEmbedImages.isMain(embeddedPost.embed)) {
for (const image of embeddedPost.embed.images) {
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: image.alt,
languages: embeddedPost.langs,
actor: embedAuthor,
});
if (matches) {
return matches;
}
}
}
// quoted post's link card
if (client_1.AppBskyEmbedExternal.isMain(embeddedPost.embed)) {
const { external } = embeddedPost.embed;
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: external.title + ' ' + external.description,
languages: [],
actor: embedAuthor,
});
if (matches) {
return matches;
}
}
if (client_1.AppBskyEmbedRecordWithMedia.isMain(embeddedPost.embed)) {
// quoted post's link card when it did a quote + media
if (client_1.AppBskyEmbedExternal.isMain(embeddedPost.embed.media)) {
const { external } = embeddedPost.embed.media;
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: external.title + ' ' + external.description,
languages: [],
actor: embedAuthor,
});
if (matches) {
return matches;
}
}
// quoted post's images when it did a quote + media
if (client_1.AppBskyEmbedImages.isMain(embeddedPost.embed.media)) {
for (const image of embeddedPost.embed.media.images) {
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: image.alt,
languages: client_1.AppBskyFeedPost.isRecord(embeddedPost.record)
? embeddedPost.langs
: [],
actor: embedAuthor,
});
if (matches) {
return matches;
}
}
}
}
}
}
// link card
else if (client_1.AppBskyEmbedExternal.isView(embed)) {
const { external } = embed;
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: external.title + ' ' + external.description,
languages: [],
actor: postAuthor,
});
if (matches) {
return matches;
}
}
// quote post with media
else if (client_1.AppBskyEmbedRecordWithMedia.isView(embed) &&
client_1.AppBskyEmbedRecord.isViewRecord(embed.record.record)) {
const embedAuthor = embed.record.record.author;
// quoted post text
if (client_1.AppBskyFeedPost.isRecord(embed.record.record.value)) {
const post = embed.record.record.value;
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: post.text,
facets: post.facets,
outlineTags: post.tags,
languages: post.langs,
actor: embedAuthor,
});
if (matches) {
return matches;
}
}
// quoted post images
if (client_1.AppBskyEmbedImages.isView(embed.media)) {
for (const image of embed.media.images) {
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: image.alt,
languages: client_1.AppBskyFeedPost.isRecord(subject.record)
? subject.record.langs
: [],
actor: embedAuthor,
});
if (matches) {
return matches;
}
}
}
if (client_1.AppBskyEmbedExternal.isView(embed.media)) {
const { external } = embed.media;
const matches = (0, mutewords_1.matchMuteWords)({
mutedWords,
text: external.title + ' ' + external.description,
languages: [],
actor: embedAuthor,
});
if (matches) {
return matches;
}
}
}
}
}
//# sourceMappingURL=post.js.map