fix(stream): チャンネル接続主に見えないはずのノートが表示される問題を修正
This commit is contained in:
parent
464884c1ab
commit
1dde8653e8
|
@ -40,6 +40,14 @@ class AntennaChannel extends Channel {
|
||||||
if (data.type === 'note') {
|
if (data.type === 'note') {
|
||||||
const note = await this.noteEntityService.pack(data.body.id, this.user, { detail: true });
|
const note = await this.noteEntityService.pack(data.body.id, this.user, { detail: true });
|
||||||
|
|
||||||
|
if (note.reply) {
|
||||||
|
const reply = note.reply;
|
||||||
|
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||||
|
// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return;
|
||||||
|
}
|
||||||
|
|
||||||
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
||||||
if (isUserRelated(note, this.userIdsWhoMeMuting)) return;
|
if (isUserRelated(note, this.userIdsWhoMeMuting)) return;
|
||||||
// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
|
// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
|
||||||
|
|
|
@ -38,6 +38,14 @@ class ChannelChannel extends Channel {
|
||||||
private async onNote(note: Packed<'Note'>) {
|
private async onNote(note: Packed<'Note'>) {
|
||||||
if (note.channelId !== this.channelId) return;
|
if (note.channelId !== this.channelId) return;
|
||||||
|
|
||||||
|
if (note.reply) {
|
||||||
|
const reply = note.reply;
|
||||||
|
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||||
|
// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return;
|
||||||
|
}
|
||||||
|
|
||||||
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
||||||
if (isUserRelated(note, this.userIdsWhoMeMuting)) return;
|
if (isUserRelated(note, this.userIdsWhoMeMuting)) return;
|
||||||
// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
|
// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
|
||||||
|
|
|
@ -19,6 +19,7 @@ class GlobalTimelineChannel extends Channel {
|
||||||
public static shouldShare = false;
|
public static shouldShare = false;
|
||||||
public static requireCredential = false as const;
|
public static requireCredential = false as const;
|
||||||
private withRenotes: boolean;
|
private withRenotes: boolean;
|
||||||
|
private withReplies: boolean;
|
||||||
private withFiles: boolean;
|
private withFiles: boolean;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
@ -39,6 +40,7 @@ class GlobalTimelineChannel extends Channel {
|
||||||
if (!policies.gtlAvailable) return;
|
if (!policies.gtlAvailable) return;
|
||||||
|
|
||||||
this.withRenotes = params.withRenotes ?? true;
|
this.withRenotes = params.withRenotes ?? true;
|
||||||
|
this.withReplies = params.withReplies ?? false;
|
||||||
this.withFiles = params.withFiles ?? false;
|
this.withFiles = params.withFiles ?? false;
|
||||||
|
|
||||||
// Subscribe events
|
// Subscribe events
|
||||||
|
@ -56,10 +58,17 @@ class GlobalTimelineChannel extends Channel {
|
||||||
if (this.withFiles && (note.files === undefined || note.files.length === 0)) return;
|
if (this.withFiles && (note.files === undefined || note.files.length === 0)) return;
|
||||||
|
|
||||||
// 関係ない返信は除外
|
// 関係ない返信は除外
|
||||||
if (note.reply && !this.following[note.userId]?.withReplies) {
|
if (note.reply) {
|
||||||
const reply = note.reply;
|
const reply = note.reply;
|
||||||
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
if ((this.following[note.userId]?.withReplies ?? false) || this.withReplies) {
|
||||||
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
|
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||||
|
// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return;
|
||||||
|
} else {
|
||||||
|
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
||||||
|
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (note.renote && note.text == null && (note.fileIds == null || note.fileIds.length === 0) && !this.withRenotes) return;
|
if (note.renote && note.text == null && (note.fileIds == null || note.fileIds.length === 0) && !this.withRenotes) return;
|
||||||
|
|
|
@ -43,6 +43,14 @@ class HashtagChannel extends Channel {
|
||||||
const matched = this.q.some(tags => tags.every(tag => noteTags.includes(normalizeForSearch(tag))));
|
const matched = this.q.some(tags => tags.every(tag => noteTags.includes(normalizeForSearch(tag))));
|
||||||
if (!matched) return;
|
if (!matched) return;
|
||||||
|
|
||||||
|
if (note.reply) {
|
||||||
|
const reply = note.reply;
|
||||||
|
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||||
|
// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return;
|
||||||
|
}
|
||||||
|
|
||||||
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
||||||
if (isUserRelated(note, this.userIdsWhoMeMuting)) return;
|
if (isUserRelated(note, this.userIdsWhoMeMuting)) return;
|
||||||
// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
|
// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
|
||||||
|
|
|
@ -68,6 +68,8 @@ class HomeTimelineChannel extends Channel {
|
||||||
if (this.following[note.userId]?.withReplies) {
|
if (this.following[note.userId]?.withReplies) {
|
||||||
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||||
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||||
|
// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return;
|
||||||
} else {
|
} else {
|
||||||
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
||||||
if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return;
|
if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return;
|
||||||
|
|
|
@ -82,6 +82,8 @@ class HybridTimelineChannel extends Channel {
|
||||||
if ((this.following[note.userId]?.withReplies ?? false) || this.withReplies) {
|
if ((this.following[note.userId]?.withReplies ?? false) || this.withReplies) {
|
||||||
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||||
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||||
|
// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return;
|
||||||
} else {
|
} else {
|
||||||
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
||||||
if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return;
|
if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return;
|
||||||
|
|
|
@ -58,10 +58,17 @@ class LocalTimelineChannel extends Channel {
|
||||||
if (this.withFiles && (note.files === undefined || note.files.length === 0)) return;
|
if (this.withFiles && (note.files === undefined || note.files.length === 0)) return;
|
||||||
|
|
||||||
// 関係ない返信は除外
|
// 関係ない返信は除外
|
||||||
if (note.reply && this.user && !this.following[note.userId]?.withReplies && !this.withReplies) {
|
if (note.reply) {
|
||||||
const reply = note.reply;
|
const reply = note.reply;
|
||||||
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
if ((this.following[note.userId]?.withReplies ?? false) || this.withReplies) {
|
||||||
if (reply.userId !== this.user.id && note.userId !== this.user.id && reply.userId !== note.userId) return;
|
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||||
|
// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return;
|
||||||
|
} else {
|
||||||
|
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
||||||
|
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (note.renote && note.text == null && (note.fileIds == null || note.fileIds.length === 0) && !this.withRenotes) return;
|
if (note.renote && note.text == null && (note.fileIds == null || note.fileIds.length === 0) && !this.withRenotes) return;
|
||||||
|
|
|
@ -46,6 +46,14 @@ class RoleTimelineChannel extends Channel {
|
||||||
}
|
}
|
||||||
if (note.visibility !== 'public') return;
|
if (note.visibility !== 'public') return;
|
||||||
|
|
||||||
|
if (note.reply) {
|
||||||
|
const reply = note.reply;
|
||||||
|
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||||
|
// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return;
|
||||||
|
}
|
||||||
|
|
||||||
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
||||||
if (isUserRelated(note, this.userIdsWhoMeMuting)) return;
|
if (isUserRelated(note, this.userIdsWhoMeMuting)) return;
|
||||||
// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
|
// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
|
||||||
|
|
|
@ -100,6 +100,8 @@ class UserListChannel extends Channel {
|
||||||
if (this.membershipsMap[note.userId]?.withReplies) {
|
if (this.membershipsMap[note.userId]?.withReplies) {
|
||||||
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||||
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||||
|
// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く
|
||||||
|
if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return;
|
||||||
} else {
|
} else {
|
||||||
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
||||||
if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return;
|
if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return;
|
||||||
|
|
Loading…
Reference in a new issue