forked from FoundKeyGang/FoundKey
Deal with withPackedNote(onNote) types in stream channels
This commit is contained in:
parent
56f577ddb8
commit
b1d133c3d5
8 changed files with 29 additions and 15 deletions
|
@ -62,7 +62,7 @@ export default abstract class Channel {
|
|||
});
|
||||
}
|
||||
|
||||
protected withPackedNote(callback: (note: Packed<'Note'>) => void): (Note) => void {
|
||||
protected withPackedNote(callback: (note: Packed<'Note'>) => Promise<void>): (note: Note) => Promise<void> {
|
||||
return async (note: Note) => {
|
||||
try {
|
||||
// because `note` was previously JSON.stringify'ed, the fields that
|
||||
|
|
|
@ -2,6 +2,7 @@ import { Users } from '@/models/index.js';
|
|||
import { isUserRelated } from '@/misc/is-user-related.js';
|
||||
import { User } from '@/models/entities/user.js';
|
||||
import { Packed } from '@/misc/schema.js';
|
||||
import { Note } from '@/models/entities/note.js';
|
||||
import { StreamMessages } from '../types.js';
|
||||
import Channel from '../channel.js';
|
||||
|
||||
|
@ -12,10 +13,11 @@ export default class extends Channel {
|
|||
private channelId: string;
|
||||
private typers: Record<User['id'], Date> = {};
|
||||
private emitTypersIntervalId: ReturnType<typeof setInterval>;
|
||||
private onNote: (note: Note) => Promise<void>;
|
||||
|
||||
constructor(id: string, connection: Channel['connection']) {
|
||||
super(id, connection);
|
||||
this.onNote = this.withPackedNote(this.onNote.bind(this));
|
||||
this.onNote = this.withPackedNote(this.onPackedNote.bind(this));
|
||||
}
|
||||
|
||||
public async init(params: any) {
|
||||
|
@ -27,7 +29,7 @@ export default class extends Channel {
|
|||
this.emitTypersIntervalId = setInterval(this.emitTypers, 5000);
|
||||
}
|
||||
|
||||
private async onNote(note: Packed<'Note'>) {
|
||||
private async onPackedNote(note: Packed<'Note'>): Promise<void> {
|
||||
if (note.channelId !== this.channelId) return;
|
||||
|
||||
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
||||
|
|
|
@ -3,16 +3,18 @@ import { checkWordMute } from '@/misc/check-word-mute.js';
|
|||
import { isInstanceMuted } from '@/misc/is-instance-muted.js';
|
||||
import { isUserRelated } from '@/misc/is-user-related.js';
|
||||
import { Packed } from '@/misc/schema.js';
|
||||
import { Note } from '@/models/entities/note.js';
|
||||
import Channel from '../channel.js';
|
||||
|
||||
export default class extends Channel {
|
||||
public readonly chName = 'globalTimeline';
|
||||
public static shouldShare = true;
|
||||
public static requireCredential = false;
|
||||
private onNote: (note: Note) => Promise<void>;
|
||||
|
||||
constructor(id: string, connection: Channel['connection']) {
|
||||
super(id, connection);
|
||||
this.onNote = this.withPackedNote(this.onNote.bind(this));
|
||||
this.onNote = this.withPackedNote(this.onPackedNote.bind(this));
|
||||
}
|
||||
|
||||
public async init(params: any) {
|
||||
|
@ -25,7 +27,7 @@ export default class extends Channel {
|
|||
this.subscriber.on('notesStream', this.onNote);
|
||||
}
|
||||
|
||||
private async onNote(note: Packed<'Note'>) {
|
||||
private async onPackedNote(note: Packed<'Note'>): Promise<void> {
|
||||
if (note.visibility !== 'public') return;
|
||||
if (note.channelId != null) return;
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { normalizeForSearch } from '@/misc/normalize-for-search.js';
|
||||
import { isUserRelated } from '@/misc/is-user-related.js';
|
||||
import { Packed } from '@/misc/schema.js';
|
||||
import { Note } from '@/models/entities/note.js';
|
||||
import Channel from '../channel.js';
|
||||
|
||||
export default class extends Channel {
|
||||
|
@ -8,10 +9,11 @@ export default class extends Channel {
|
|||
public static shouldShare = false;
|
||||
public static requireCredential = false;
|
||||
private q: string[][];
|
||||
private onNote: (note: Note) => Promise<void>;
|
||||
|
||||
constructor(id: string, connection: Channel['connection']) {
|
||||
super(id, connection);
|
||||
this.onNote = this.withPackedNote(this.onNote.bind(this));
|
||||
this.onNote = this.withPackedNote(this.onPackedNote.bind(this));
|
||||
}
|
||||
|
||||
public async init(params: any) {
|
||||
|
@ -23,7 +25,7 @@ export default class extends Channel {
|
|||
this.subscriber.on('notesStream', this.onNote);
|
||||
}
|
||||
|
||||
private async onNote(note: Packed<'Note'>) {
|
||||
private async onPackedNote(note: Packed<'Note'>): Promise<void> {
|
||||
const noteTags = note.tags ? note.tags.map((t: string) => t.toLowerCase()) : [];
|
||||
const matched = this.q.some(tags => tags.every(tag => noteTags.includes(normalizeForSearch(tag))));
|
||||
if (!matched) return;
|
||||
|
|
|
@ -2,16 +2,18 @@ import { checkWordMute } from '@/misc/check-word-mute.js';
|
|||
import { isUserRelated } from '@/misc/is-user-related.js';
|
||||
import { isInstanceMuted } from '@/misc/is-instance-muted.js';
|
||||
import { Packed } from '@/misc/schema.js';
|
||||
import { Note } from '@/models/entities/note.js';
|
||||
import Channel from '../channel.js';
|
||||
|
||||
export default class extends Channel {
|
||||
public readonly chName = 'homeTimeline';
|
||||
public static shouldShare = true;
|
||||
public static requireCredential = true;
|
||||
private onNote: (note: Note) => Promise<void>;
|
||||
|
||||
constructor(id: string, connection: Channel['connection']) {
|
||||
super(id, connection);
|
||||
this.onNote = this.withPackedNote(this.onNote.bind(this));
|
||||
this.onNote = this.withPackedNote(this.onPackedNote.bind(this));
|
||||
}
|
||||
|
||||
public async init(params: any) {
|
||||
|
@ -19,7 +21,7 @@ export default class extends Channel {
|
|||
this.subscriber.on('notesStream', this.onNote);
|
||||
}
|
||||
|
||||
private async onNote(note: Packed<'Note'>) {
|
||||
private async onPackedNote(note: Packed<'Note'>): Promise<void> {
|
||||
if (note.channelId) {
|
||||
if (!this.followingChannels.has(note.channelId)) return;
|
||||
} else {
|
||||
|
|
|
@ -3,16 +3,18 @@ import { checkWordMute } from '@/misc/check-word-mute.js';
|
|||
import { isUserRelated } from '@/misc/is-user-related.js';
|
||||
import { isInstanceMuted } from '@/misc/is-instance-muted.js';
|
||||
import { Packed } from '@/misc/schema.js';
|
||||
import { Note } from '@/models/entities/note.js';
|
||||
import Channel from '../channel.js';
|
||||
|
||||
export default class extends Channel {
|
||||
public readonly chName = 'hybridTimeline';
|
||||
public static shouldShare = true;
|
||||
public static requireCredential = true;
|
||||
private onNote: (note: Note) => Promise<void>;
|
||||
|
||||
constructor(id: string, connection: Channel['connection']) {
|
||||
super(id, connection);
|
||||
this.onNote = this.withPackedNote(this.onNote.bind(this));
|
||||
this.onNote = this.withPackedNote(this.onPackedNote.bind(this));
|
||||
}
|
||||
|
||||
public async init(params: any) {
|
||||
|
@ -23,7 +25,7 @@ export default class extends Channel {
|
|||
this.subscriber.on('notesStream', this.onNote);
|
||||
}
|
||||
|
||||
private async onNote(note: Packed<'Note'>) {
|
||||
private async onPackedNote(note: Packed<'Note'>): Promise<void> {
|
||||
// チャンネルの投稿ではなく、自分自身の投稿 または
|
||||
// チャンネルの投稿ではなく、その投稿のユーザーをフォローしている または
|
||||
// チャンネルの投稿ではなく、全体公開のローカルの投稿 または
|
||||
|
|
|
@ -2,16 +2,18 @@ import { fetchMeta } from '@/misc/fetch-meta.js';
|
|||
import { checkWordMute } from '@/misc/check-word-mute.js';
|
||||
import { isUserRelated } from '@/misc/is-user-related.js';
|
||||
import { Packed } from '@/misc/schema.js';
|
||||
import { Note } from '@/models/entities/note.js';
|
||||
import Channel from '../channel.js';
|
||||
|
||||
export default class extends Channel {
|
||||
public readonly chName = 'localTimeline';
|
||||
public static shouldShare = true;
|
||||
public static requireCredential = false;
|
||||
onNote: (note: Note) => Promise<void>;
|
||||
|
||||
constructor(id: string, connection: Channel['connection']) {
|
||||
super(id, connection);
|
||||
this.onNote = this.withPackedNote(this.onNote.bind(this));
|
||||
this.onNote = this.withPackedNote(this.onPackedNote.bind(this));
|
||||
}
|
||||
|
||||
public async init(params: any) {
|
||||
|
@ -24,7 +26,7 @@ export default class extends Channel {
|
|||
this.subscriber.on('notesStream', this.onNote);
|
||||
}
|
||||
|
||||
private async onNote(note: Packed<'Note'>) {
|
||||
private async onPackedNote(note: Packed<'Note'>): Promise<void> {
|
||||
if (note.user.host !== null) return;
|
||||
if (note.visibility !== 'public') return;
|
||||
if (note.channelId != null && !this.followingChannels.has(note.channelId)) return;
|
||||
|
|
|
@ -2,6 +2,7 @@ import { UserListJoinings, UserLists } from '@/models/index.js';
|
|||
import { User } from '@/models/entities/user.js';
|
||||
import { isUserRelated } from '@/misc/is-user-related.js';
|
||||
import { Packed } from '@/misc/schema.js';
|
||||
import { Note } from '@/models/entities/note.js';
|
||||
import Channel from '../channel.js';
|
||||
|
||||
export default class extends Channel {
|
||||
|
@ -11,11 +12,12 @@ export default class extends Channel {
|
|||
private listId: string;
|
||||
public listUsers: User['id'][] = [];
|
||||
private listUsersClock: NodeJS.Timer;
|
||||
private onNote: (note: Note) => Promise<void>;
|
||||
|
||||
constructor(id: string, connection: Channel['connection']) {
|
||||
super(id, connection);
|
||||
this.updateListUsers = this.updateListUsers.bind(this);
|
||||
this.onNote = this.withPackedNote(this.onNote.bind(this));
|
||||
this.onNote = this.withPackedNote(this.onPackedNote.bind(this));
|
||||
}
|
||||
|
||||
public async init(params: any) {
|
||||
|
@ -48,7 +50,7 @@ export default class extends Channel {
|
|||
this.listUsers = users.map(x => x.userId);
|
||||
}
|
||||
|
||||
private async onNote(note: Packed<'Note'>) {
|
||||
private async onPackedNote(note: Packed<'Note'>): Promise<void> {
|
||||
if (!this.listUsers.includes(note.userId)) return;
|
||||
|
||||
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
|
||||
|
|
Loading…
Reference in a new issue