Changeset 21ef238 in Klonkt for src/routes/activitypub.js


Ignore:
Timestamp:
08/10/2026 04:53:05 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
e215090
Parents:
41de7cb
Message:

Ongelezen per gesprek: een COUNT, en Read als gebeurtenis

shaer-frontend-3tx. De kopjeslezing draagt nu shaer:unread per gesprek, plus
shaer:unreadWave als er een zwaai bij zit -- een zetje van een guardian is geen
gesprek en hoort niet opgeteld te worden.

GEEN BIJGEHOUDEN GETAL (Barts besluit): het aantal is een COUNT over de
berichten na de leesmarkering. Niets om op te hogen bij bezorging, niets om te
verlagen bij lezen, en bij een verwijdering klopt het vanzelf weer -- een
teller zou blijven staan en dan zegt de badge 3 terwijl er niets is. Er staat
een toets op precies dat geval.

READ IS EEN GEBEURTENIS, geen zetbare stand (Barts vraag: een stille client
stuurt toch geen Undo{Read}?). AS2 kent Read; markRead neemt het maximum, dus
een toestel dat een week uit stond kan gelezen berichten niet terugzetten op
ongelezen. Ook daar staat een toets op. Geen shaer:seen verzonnen.

De markering is de samengestelde cursor (stempel|ref), zelfde vorm als de
gesprekspaginering: twee berichten in dezelfde seconde is bij DM's een gesprek
en geen randgeval.

En conversationItems geeft nu PAREN terug in plaats van een losse lijst. Een
kop levert niet altijd een item op (dichte poort, ontbrekende rij), en op index
koppelen zou de telling stil aan het verkeerde gesprek hangen.

862/862 groen.

Co-Authored-By: Claude Opus 5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    r41de7cb r21ef238  
    492492  const incoming = new Map(AP.messageRowsByUri(auth.site.slug, refs.filter((r) => r.direction === 'in').map((r) => r.ref))
    493493    .map((m) => [m.object_uri, m]));
    494   const items = [];
     494  // PAREN, geen losse lijst: een kop levert niet altijd een item op (dichte
     495  // poort, ontbrekende rij), en dan zou de aanroeper op index koppelen en de
     496  // telling aan het verkeerde gesprek hangen. Stil, en pas te zien als iemand
     497  // een badge op de verkeerde naam ziet staan.
     498  const pairs = [];
    495499  for (const r of refs) {
    496500    if (r.direction === 'in') {
     
    498502      if (!m) continue;
    499503      if (!(P.messagesAllowed || m.help_request || guardianUris.has(m.actor_uri))) continue;
    500       items.push(messageItem(m, ctx));
     504      pairs.push({ head: r, item: messageItem(m, ctx) });
    501505    } else {
    502506      const n = AP.getOutboxNote(base, r.ref);
    503507      // Je eigen woorden blijven van jou: een dichte messages-poort verbergt
    504508      // niet wat je zelf gezegd hebt.
    505       if (n) items.push(sentItem(n, { me, mine }));
     509      if (n) pairs.push({ head: r, item: sentItem(n, { me, mine }) });
    506510    }
    507511  }
    508   return items;
     512  return pairs;
    509513}
    510514
     
    513517  if (!auth || auth.site.slug !== req.params.slug) return res.status(403).end();
    514518  const heads = AP.conversationHeads(auth.site.slug);
    515   const items = conversationItems(req, auth, heads);
     519  const pairs = conversationItems(req, auth, heads);
     520  const items = pairs.map((x) => x.item);
     521  // Ongelezen per gesprek (shaer-frontend-3tx): een COUNT, geen bijgehouden
     522  // getal. Hij hangt aan het NIEUWSTE kopje van elke persoon -- er kunnen er
     523  // twee zijn (zie conversationHeads) en het aantal hoort bij het gesprek, niet
     524  // bij een bericht.
     525  //
     526  // AS2 heeft geen term voor ongelezen; dit is per-lezer-interactiestatus,
     527  // dezelfde categorie als shaer:liked. Niet in totalItems persen: dat betekent
     528  // 'hoeveel er zijn' en niet 'hoeveel jij nog niet zag'.
     529  const ongelezen = AP.unreadPerConversation(auth.site.slug);
     530  const gezien = new Set();
     531  for (const { head, item } of pairs) {
     532    if (gezien.has(head.other)) continue;
     533    gezien.add(head.other);
     534    const u = ongelezen.get(head.other);
     535    if (!u) continue;
     536    item.object['shaer:unread'] = u.n;
     537    // Een zwaai is geen aantal maar een zetje van een guardian: eigen teken.
     538    if (u.wave) item.object['shaer:unreadWave'] = true;
     539  }
    516540  AP.sendAP(res, {
    517541    '@context': AP.AP_CONTEXT,
     
    533557    limit: req.query.limit,
    534558  });
    535   const items = conversationItems(req, auth, page.rows);
     559  const items = conversationItems(req, auth, page.rows).map((x) => x.item);
    536560  // De paginagrootte reist mee in next: vroeg je om 30, dan hoort de volgende
    537561  // pagina er ook 30 te zijn. Zonder dit wordt hij stilletjes de standaard, en
Note: See TracChangeset for help on using the changeset viewer.