From d111fe935b105eac2c26073444d5dd56c95215cd Mon Sep 17 00:00:00 2001 From: jaina heartles Date: Thu, 5 Dec 2024 21:55:11 -0500 Subject: [PATCH] Block improvements It will now hide posts if a blocked user is mentioned, or if it's a reblog of a reply to a blocked user. --- packages/backend/src/core/QueryService.ts | 13 ++++++++++++- packages/backend/src/misc/is-user-related.ts | 10 ++++++++++ .../backend/src/server/api/stream/Connection.ts | 8 +++++++- packages/backend/src/server/api/stream/channel.ts | 5 +++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/core/QueryService.ts b/packages/backend/src/core/QueryService.ts index c4feeaf971..37dc79880a 100644 --- a/packages/backend/src/core/QueryService.ts +++ b/packages/backend/src/core/QueryService.ts @@ -70,27 +70,38 @@ export class QueryService { // ここでいうBlockedは被Blockedの意 @bindThis public generateBlockedUserQuery(q: SelectQueryBuilder, me: { id: MiUser['id'] }): void { + const blockedQuery = this.blockingsRepository.createQueryBuilder('blocking') + .select('blocking.blockeeId') + .where('blocking.blockerId = :blockerId', { blockerId: me.id }); + const blockingQuery = this.blockingsRepository.createQueryBuilder('blocking') .select('blocking.blockerId') .where('blocking.blockeeId = :blockeeId', { blockeeId: me.id }); + const mentionQuery = `SELECT COUNT(*) FROM unnest(note.mentions) mention WHERE mention IN (${blockingQuery.getQuery()}) OR mention IN (${blockedQuery.getQuery()}) LIMIT 1`; + // 投稿の作者にブロックされていない かつ // 投稿の返信先の作者にブロックされていない かつ // 投稿の引用元の作者にブロックされていない q .andWhere(`note.userId NOT IN (${ blockingQuery.getQuery() })`) + .andWhere(`note.userId NOT IN (${ blockedQuery.getQuery() })`) .andWhere(new Brackets(qb => { qb .where('note.replyUserId IS NULL') + .orWhere(`note.replyUserId NOT IN (${ blockedQuery.getQuery() })`) .orWhere(`note.replyUserId NOT IN (${ blockingQuery.getQuery() })`); })) .andWhere(new Brackets(qb => { qb .where('note.renoteUserId IS NULL') + .orWhere(`note.renoteUserId NOT IN (${ blockedQuery.getQuery() })`) .orWhere(`note.renoteUserId NOT IN (${ blockingQuery.getQuery() })`); - })); + })) + .andWhere(`(${mentionQuery}) = 0`); q.setParameters(blockingQuery.getParameters()); + q.setParameters(blockedQuery.getParameters()); } @bindThis diff --git a/packages/backend/src/misc/is-user-related.ts b/packages/backend/src/misc/is-user-related.ts index 862d6e6a38..09d572499b 100644 --- a/packages/backend/src/misc/is-user-related.ts +++ b/packages/backend/src/misc/is-user-related.ts @@ -4,6 +4,8 @@ */ export function isUserRelated(note: any, userIds: Set, ignoreAuthor = false): boolean { + console.log(note); + if (!note) { return false; } @@ -20,5 +22,13 @@ export function isUserRelated(note: any, userIds: Set, ignoreAuthor = fa return true; } + if (!ignoreAuthor && note.mentions != null && note.mentions.some(mention => userIds.has(mention))) { + return true; + } + + if (!ignoreAuthor && note.renote != null && note.renote.mentions != null && note.renote.mentions.some(mention => userIds.has(mention))) { + return true; + } + return false; } diff --git a/packages/backend/src/server/api/stream/Connection.ts b/packages/backend/src/server/api/stream/Connection.ts index f102cb42e1..528c4e06c7 100644 --- a/packages/backend/src/server/api/stream/Connection.ts +++ b/packages/backend/src/server/api/stream/Connection.ts @@ -42,6 +42,7 @@ export default class Connection { public followingChannels: Set = new Set(); public userIdsWhoMeMuting: Set = new Set(); public userIdsWhoBlockingMe: Set = new Set(); + public userIdsWhoMeBlocking: Set = new Set(); public userIdsWhoMeMutingRenotes: Set = new Set(); public userMutedInstances: Set = new Set(); private fetchIntervalId: NodeJS.Timeout | null = null; @@ -72,12 +73,13 @@ export default class Connection { @bindThis public async fetch() { if (this.user == null) return; - const [userProfile, following, followingChannels, userIdsWhoMeMuting, userIdsWhoBlockingMe, userIdsWhoMeMutingRenotes] = await Promise.all([ + const [userProfile, following, followingChannels, userIdsWhoMeMuting, userIdsWhoBlockingMe, userIdsWhoMeBlocking, userIdsWhoMeMutingRenotes] = await Promise.all([ this.cacheService.userProfileCache.fetch(this.user.id), this.cacheService.userFollowingsCache.fetch(this.user.id), this.channelFollowingService.userFollowingChannelsCache.fetch(this.user.id), this.cacheService.userMutingsCache.fetch(this.user.id), this.cacheService.userBlockedCache.fetch(this.user.id), + this.cacheService.userBlockingCache.fetch(this.user.id), this.cacheService.renoteMutingsCache.fetch(this.user.id), ]); this.userProfile = userProfile; @@ -85,6 +87,7 @@ export default class Connection { this.followingChannels = followingChannels; this.userIdsWhoMeMuting = userIdsWhoMeMuting; this.userIdsWhoBlockingMe = userIdsWhoBlockingMe; + this.userIdsWhoMeBlocking = userIdsWhoMeBlocking; this.userIdsWhoMeMutingRenotes = userIdsWhoMeMutingRenotes; this.userMutedInstances = new Set(userProfile.mutedInstances); } @@ -253,6 +256,9 @@ export default class Connection { if (this.userIdsWhoBlockingMe.has(noteUserId)) { return; } + if (this.userIdsWhoMeBlocking.has(noteUserId)) { + return; + } } } diff --git a/packages/backend/src/server/api/stream/channel.ts b/packages/backend/src/server/api/stream/channel.ts index ae9c7e3e99..620d22cdf7 100644 --- a/packages/backend/src/server/api/stream/channel.ts +++ b/packages/backend/src/server/api/stream/channel.ts @@ -47,6 +47,10 @@ export default abstract class Channel { return this.connection.userIdsWhoBlockingMe; } + protected get userIdsWhoMeBlocking() { + return this.connection.userIdsWhoMeBlocking; + } + protected get userMutedInstances() { return this.connection.userMutedInstances; } @@ -70,6 +74,7 @@ export default abstract class Channel { if (isUserRelated(note, this.userIdsWhoMeMuting)) return true; // 流れてきたNoteがブロックされているユーザーが関わる if (isUserRelated(note, this.userIdsWhoBlockingMe)) return true; + if (isUserRelated(note, this.userIdsWhoMeBlocking)) return true; // 流れてきたNoteがリノートをミュートしてるユーザが行ったもの if (isRenotePacked(note) && !isQuotePacked(note) && this.userIdsWhoMeMutingRenotes.has(note.user.id)) return true;