This commit is contained in:
syuilo 2018-06-24 15:51:03 +09:00
parent 21a2e5f415
commit db60188847

View file

@ -27,51 +27,30 @@ type Type = 'reply' | 'renote' | 'quote' | 'mention';
class NotificationManager { class NotificationManager {
private notifier: IUser; private notifier: IUser;
private note: any; private note: any;
private queue: Array<{
notifiee: ILocalUser['_id'],
type: Type;
}> = [];
constructor(notifier: IUser, note: any) { constructor(notifier: IUser, note: any) {
this.notifier = notifier; this.notifier = notifier;
this.note = note; this.note = note;
} }
public push(notifiee: ILocalUser['_id'], type: Type) { public async push(notifiee: ILocalUser['_id'], type: Type) {
// 自分自身へは通知しない // 自分自身へは通知しない
if (this.notifier._id.equals(notifiee)) return; if (this.notifier._id.equals(notifiee)) return;
const exist = this.queue.find(x => x.notifiee.equals(notifiee)); // ミュート情報を取得
const mentioneeMutes = await Mute.find({
muterId: notifiee
});
if (exist) { const mentioneesMutedUserIds = mentioneeMutes.map(m => m.muteeId.toString());
// 「メンションされているかつ返信されている」場合は、メンションとしての通知ではなく返信としての通知にする
if (type != 'mention') { // 通知される側のユーザーが通知する側のユーザーをミュートしていない限りは通知する
exist.type = type; if (!mentioneesMutedUserIds.includes(this.notifier._id.toString())) {
} notify(notifiee, this.notifier._id, type, {
} else { noteId: this.note._id
this.queue.push({
notifiee, type
}); });
} }
} }
public deliver() {
this.queue.forEach(async x => {
// ミュート情報を取得
const mentioneeMutes = await Mute.find({
muterId: x.notifiee
});
const mentioneesMutedUserIds = mentioneeMutes.map(m => m.muteeId.toString());
// 通知される側のユーザーが通知する側のユーザーをミュートしていない限りは通知する
if (!mentioneesMutedUserIds.includes(this.notifier._id.toString())) {
notify(x.notifiee, this.notifier._id, x.type, {
noteId: this.note._id
});
}
});
}
} }
export default async (user: IUser, data: { export default async (user: IUser, data: {