Admin: login message, server channels, server FAQ, message to everyone #375

Closed
littlefox wants to merge 0 commits from issue-354-server-messages into main
Owner

Closes #354

Stacked on #353. Administration screen: the login message (written as elisp writes it, set with set-motd-of-lyskom), the server's four channels, the server's FAQ, and a message to everyone (asked once more; #342 took it from the side column). Everyone now sees the login message under the top bar at login until they close it. Devserver test server_messages (puts back what it changes); admin.spec cleans up the login message afterwards even on failure (kom.ts).

🤖 Generated with Claude Code

https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8

Closes #354 Stacked on #353. Administration screen: the login message (written as elisp writes it, set with set-motd-of-lyskom), the server's four channels, the server's FAQ, and a message to everyone (asked once more; #342 took it from the side column). Everyone now sees the login message under the top bar at login until they close it. Devserver test `server_messages` (puts back what it changes); admin.spec cleans up the login message afterwards even on failure (kom.ts). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
"Skapa kanal" in Alla kanaler opens a short form: the name, who can read
it (open, closed, secret), anonymous posts and secret members, and an
optional presentation. The channel is created with create-conf, joined,
and opened; the creator is its supervisor. A taken name, a server that
doesn't allow it, and a presentation that fails are said plainly.

kom-client gets admin.rs (ChannelKind, AdminError, create_channel), and
presentations work for any conference, not only my own person.

Refs #347

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
A channel's supervisor (or a member of the supervising conference) gets
"Hantera kanalen" under its status: rename it, write its presentation,
put up or take down the note on the door, and add or remove FAQs. Others
see the status as before. The server has the last word; a refusal is
said as "you may not change this channel".

The note is written as elisp writes it: a text to the server's motd
conference with the channel's name as subject, then set-etc-motd. A FAQ
is a text to the channel marked with faq-text.

Refs #348

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Test: what the channel status shows; phones open it through ⋯
All checks were successful
ci / desktop (push) Successful in 20m8s
ci / e2e (desktop) (push) Successful in 23m9s
ci / e2e (iphone) (push) Successful in 22m55s
perf / perf (pull_request) Has been skipped
ci / plan (push) Successful in 2m27s
ci / check (push) Successful in 9m57s
ci / e2e (android) (push) Successful in 16m31s
549d5c630c
Refs #347

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Refs #348

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
"Hantera kanalen" gets the rules: open, closed or secret (a stricter
choice asks once more and says what changes), replies to the parent
channel, anonymous posts, secret members; who may post (a person or a
channel's members, empty for everyone); the parent channel; how many
days posts and commented posts are kept; and handing the channel over,
after a warning that you can't change it afterwards. Names are looked up
as typed; none or several matches are said plainly.

set-expire is left out: Protocol A marks it experimental and lyskomd
doesn't act on it.

Refs #349

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Manage a channel: the message stays above the status after a change
All checks were successful
ci / e2e (iphone) (push) Successful in 22m1s
ci / e2e (android) (push) Successful in 19m34s
ci / e2e (desktop) (push) Successful in 19m9s
ci / desktop (push) Successful in 22m32s
perf / perf (pull_request) Has been skipped
ci / plan (push) Successful in 2m38s
ci / check (push) Successful in 10m5s
ab539efc74
open_conf clears the status line on purpose, so the message for a
change was gone before it showed. A change now reloads the view itself.

Refs #348

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Merge issue-348-manage-channel into issue-349-channel-rules
All checks were successful
ci / check (push) Successful in 12m38s
ci / e2e (desktop) (push) Successful in 22m2s
ci / e2e (android) (push) Successful in 17m33s
ci / desktop (push) Successful in 17m46s
perf / perf (pull_request) Has been skipped
ci / plan (push) Successful in 3m5s
ci / e2e (iphone) (push) Successful in 27m25s
f3b8620c35
Under a channel's status, "Visa medlemmarna (N)" lists them (invited and
passive ones tagged). Its supervisor invites a person by name and
removes members, asked once more. An invited person sees "Du är inbjuden
hit" with Tacka ja / Tacka nej where the channel's status is, and going
to the channel shows that choice rather than its posts.

Supervisors invite: lyskomd's "Add members by invitation" (on by
default) makes any add by a non-admin an invitation. Adding directly is
for admin mode (#355).

Refs #350

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Refs #350

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
# Conflicts:
#	crates/devseed/src/main.rs
Refs #351

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Test: a member opens the channel's status through Om kanalen
All checks were successful
ci / e2e (android) (push) Successful in 23m12s
ci / e2e (iphone) (push) Successful in 24m0s
ci / check (push) Successful in 12m48s
ci / desktop (push) Successful in 19m7s
perf / perf (pull_request) Has been skipped
ci / plan (push) Successful in 2m17s
ci / e2e (desktop) (push) Successful in 22m41s
53cee2cc35
Refs #350

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Merge issue-350-members into issue-351-moderation
All checks were successful
ci / check (push) Successful in 12m0s
ci / e2e (iphone) (push) Successful in 21m47s
ci / e2e (android) (push) Successful in 18m16s
ci / e2e (desktop) (push) Successful in 20m29s
ci / desktop (push) Successful in 19m9s
perf / perf (pull_request) Has been skipped
ci / plan (push) Successful in 3m10s
25d32ef4e7
My account: change password, my note on the door, my sessions
Some checks failed
ci / e2e (desktop) (push) Failing after 21m40s
ci / desktop (push) Successful in 20m33s
ci / e2e (iphone) (push) Successful in 20m49s
ci / e2e (android) (push) Successful in 19m16s
perf / perf (pull_request) Has been skipped
ci / plan (push) Successful in 3m4s
ci / check (push) Successful in 13m7s
cd050f2f8a
On my own profile, "Mitt konto": change my password (the old one, the
new one twice; wrong or different ones are said), put up or take down
my note on the door, and see where I'm logged in, logging any other
session out.

A changed password is the one used to log in again after a dropped
connection (the session's copy is now shared and updatable), and a kept
login (D-032, D-045) stores the new one.

Refs #352

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Admin mode for accounts with the wheel or admin bit
Some checks failed
ci / plan (push) Successful in 2m0s
ci / check (push) Successful in 13m27s
ci / desktop (push) Successful in 17m49s
ci / e2e (android) (push) Successful in 27m46s
ci / e2e (desktop) (push) Failing after 20m34s
ci / e2e (iphone) (push) Successful in 24m37s
perf / perf (pull_request) Has been skipped
dcb2409081
Settings gets "Administration" for accounts that may administer the
server: admin mode on and off (enable 255 / 0), and the way to an
Administration screen that #354-#356 fill. While it's on, the top bar
says so in red with a button to turn it off, and every channel can be
managed. A dropped connection or a logout turns it off, as the server
forgets it; the events list says so.

lyskomd accepts anyone's enable and grants nothing, so the client checks
the privilege bits first rather than show admin mode that isn't.

Refs #353

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
The Administration screen (in admin mode) gets: the login message, with
subject and text, written as elisp writes it (to the old message's
recipients, else the news channel) and set with set-motd-of-lyskom; the
server's four channels (news, notes, presentations of channels and of
people); the server's FAQs; and a message to every logged-in session,
asked once more (#342 took that from the side column).

Everyone now sees the login message under the top bar when they log in,
until they close it; a new message shows again.

Refs #354

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Refs #354

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Test: wait for the admin screen to reload before typing on
Some checks failed
ci / plan (push) Successful in 2m32s
perf / perf (pull_request) Has been skipped
ci / check (push) Successful in 10m56s
ci / e2e (android) (push) Successful in 20m13s
ci / desktop (push) Successful in 18m22s
ci / e2e (desktop) (push) Failing after 23m0s
ci / e2e (iphone) (push) Successful in 22m1s
112c61f5fa
Refs #354

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Author
Owner

Merged into main as part of #377 (the stack's top branch, which contains this one); main green (run #696). Closing.

Merged into main as part of #377 (the stack's top branch, which contains this one); main green (run #696). Closing.
littlefox closed this pull request 2026-10-28 02:25:59 +00:00
Some checks failed
ci / plan (push) Successful in 2m32s
perf / perf (pull_request) Has been skipped
ci / check (push) Successful in 10m56s
ci / e2e (android) (push) Successful in 20m13s
ci / desktop (push) Successful in 18m22s
ci / e2e (desktop) (push) Failing after 23m0s
ci / e2e (iphone) (push) Successful in 22m1s

Pull request closed

Sign in to join this conversation.
No description provided.