diff --git a/CHANGELOG.md b/CHANGELOG.md index 6889f16b75..e133a32a9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,16 @@ -## 2026.4.0 +## Unreleased + +### General +- + +### Client +- + +### Server +- + + +## 2026.5.0 ### General - Enhance: アバターデコレーションにカテゴリを設定できるように diff --git a/package.json b/package.json index e723cca7e4..9f5972a0b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "2026.4.0-beta.2", + "version": "2026.5.0", "codename": "nasubi", "repository": { "type": "git", diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index 2982cc0dd0..c364c029e8 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -63,10 +63,10 @@ type NotificationType = 'reply' | 'renote' | 'quote' | 'mention'; class NotificationManager { private notifier: { id: MiUser['id']; }; private note: MiNote; - private queue: { + private queue: Map; constructor( private mutingsRepository: MutingsRepository, @@ -77,7 +77,7 @@ class NotificationManager { ) { this.notifier = notifier; this.note = note; - this.queue = []; + this.queue = new Map(); } @bindThis @@ -85,7 +85,7 @@ class NotificationManager { // 自分自身へは通知しない if (this.notifier.id === notifiee) return; - const exist = this.queue.find(x => x.target === notifiee); + const exist = this.queue.get(notifiee); if (exist) { // 「メンションされているかつ返信されている」場合は、メンションとしての通知ではなく返信としての通知にする @@ -93,7 +93,7 @@ class NotificationManager { exist.reason = reason; } } else { - this.queue.push({ + this.queue.set(notifiee, { reason: reason, target: notifiee, }); @@ -102,25 +102,25 @@ class NotificationManager { @bindThis public async notify() { - if (this.queue.length === 0) { + if (this.queue.size === 0) { return; } - const targetUserIds = this.queue.map(x => x.target); - let visibleUserIds: Set; + let visibleUserIds: Set | null; switch (this.note.visibility) { case 'public': case 'home': - visibleUserIds = new Set(targetUserIds); + visibleUserIds = null; break; case 'specified': - visibleUserIds = new Set(this.note.visibleUserIds.filter(id => targetUserIds.includes(id))); + visibleUserIds = new Set(this.note.visibleUserIds); break; // TODO: フォロワー限定ノートにフォロワーではない人がメンションされた場合通知されるのが正しい挙動なのか確認(一部に挙動の不一致がありそう)。現状は通知されるためフィルタしない // case 'followers': { + // const targetUserIds = this.queue.map(x => x.target); // const followers = await this.followingsRepository.find({ // where: { // followeeId: this.note.userId, @@ -138,8 +138,10 @@ class NotificationManager { break; } - for (const x of this.queue) { - if (!visibleUserIds.has(x.target)) { + for (const x of this.queue.values()) { + const isVisibleToTarget = visibleUserIds === null || visibleUserIds.has(x.target); + + if (!isVisibleToTarget) { continue; } diff --git a/packages/backend/src/queue/processors/InboxProcessorService.ts b/packages/backend/src/queue/processors/InboxProcessorService.ts index 78261a096a..0e4cd59888 100644 --- a/packages/backend/src/queue/processors/InboxProcessorService.ts +++ b/packages/backend/src/queue/processors/InboxProcessorService.ts @@ -96,7 +96,7 @@ export class InboxProcessorService implements OnApplicationShutdown { if (userExistenceCheckApId != null) { const user = await this.apDbResolverService.getUserFromApId(userExistenceCheckApId); if (user == null) { - throw new Bull.UnrecoverableError(`skip: user not found for delete activity. ${getApId(userExistenceCheckApId)}`); + return `skip: user not found for delete activity. ${getApId(userExistenceCheckApId)}`; } } } diff --git a/packages/frontend/src/components/MkUploaderItems.vue b/packages/frontend/src/components/MkUploaderItems.vue index a196189c8b..0a7c154605 100644 --- a/packages/frontend/src/components/MkUploaderItems.vue +++ b/packages/frontend/src/components/MkUploaderItems.vue @@ -6,42 +6,42 @@ SPDX-License-Identifier: AGPL-3.0-only