fix: apply block/mute list filtering to DM messages and conversations

The user's block/mute list (NIP-51) was not being checked when
processing direct messages, allowing blocked users' messages to appear
in conversations, trigger notifications, and increment unseen counts.

This adds block filtering at four layers:
- nostrService.applyDirectMessage: drops incoming DMs from blocked users
  before they enter the in-memory message cache
- nostrService.persistDirectMessageRecord: prevents blocked DM senders
  from being persisted to IndexedDB or triggering notifications
- profileModalController.buildDmConversationData: filters blocked users
  from the conversation list UI (catches pre-block persisted messages)
- applicationBootstrap: excludes blocked-user conversations from the
  unread DM badge count

The block checker is injected via setDmBlockChecker() to keep
nostrService decoupled from userBlocks, wired up in app.js init().

https://claude.ai/code/session_01EAVLtAM14GN99Eik8otLg2
This commit is contained in:
Claude committed 2026-02-06 19:41:50 +00:00
1 parent 3d9cbe1c08
commit 416a809ae4
5 files changed
+246 -1

No files matched your search

+20
View File
@@ -798,8 +798,28 @@ export default class ApplicationBootstrap {
try {
const summaries =
await app.nostrService.listDirectMessageConversationSummaries();
const actorHex =
typeof app.normalizeHexPubkey === "function" && app.pubkey
? app.normalizeHexPubkey(app.pubkey)
: "";
const canCheckBlock =
userBlocks && typeof userBlocks.isBlocked === "function";
const totalUnseen = Array.isArray(summaries)
? summaries.reduce((sum, summary) => {
if (canCheckBlock && actorHex && summary?.conversation_id) {
const parts = summary.conversation_id.split(":");
const remote =
parts.length === 3 && parts[0] === "dm"
? parts[1] === actorHex
? parts[2]
: parts[2] === actorHex
? parts[1]
: ""
: "";
if (remote && userBlocks.isBlocked(remote)) {
return sum;
}
}
const count = Number(summary?.unseen_count);
return sum + (Number.isFinite(count) ? count : 0);
}, 0)