summaryrefslogtreecommitdiff
path: root/src/server/api/stream/channels/hybrid-timeline.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/api/stream/channels/hybrid-timeline.ts')
-rw-r--r--src/server/api/stream/channels/hybrid-timeline.ts89
1 files changed, 0 insertions, 89 deletions
diff --git a/src/server/api/stream/channels/hybrid-timeline.ts b/src/server/api/stream/channels/hybrid-timeline.ts
deleted file mode 100644
index 51f95fc0cd..0000000000
--- a/src/server/api/stream/channels/hybrid-timeline.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '@/misc/is-muted-user-related';
-import Channel from '../channel';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Notes } from '@/models/index';
-import { checkWordMute } from '@/misc/check-word-mute';
-import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
-import { Packed } from '@/misc/schema';
-
-export default class extends Channel {
- public readonly chName = 'hybridTimeline';
- public static shouldShare = true;
- public static requireCredential = true;
-
- @autobind
- public async init(params: any) {
- const meta = await fetchMeta();
- if (meta.disableLocalTimeline && !this.user!.isAdmin && !this.user!.isModerator) return;
-
- // Subscribe events
- this.subscriber.on('notesStream', this.onNote);
- }
-
- @autobind
- private async onNote(note: Packed<'Note'>) {
- // チャンネルの投稿ではなく、自分自身の投稿 または
- // チャンネルの投稿ではなく、その投稿のユーザーをフォローしている または
- // チャンネルの投稿ではなく、全体公開のローカルの投稿 または
- // フォローしているチャンネルの投稿 の場合だけ
- if (!(
- (note.channelId == null && this.user!.id === note.userId) ||
- (note.channelId == null && this.following.has(note.userId)) ||
- (note.channelId == null && (note.user.host == null && note.visibility === 'public')) ||
- (note.channelId != null && this.followingChannels.has(note.channelId))
- )) return;
-
- if (['followers', 'specified'].includes(note.visibility)) {
- note = await Notes.pack(note.id, this.user!, {
- detail: true
- });
-
- if (note.isHidden) {
- return;
- }
- } else {
- // リプライなら再pack
- if (note.replyId != null) {
- note.reply = await Notes.pack(note.replyId, this.user!, {
- detail: true
- });
- }
- // Renoteなら再pack
- if (note.renoteId != null) {
- note.renote = await Notes.pack(note.renoteId, this.user!, {
- detail: true
- });
- }
- }
-
- // 関係ない返信は除外
- if (note.reply) {
- const reply = note.reply;
- // 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
- if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
- }
-
- // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
- if (isMutedUserRelated(note, this.muting)) return;
- // 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
- if (isBlockerUserRelated(note, this.blocking)) return;
-
- // 流れてきたNoteがミュートすべきNoteだったら無視する
- // TODO: 将来的には、単にMutedNoteテーブルにレコードがあるかどうかで判定したい(以下の理由により難しそうではある)
- // 現状では、ワードミュートにおけるMutedNoteレコードの追加処理はストリーミングに流す処理と並列で行われるため、
- // レコードが追加されるNoteでも追加されるより先にここのストリーミングの処理に到達することが起こる。
- // そのためレコードが存在するかのチェックでは不十分なので、改めてcheckWordMuteを呼んでいる
- if (this.userProfile && await checkWordMute(note, this.user, this.userProfile.mutedWords)) return;
-
- this.connection.cacheNote(note);
-
- this.send('note', note);
- }
-
- @autobind
- public dispose() {
- // Unsubscribe events
- this.subscriber.off('notesStream', this.onNote);
- }
-}