Bad UX when a post is muted and it just says "Some chick said something". Now provide some context too to help people decide if they want to view something potentially triggering.
77 lines
2.8 KiB
TypeScript
77 lines
2.8 KiB
TypeScript
import Channel from "../channel.js";
|
|
import { getWordMute } from "@/misc/check-word-mute.js";
|
|
import { isUserRelated } from "@/misc/is-user-related.js";
|
|
import { isInstanceMuted } from "@/misc/is-instance-muted.js";
|
|
import type { Packed } from "@/misc/schema.js";
|
|
|
|
export default class extends Channel {
|
|
public readonly chName = "homeTimeline";
|
|
public static shouldShare = true;
|
|
public static requireCredential = true;
|
|
|
|
constructor(id: string, connection: Channel["connection"]) {
|
|
super(id, connection);
|
|
this.onNote = this.withPackedNote(this.onNote.bind(this));
|
|
}
|
|
|
|
public async init(params: any) {
|
|
// Subscribe events
|
|
this.subscriber.on("notesStream", this.onNote);
|
|
}
|
|
|
|
private async onNote(note: Packed<"Note">) {
|
|
if (note.channelId) {
|
|
if (!this.followingChannels.has(note.channelId)) return;
|
|
} else {
|
|
// その投稿のユーザーをフォローしていなかったら弾く
|
|
if (this.user!.id !== note.userId && !this.following.has(note.userId))
|
|
return;
|
|
}
|
|
|
|
// Ignore notes from instances the user has muted
|
|
if (
|
|
isInstanceMuted(
|
|
note,
|
|
new Set<string>(this.userProfile?.mutedInstances ?? []),
|
|
)
|
|
)
|
|
return;
|
|
|
|
// 関係ない返信は除外
|
|
if (note.reply && !this.user!.showTimelineReplies) {
|
|
const reply = note.reply;
|
|
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
|
|
if (
|
|
reply.userId !== this.user!.id &&
|
|
note.userId !== this.user!.id &&
|
|
reply.userId !== note.userId
|
|
)
|
|
return;
|
|
}
|
|
|
|
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
|
if (isUserRelated(note, this.muting)) return;
|
|
// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
|
|
if (isUserRelated(note, this.blocking)) return;
|
|
|
|
// 流れてきたNoteがミュートすべきNoteだったら無視する
|
|
// TODO: 将来的には、単にMutedNoteテーブルにレコードがあるかどうかで判定したい(以下の理由により難しそうではある)
|
|
// 現状では、ワードミュートにおけるMutedNoteレコードの追加処理はストリーミングに流す処理と並列で行われるため、
|
|
// レコードが追加されるNoteでも追加されるより先にここのストリーミングの処理に到達することが起こる。
|
|
// そのためレコードが存在するかのチェックでは不十分なので、改めてgetWordMuteを呼んでいる
|
|
if (
|
|
this.userProfile &&
|
|
(await getWordMute(note, this.user, this.userProfile.mutedWords)).muted
|
|
)
|
|
return;
|
|
|
|
this.connection.cacheNote(note);
|
|
|
|
this.send("note", note);
|
|
}
|
|
|
|
public dispose() {
|
|
// Unsubscribe events
|
|
this.subscriber.off("notesStream", this.onNote);
|
|
}
|
|
}
|