Mute and follow: people and subjects in elisp's filter list, threads ours #170

Merged
littlefox merged 2 commits from issue-153-mute into main 2026-10-19 18:23:39 +00:00
Owner

Closes #153

Stacked on #168 (profiles) and #165 (channels). Until those merge, this diff includes them.

  • 'Tysta…' on a post: Tysta , Tysta ärendet, Tysta tråden, Följ / Sluta följa tråden.
  • People and subjects: written into elisp's kom-permanent-filter-list when the user has an elisp block, so the Emacs client applies the same mute. Otherwise into our own block, in the same syntax. No elisp block is ever created, since that would flip things like the classic-words default.
    • kom_client::lisp reads and prints just enough Lisp. Only that variable is rewritten; the rest of the block stays byte for byte. An unreadable list is never written back.
  • What NeoKOM understands: author, author-no, recipient, recipient-no, subject, text (any-case substrings), with not. Regexp patterns are kept but never act.
  • Threads: muted and followed threads are ours.
  • Reading: Kom::next skips muted texts, marking them read unseen (with replies for skip-tree and muted threads), and the status line says how many.
  • Notifications: muted texts never notify. A followed thread notifies on new replies, with its own switch.
  • Inställningar → Tystat och följt: everything listed in words, marked when shared with Emacs, each undoable.

Verified:

  • unit tests for the Lisp reader/printer, elisp filters (read, match, round trip, block kept), and settings (elisp vs ours, never creating an elisp block);
  • a new devserver integration test against lyskomd: a muted person, a subject filter and a muted thread with a reply are all skipped and read, only the rest shown, count 3. All 12 integration tests pass.
  • new mute.spec on desktop, Android and iPhone, repeated 6× on iPhone after pinning the locator to the post;
  • the full suite: 258 passed. The one failure, a login connect timeout in settings.spec, passes on rerun.
  • clippy desktop, web, wasm and tcp.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8

Closes #153 Stacked on #168 (profiles) and #165 (channels). Until those merge, this diff includes them. - **'Tysta…' on a post:** Tysta <author>, Tysta ärendet, Tysta tråden, Följ / Sluta följa tråden. - **People and subjects:** written into elisp's `kom-permanent-filter-list` when the user has an elisp block, so the Emacs client applies the same mute. Otherwise into our own block, in the same syntax. No elisp block is ever created, since that would flip things like the classic-words default. - `kom_client::lisp` reads and prints just enough Lisp. Only that variable is rewritten; the rest of the block stays byte for byte. An unreadable list is never written back. - **What NeoKOM understands:** author, author-no, recipient, recipient-no, subject, text (any-case substrings), with not. Regexp patterns are kept but never act. - **Threads:** muted and followed threads are ours. - **Reading:** `Kom::next` skips muted texts, marking them read unseen (with replies for skip-tree and muted threads), and the status line says how many. - **Notifications:** muted texts never notify. A followed thread notifies on new replies, with its own switch. - **Inställningar → Tystat och följt:** everything listed in words, marked when shared with Emacs, each undoable. Verified: - unit tests for the Lisp reader/printer, elisp filters (read, match, round trip, block kept), and settings (elisp vs ours, never creating an elisp block); - a new devserver integration test against lyskomd: a muted person, a subject filter and a muted thread with a reply are all skipped and read, only the rest shown, count 3. All 12 integration tests pass. - new mute.spec on desktop, Android and iPhone, repeated 6× on iPhone after pinning the locator to the post; - the full suite: 258 passed. The one failure, a login connect timeout in settings.spec, passes on rerun. - clippy desktop, web, wasm and tcp. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Browse channels: a directory of all channels, join with one tap
Some checks failed
ci / check (push) Has started running
ci / e2e (push) Has started running
ci / desktop (push) Has been cancelled
0e69031479
#150. Every conference from one lookup-z-name, recommended first (the
server's recommended-conf items), filtered as you type, with members
and last written for the rows shown, and sortable by those after a
paced, on-request fetch. Join, leave, or enter from the list. The seed
recommends Allmänt so the tests see it.

Refs #150

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Merge origin/main into issue-150-channels
Some checks failed
ci / check (push) Successful in 10m34s
ci / desktop (push) Successful in 14m23s
ci / e2e (push) Failing after 30m34s
2ca23c88f6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Alla kanaler: its own class, not inbox-link
Some checks failed
ci / check (push) Successful in 8m34s
ci / desktop (push) Successful in 18m20s
ci / e2e (push) Failing after 33m2s
9f4f378f4f
Specs (and anything else) finding the Inkorg button by its class found
two (CI run #283).

Refs #150

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
# Conflicts:
#	app/assets/main.css
#	app/src/i18n.rs
#151, D-048, D-049. A tap on an author, a name in the who-is-on list or
a person link opens a profile: avatar, presence or last login, the
presentation, recent posts, and Skriv brev. Avatars are the first
picture in the presentation, otherwise initials. On my own profile the
presentation and picture are edited by writing a new presentation as
elisp does (same recipients, a comment to the old one, then
set-presentation). A new account starts there.

Refs #151

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Profiles: person links open the profile; header avatars fit the line
Some checks failed
ci / check (push) Successful in 10m20s
ci / desktop (push) Successful in 12m30s
ci / e2e (push) Failing after 29m23s
dc0b72755f
links.spec now expects the profile (no longer the status page). A
post header's avatar is no taller than its text, so the lines below
don't shift.

Refs #151

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Mute and follow: people and subjects in elisp's filter list, threads ours
All checks were successful
ci / check (push) Successful in 8m30s
ci / desktop (push) Successful in 13m8s
ci / e2e (push) Successful in 28m2s
58f50c161f
#153. Tysta… on a post mutes its author, its subject or its thread, or
follows the thread. People and subjects go into elisp's
kom-permanent-filter-list when there's an elisp block (so the Emacs
client agrees), else into ours; threads are ours. Muted texts are read
unseen while reading on, with a count in the status line; followed
threads notify. Inställningar lists everything with a way to undo it.

Refs #153

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Merge origin/main into issue-153-mute
All checks were successful
ci / check (push) Successful in 12m22s
ci / desktop (push) Successful in 14m10s
ci / e2e (push) Successful in 30m46s
51b04f7a82
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
littlefox referenced this pull request from a commit 2026-10-19 21:34:01 +00:00
Sign in to join this conversation.
No description provided.