Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    rd14bf1c re5fc801  
    35023502 */
    35033503export function feedCursor(slug) {
    3504   try {
    3505     const r = db.prepare('SELECT MAX(rev) AS n FROM ap_feed_state WHERE slug = ?').get(slug);
    3506     return String((r && r.n) || 0);
    3507   } catch { return '0'; }
    3508 }
    3509 
    3510 /**
    3511  * Wat er sinds `rev` met deze tijdlijn gebeurd is: welke berichten er nieuw zijn,
    3512  * bewerkt, of weg.
    3513  *
    3514  * Nog niet gebruikt door een leespad -- de vorm van de aankomst is shaer-of7 en
    3515  * de "bewerkt"-markering is daar nog een open beslissing. Maar de gegevens
    3516  * ontstaan hoe dan ook bij het bijhouden van de merksteen, en dit is de enige
    3517  * plek waar ze samen te lezen zijn.
    3518  */
    3519 export function feedChangesSince(slug, rev, limit = 200) {
    3520   try {
    3521     return db.prepare(`SELECT object_uri, kind, rev FROM ap_feed_state
    3522                         WHERE slug = ? AND rev > ? ORDER BY rev ASC LIMIT ?`)
    3523       .all(slug, parseInt(rev, 10) || 0, limit);
    3524   } catch { return []; }
     3504  const max = (sql, ...args) => { try { const r = db.prepare(sql).get(...args); return (r && r.n) || 0; } catch { return 0; } };
     3505  const t = max('SELECT MAX(rowid) AS n FROM ap_timeline WHERE slug = ?', slug);
     3506  const m = max('SELECT MAX(rowid) AS n FROM ap_mentions WHERE slug = ?', slug);
     3507  const o = max('SELECT MAX(rowid) AS n FROM ap_outbox WHERE site_slug = ?', slug);
     3508  const r = max(`SELECT MAX(i.rowid) AS n FROM ap_interactions i
     3509                   JOIN posts p ON p.id = i.post_id
     3510                   JOIN sites s ON s.id = p.site_id
     3511                  WHERE s.slug = ? AND i.kind = 'reply'`, slug);
     3512  return `${t}.${m}.${o}.${r}`;
    35253513}
    35263514
     
    52905278  // Guardian PWA / Berichten push. The kid answers an incoming offer in its
    52915279  // own Berichten; an existing guardian and a commit land in the PWA.
     5280  //
     5281  // De labels hangen aan dezelfde sleutels als het Guardian-paneel, zodat een
     5282  // melding en het scherm waar hij heen wijst hetzelfde woord gebruiken.
    52925283  onEvent: (slug, ev) => {
    5293     const L = pushLang(slug);
    5294     const texts = {
    5295       offer_received: ['push.n_guard_offer_t', 'push.n_guard_offer_b'],   // I am the ward
    5296       offer_for_ward: ['push.n_guard_cog_t', 'push.n_guard_cog_b'],       // I co-guard this ward
    5297       committed: ['push.n_guard_ward_t', 'push.n_guard_ward_b'],
    5298       // §3.2: a guardian ended the relation. The ward hears that someone who
    5299       // was looking after them has gone; a co-guardian hears they are one fewer.
    5300       guardian_left: ['push.n_guard_left_t', 'push.n_guard_left_b'],
    5301       coguardian_left: ['push.n_guard_cogleft_t', 'push.n_guard_cogleft_b'],
    5302     }[ev.kind];
    5303     if (!texts) return;
    5304     const who = deriveHandle(ev.candidate || ev.guardian || ev.ward || '') || '?';
    5305     const url = (ev.kind === 'offer_received' || ev.kind === 'guardian_left') ? `${pushPrefix(slug)}/messages` : '/guardian';
    5306     pushEvent(slug, { type: 'guardian', title: i18nT(L, texts[0]), body: i18nT(L, texts[1], { who }), url });
     5284    const p = guardianEventPush(slug, ev);
     5285    if (p) pushEvent(slug, p);
    53075286  },
    53085287});
     5288
     5289/**
     5290 * Welke melding hoort bij een guardianship-gebeurtenis, of geen.
     5291 *
     5292 * Apart en puur, omdat dit een BESLISSING is en geen bezorging: de
     5293 * guardianship-module zendt veertien soorten uit en deze tabel bepaalt welke
     5294 * daarvan een mens wakker maken. Dat hoort toetsbaar te zijn zonder web-push
     5295 * erbij te halen.
     5296 */
     5297export function guardianEventPush(slug, ev) {
     5298  const L = pushLang(slug);
     5299  const texts = {
     5300    offer_received: ['push.n_guard_offer_t', 'push.n_guard_offer_b'],   // I am the ward
     5301    offer_for_ward: ['push.n_guard_cog_t', 'push.n_guard_cog_b'],       // I co-guard this ward
     5302    committed: ['push.n_guard_ward_t', 'push.n_guard_ward_b'],
     5303    // §3.2: a guardian ended the relation. The ward hears that someone who
     5304    // was looking after them has gone; a co-guardian hears they are one fewer.
     5305    guardian_left: ['push.n_guard_left_t', 'push.n_guard_left_b'],
     5306    coguardian_left: ['push.n_guard_cogleft_t', 'push.n_guard_cogleft_b'],
     5307    // 5.6 gated settings. Zonder deze twee is de hele tally stil: een guardian
     5308    // hoort niet dat er een antwoord van hem gewenst is, en dus loopt het
     5309    // venster leeg en verloopt het voorstel. Een drempel die niemand ziet is
     5310    // geen drempel.
     5311    gated_review: ['push.n_gate_ask_t', 'push.n_gate_ask_b'],      // jij moet antwoorden
     5312    gated_outcome: ['push.n_gate_done_t', 'push.n_gate_done_b'],   // er is besloten
     5313  }[ev.kind];
     5314  if (!texts) return null;
     5315  const who = deriveHandle(ev.candidate || ev.guardian || ev.ward || '') || '?';
     5316  // Een gate-melding zonder te zeggen WELKE instelling is nutteloos: er zijn er
     5317  // meer dan een, en ze betekenen heel verschillende dingen voor een kind.
     5318  const wat = i18nT(L, GATE_LABEL[ev.feature] || 'guardian.prop_embeds');
     5319  const stand = i18nT(L, ev.value ? 'guardian.prop_on' : 'guardian.prop_off');
     5320  const uitkomst = i18nT(L, GATE_OUTCOME[ev.outcome] || 'guardian.prop_st_open');
     5321  const url = (ev.kind === 'offer_received' || ev.kind === 'guardian_left') ? `${pushPrefix(slug)}/messages` : '/guardian';
     5322  return { type: 'guardian', title: i18nT(L, texts[0]), body: i18nT(L, texts[1], { who, wat, stand, uitkomst }), url };
     5323}
     5324
     5325// Van een gated feature naar het woord dat het Guardian-paneel er al voor
     5326// gebruikt. Een onbekende feature valt terug op het algemene woord in plaats van
     5327// de melding te laten vervallen: liever een iets vager bericht dan geen bericht.
     5328const GATE_LABEL = {
     5329  'shaer:externalEmbeds': 'guardian.prop_embeds',
     5330  'shaer:externalPlayback': 'guardian.prop_play',
     5331};
     5332const GATE_OUTCOME = {
     5333  accepted: 'guardian.prop_st_accepted',
     5334  rejected: 'guardian.prop_st_rejected',
     5335  expired: 'guardian.prop_st_expired',
     5336};
    53095337
    53105338// The notification duty of FEP-633c 3.6.2, wired once for every place a
     
    53365364  buildActor, buildNote, buildCreate, buildOutbox, buildFollowers, buildFollowing, buildFeatured,
    53375365  followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliverUpdate, deliverActorUpdate, resyncFeaturedPins,
    5338   feedCursor, feedChangesSince, waitForFeedChange,
     5366  feedCursor, waitForFeedChange,
    53395367  getInteractions, getInteractionById, setInteractionBoosted, setInteractionLiked, buildReplyNote, getOutboxNote, getSentNotes, deliverReply, resolveRemoteNote, noteAudience, mayReadNote,
    53405368  listOutbox, deliverOutboxDelete, deliverOutboxUpdate, deliverDirectNote,
Note: See TracChangeset for help on using the changeset viewer.