From 491541fed11a251ecdf8c2031214364c4f62aab4 Mon Sep 17 00:00:00 2001 From: samunohito <46447427+samunohito@users.noreply.github.com> Date: Wed, 12 Jun 2024 07:49:54 +0900 Subject: [PATCH] =?UTF-8?q?isChannelRelated=E3=81=AE=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E3=81=AB=E8=AA=A4=E3=82=8A=E3=81=8C=E3=81=82=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/src/misc/is-channel-related.ts | 9 ++--- .../api/stream/channels/hybrid-timeline.ts | 35 ++++++++++++------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/packages/backend/src/misc/is-channel-related.ts b/packages/backend/src/misc/is-channel-related.ts index 2494410ae5..4b6614cd28 100644 --- a/packages/backend/src/misc/is-channel-related.ts +++ b/packages/backend/src/misc/is-channel-related.ts @@ -14,12 +14,7 @@ import { Packed } from '@/misc/json-schema.js'; * @param channelIds 確認対象のチャンネルID一覧 */ export function isChannelRelated(note: MiNote | Packed<'Note'>, channelIds: Set): boolean { - if (!note.channelId) { - // チャンネル投稿じゃなければ無条件でOK - return true; - } - - if (channelIds.has(note.channelId)) { + if (note.channelId && channelIds.has(note.channelId)) { return true; } @@ -27,7 +22,7 @@ export function isChannelRelated(note: MiNote | Packed<'Note'>, channelIds: Set< return true; } - // NOTE: リプライはchannelIdのチェックだけでOKなはずなので見てない + // NOTE: リプライはchannelIdのチェックだけでOKなはずなので見てない(チャンネルのノートにチャンネル外からのリプライまたはその逆はないはずなので) return false; } diff --git a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts index 3b6e678e0a..6bd9f2a68b 100644 --- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts @@ -53,18 +53,29 @@ class HybridTimelineChannel extends Channel { if (this.withFiles && (note.fileIds == null || note.fileIds.length === 0)) return; - // チャンネルの投稿ではなく、自分自身の投稿 または - // チャンネルの投稿ではなく、その投稿のユーザーをフォローしている または - // チャンネルの投稿ではなく、全体公開のローカルの投稿 または - // フォローしているチャンネルの投稿 または - // ミュートしていないチャンネルの投稿(リノート・引用リノートもチェック対象)の場合だけ - if (!( - (note.channelId == null && isMe) || - (note.channelId == null && Object.hasOwn(this.following, note.userId)) || - (note.channelId == null && (note.user.host == null && note.visibility === 'public')) || - (note.channelId != null && this.followingChannels.has(note.channelId)) || - (note.channelId != null && isChannelRelated(note, this.mutingChannels)) - )) return; + if (!note.channelId) { + // 以下の条件に該当するノートのみ後続処理に通す(ので、以下のif文は該当しないノートをすべて弾くようにする) + // - 自分自身の投稿 + // - その投稿のユーザーをフォローしている + // - 全体公開のローカルの投稿 + if (!( + isMe || + Object.hasOwn(this.following, note.userId) || + (note.user.host == null && note.visibility === 'public') + )) { + return; + } + } else { + // 以下の条件に該当するノートのみ後続処理に通す(ので、以下のif文は該当しないノートをすべて弾くようにする) + // - ミュートしていないチャンネルの投稿(リノート・引用リノートもチェック対象) + // - フォローしているチャンネルの投稿 + if (isChannelRelated(note, this.mutingChannels)) { + return; + } + if (!this.followingChannels.has(note.channelId)) { + return; + } + } if (note.visibility === 'followers') { if (!isMe && !Object.hasOwn(this.following, note.userId)) return;