misskey/src/services/note/unread.ts
syuilo fc65190ef7
feat: thread mute (#7930)
* feat: thread mute

* chore: fix comment

* fix test

* fix

* refactor
2021-10-31 15:30:22 +09:00

56 lines
1.6 KiB
TypeScript

import { Note } from '@/models/entities/note';
import { publishMainStream } from '@/services/stream';
import { User } from '@/models/entities/user';
import { Mutings, NoteThreadMutings, NoteUnreads } from '@/models/index';
import { genId } from '@/misc/gen-id';
export async function insertNoteUnread(userId: User['id'], note: Note, params: {
// NOTE: isSpecifiedがtrueならisMentionedは必ずfalse
isSpecified: boolean;
isMentioned: boolean;
}) {
//#region ミュートしているなら無視
// TODO: 現在の仕様ではChannelにミュートは適用されないのでよしなにケアする
const mute = await Mutings.find({
muterId: userId
});
if (mute.map(m => m.muteeId).includes(note.userId)) return;
//#endregion
// スレッドミュート
const threadMute = await NoteThreadMutings.findOne({
userId: userId,
threadId: note.threadId || note.id,
});
if (threadMute) return;
const unread = {
id: genId(),
noteId: note.id,
userId: userId,
isSpecified: params.isSpecified,
isMentioned: params.isMentioned,
noteChannelId: note.channelId,
noteUserId: note.userId,
};
await NoteUnreads.insert(unread);
// 2秒経っても既読にならなかったら「未読の投稿がありますよ」イベントを発行する
setTimeout(async () => {
const exist = await NoteUnreads.findOne(unread.id);
if (exist == null) return;
if (params.isMentioned) {
publishMainStream(userId, 'unreadMention', note.id);
}
if (params.isSpecified) {
publishMainStream(userId, 'unreadSpecifiedNote', note.id);
}
if (note.channelId) {
publishMainStream(userId, 'unreadChannel', note.id);
}
}, 2000);
}