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;