Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion crates/cordiale-core/src/protocol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,9 @@ pub const MIN_SUPPORTED_PROTOCOL_VERSION: u32 = 1;
/// reads `dm_with` to label a DM mention); 36 adds `dm_with` to every
/// scrollback row; 37 removes `dm_conversation_id` from scrollback rows and
/// `query_windows_list` entries, and a nick change moves nothing server-side
/// any more (a renamed peer's next message opens a new window).
/// any more (a renamed peer's next message opens a new window). Last
/// re-checked against the Grappa source at tag `v1.5.12`, the first release
/// that speaks 37.
pub const CLIENT_PROTOCOL_VERSION: u32 = 37;

/// The bootstrap compatibility fields from `GET /api/config`, and echoed
Expand Down
6 changes: 4 additions & 2 deletions docs/feature-matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,11 @@ provate contro un server reale**:

| Area | Stato in Cordiale | Note |
|---|---|---|
| `dm_conversation_id` (v34 a v36) | Implementato, solo per server 34-36 | Letto da `query_windows_list` (non dalle righe di scrollback), usato per riconoscere la stessa finestra privata dopo un NICK del peer; il merge di due conversazioni non è rilevato. Dal v37 il server non lo invia più e un NICK non sposta nulla: la finestra vecchia resta con la sua storia e il prossimo messaggio del peer ne apre una nuova col nick nuovo, senza inferenza di rename, senza seguire la selezione, senza portare con sé silenziamenti o cursori di lettura. Non verificato contro un server v37 reale |
| `dm_conversation_id` (v34 a v36) | Implementato, solo per server 34-36 | Letto da `query_windows_list` (non dalle righe di scrollback), usato per riconoscere la stessa finestra privata dopo un NICK del peer; il merge di due conversazioni non è rilevato. Dal v37 il server non lo invia più e un NICK non sposta nulla: la finestra vecchia resta con la sua storia e il prossimo messaggio del peer ne apre una nuova col nick nuovo, senza inferenza di rename, senza seguire la selezione, senza portare con sé silenziamenti o cursori di lettura. Forma verificata sul sorgente del tag `v1.5.12` (prima release col protocollo 37); non provato in una sessione reale |
| `dm_with` sulle righe di scrollback (v36) | Non usato | Cordiale instrada le righe per topic e mittente e non classifica mai un DM confrontando `channel` col proprio nick, quindi non ne ha bisogno; `dm_with` resta letto solo nelle menzioni (v35) |
| `dm_with` e `id` nelle menzioni (v35) | Parziale | `dm_with` etichetta la finestra di una menzione di DM (altrimenti `channel`, che per un DM in ingresso è il proprio nick); `id` non è letto, quindi il salto al messaggio non c'è. Non verificato contro un server v35 reale |
| `dm_with` e `id` nelle menzioni (v35) | Parziale | `dm_with` etichetta la finestra di una menzione di DM (altrimenti `channel`, che per un DM in ingresso è il proprio nick); `id` non è letto, quindi il salto al messaggio non c'è (issue 238). Forma verificata sul sorgente del tag `v1.5.12`; non provato in una sessione reale |
| Self-KICK e rientro (Grappa 2321) | Nessuna modifica necessaria | Solo server: il canale resta nello snapshot di rientro e un 474 lo porta in `join_failed`. Cordiale mostra `kicked`, `joined` e `join_failed` come stati di finestra, con riga sbiadita nella sidebar anche da snapshot di riconnessione, quindi il canale non sparisce. Non provato con un server reale |
| Righe molto larghe (Cicchetto 2310) | Da controllare a mano | Cicchetto ritaglia le righe oltre il pannello (block art mIRC) senza far scorrere il pannello di lato. Cordiale va a capo con `StyledText` in una `ListView`, senza ritaglio esplicito: provare una riga lunga senza spazi su desktop |
| Catch-up dopo un reconnect | Implementato | Sonda `messages/count?after=<id>&cap=201` per canale; fino a 200 righe con `?after=`, oltre ricarica la coda e lascia una nota del buco |
| Presenza in primo piano | Implementato | `visibility` ogni 30 s mentre la finestra è attiva, `client_closing` a chiusura e sign-out |
| Profilo proprio per rete | Implementato | Campi CTCP USERINFO e avatar in Settings → General (`PATCH /networks/:slug/profile`, `PUT`/`DELETE .../avatar`) |
Expand Down
49 changes: 42 additions & 7 deletions docs/protocol-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,15 @@ Fonti:
- **Riferimento funzionale (solo funzionalità, non architettura):**
<https://github.com/vjt/grappa-irc/tree/main/cicchetto>.

Ultimo allineamento (2026-10-02): `protocol_version` 37,
`min_protocol_version` 1 (letti dal sorgente server in `lib/grappa/protocol.ex`);
Cordiale dichiara `client_proto=37` (§2).
Ultimo allineamento (2026-10-03): riletto contro il tag `v1.5.12` di Grappa
(commit `c26c77bc`), la prima release che porta il protocollo 37:
`protocol_version` 37, `min_protocol_version` 1 (letti dal sorgente server in
`lib/grappa/protocol.ex` al tag; `GET /api/config` del server dell'autore
risponde `version` 1.5.12 e protocollo 37). Cordiale dichiara
`client_proto=37` (§2). Le forme di riga di scrollback (`dm_with` opzionale),
di `query_windows_list` (`network_id`, `target_nick`, `opened_at`) e di
`mentions_bundle` (`id` e `dm_with` opzionali) sono state controllate sul
sorgente del tag; i flussi in una sessione reale restano da provare a mano.

Convenzione: "la documentazione dice" = contenuto verificato del
`CLIENT_PROTOCOL.md`; "sto inferendo" = deduzione non scritta esplicitamente
Expand Down Expand Up @@ -354,15 +360,44 @@ il resto della sezione Sicurezza resta in Cicchetto:
coesistono così come arrivano, senza migrazione di cache o bozze e senza
seguire la selezione; silenziamenti e cursori di lettura non passano dal
vecchio al nuovo nick (scelta accettata a monte). Il caso di sola
maiuscola/minuscola resta una stessa finestra. Non verificato contro un
server v37 reale.
maiuscola/minuscola resta una stessa finestra. Forma verificata sul
sorgente del tag `v1.5.12`; non provato in una sessione reale.
- Dal v35 le righe di `mentions_bundle.messages` portano anche `id` e
`dm_with` (entrambi opzionali: assenti su server più vecchi). Su un DM in
ingresso `channel` è il **proprio** nick: la finestra di una menzione è
`dm_with` (nick del peer, RAW) quando non è `null`, altrimenti `channel`.
Cordiale usa `dm_with` come etichetta nel riepilogo delle menzioni; `id`
non è letto (servirebbe solo per saltare al messaggio). Non verificato
contro un server v35 reale.
non è letto (servirebbe solo per saltare al messaggio, issue 238). Forma
verificata sul sorgente del tag `v1.5.12`; non provato in una sessione
reale.
- **Conteggi della finestra di sé dopo un cambio nick proprio (v37).** Il
listener sul topic del proprio nick riceve `window_counts` con `channel`
uguale al segmento del topic, cioè al nick con cui il listener è stato
joinato (`lib/grappa/window_counts/pusher.ex`). Cicchetto non guarda
`channel`: assegna il conteggio alla chiave `(rete, nick corrente)`
(`cicchetto/src/lib/subscribe.ts`, caso `window_counts`). Cordiale
riconosce il listener solo se il topic corrisponde al nick corrente e poi
confronta `channel` con quel nick; dopo un `own_nick_changed` il listener
viene rijoinato col nick nuovo, quindi il confronto torna e il conteggio
della finestra di sé segue il nick. Un push arrivato sul vecchio topic prima
del rejoin viene scartato, dove Cicchetto lo assegnerebbe al nick nuovo:
differenza transitoria, senza effetti oltre il rejoin, lasciata com'è. Il
conteggio non classifica righe, quindi `dm_with` non serve qui.
- **Self-KICK (Grappa 2321, tag `v1.5.12`).** Un KICK subito dal proprio
utente non toglie più il canale dallo snapshot di rientro
(`last_joined_channels`): alla riconnessione il canale viene rientrato,
e un 474 (ban) lo porta in `join_failed` invece di farlo sparire. Solo
server: sul wire non cambia niente. Cordiale tratta `kicked`, `joined` e
`join_failed` come stati di finestra, con riga sbiadita nella sidebar
anche quando l'evento arriva come snapshot di riconnessione sul topic del
canale (`upsert` della voce di sidebar), quindi il canale non sparisce.
- **Righe larghe (Cicchetto 2310).** Cicchetto ritaglia (`overflow-x: clip`)
le righe oltre la larghezza del pannello, tipicamente block art mIRC, invece
di lasciare scorrere il pannello di lato. Le righe di Cordiale sono
`StyledText` con a-capo automatico dentro una `ListView`; non c'è un
ritaglio esplicito. Senza una build locale non ho potuto provare una riga
lunga senza spazi: da controllare a occhio su desktop (vedi
`docs/feature-matrix.md`).
- I `kind` di evento non riconosciuti vanno ignorati (regola
additive-only, §3).

Expand Down
Loading