code wiki / _hdl_build / nx_ads.nx

nx_ads.nx source

↩ module page · 111 lines · 5428 B

1// nx_ads.nx -- LIB: SOVEREIGN ADS (operator: "i also want to have ads a part of all this"). The Nishi take on 2// advertising that fits the doctrine (privacy-first, data treated as valuable not stolen): FIRST-PARTY, 3// CONTEXTUAL, NON-TRACKING. An ad is selected purely by the CONTEXT of the page being shown (its topic tag) -- 4// NEVER by a profile/history of the viewer (ads_pick takes a context, NOT a user id, by construction). Rendered 5// server-side into the sovereign page: clearly labelled "Sponsored", zero third-party JS, zero tracking pixels, 6// no external script. Sovereign seg-store (knowledge/store/ads-*, NO TSV). license_tier: ORIGINAL 7import "nx_food_science.nx" 8import "nx_seg_store.nx" 9import "nx_syscalls.nx" 10 11func ads_put(prefix: *u8, key: *u8, val: *u8) -> i64 { 12 let vl: i64 = as_len(val) 13 if fd_streq_store(prefix, key, val, vl) == 1 { return 0 } 14 let w: *i64 = ss_begin() 15 ss_add(w, 1, key, val, vl) 16 let seg: i64 = fd_seg_next(prefix) 17 ss_commit(prefix, w, seg) 18 return 1 19} 20 21func ads_ad_key(aid: *u8, out: *u8) -> i64 { var o: i64 = 0; o = as_append(out, o, "ads:ad:" as *u8); o = as_append(out, o, aid); out[o] = 0 as u8; return o } 22func ads_tag_key(tag: *u8, out: *u8) -> i64 { var o: i64 = 0; o = as_append(out, o, "ads:tag:" as *u8); o = as_append(out, o, tag); out[o] = 0 as u8; return o } 23 24// register an ad and index it under its CONTEXT tag (not under any user). 25func ads_add(prefix: *u8, aid: *u8, headline: *u8, body: *u8, advertiser: *u8, context: *u8) -> i64 { 26 let key: *u8 = sys_mmap(96); ads_ad_key(aid, key) 27 let val: *u8 = sys_mmap(512) 28 var o: i64 = 0 29 o = as_append(val, o, headline); val[o] = 9 as u8; o = o + 1 30 o = as_append(val, o, body); val[o] = 9 as u8; o = o + 1 31 o = as_append(val, o, advertiser); val[o] = 9 as u8; o = o + 1 32 o = as_append(val, o, context) 33 val[o] = 0 as u8 34 let w: i64 = ads_put(prefix, key, val) 35 // append aid to ads:tag:<context> (idempotent) 36 let tk: *u8 = sys_mmap(96); ads_tag_key(context, tk) 37 let pq: *i64 = sys_mmap(16) as *i64 38 let lq: *i64 = sys_mmap(16) as *i64 39 let cur: *u8 = sys_mmap(1024) 40 var co: i64 = 0 41 if ss_get(prefix, tk, pq, lq) == 1 { 42 let b: *u8 = pq[0] as *u8; let n: i64 = lq[0] 43 // already present? 44 var i: i64 = 0; var ls: i64 = 0 45 while i <= n { 46 var sep: i64 = 0 47 if i == n { sep = 1 } else { if b[i] == (9 as u8) { sep = 1 } } 48 if sep == 1 { 49 let tl: i64 = i - ls 50 if tl > 0 { if as_len(aid) == tl { var m: i64 = 0; var eq: i64 = 1; while m < tl { if b[ls + m] != aid[m] { eq = 0 } m = m + 1 } if eq == 1 { return w } } } 51 ls = i + 1 52 } 53 i = i + 1 54 } 55 var u: i64 = 0; while u < n { cur[u] = b[u]; u = u + 1 } co = n 56 cur[co] = 9 as u8; co = co + 1 57 } 58 co = as_append(cur, co, aid); cur[co] = 0 as u8 59 ads_put(prefix, tk, cur) 60 return w 61} 62 63func ads_field(prefix: *u8, aid: *u8, f: i64, out: *u8) -> i64 { 64 let key: *u8 = sys_mmap(96); ads_ad_key(aid, key) 65 let pq: *i64 = sys_mmap(16) as *i64 66 let lq: *i64 = sys_mmap(16) as *i64 67 if ss_get(prefix, key, pq, lq) != 1 { out[0] = 0 as u8; return 0 } 68 return fd_field(pq[0] as *u8, lq[0], f, out) 69} 70 71// pick an ad for a CONTEXT (the page topic). Deterministic: the first ad indexed under the tag. Returns 1 + 72// the aid via out_aid, or 0 if no ad matches this context. NOTE: the signature takes ONLY a context -- there is 73// no way to target by viewer identity. That is the privacy guarantee, enforced by the type, not a promise. 74func ads_pick(prefix: *u8, context: *u8, out_aid: *u8) -> i64 { 75 let tk: *u8 = sys_mmap(96); ads_tag_key(context, tk) 76 let pq: *i64 = sys_mmap(16) as *i64 77 let lq: *i64 = sys_mmap(16) as *i64 78 if ss_get(prefix, tk, pq, lq) != 1 { out_aid[0] = 0 as u8; return 0 } 79 let b: *u8 = pq[0] as *u8 80 let n: i64 = lq[0] 81 // copy the first token (up to the first TAB or end) = the first ad indexed under this context 82 var k: i64 = 0 83 var done: i64 = 0 84 while done == 0 { 85 if k >= n { done = 1 } else { 86 if b[k] == (9 as u8) { done = 1 } else { out_aid[k] = b[k]; k = k + 1 } 87 } 88 } 89 out_aid[k] = 0 as u8 90 if k == 0 { return 0 } 91 return 1 92} 93 94// render a sovereign "Sponsored" ad slot for `context` into out at off; returns new off (unchanged if no ad). 95// No third-party JS, no tracking pixel, no external script -- just labelled, context-relevant copy. 96func ads_render_slot(prefix: *u8, context: *u8, out: *u8, off: i64) -> i64 { 97 let aid: *u8 = sys_mmap(64) 98 if ads_pick(prefix, context, aid) == 0 { return off } 99 let head: *u8 = sys_mmap(256); ads_field(prefix, aid, 0, head) 100 let body: *u8 = sys_mmap(512); ads_field(prefix, aid, 1, body) 101 let adv: *u8 = sys_mmap(128); ads_field(prefix, aid, 2, adv) 102 var o: i64 = off 103 o = as_append(out, o, "<aside class='adslot'><span class='adlabel'>Sponsored</span><b>" as *u8) 104 o = as_append_escaped(out, o, head, as_len(head)) 105 o = as_append(out, o, "</b><p>" as *u8) 106 o = as_append_escaped(out, o, body, as_len(body)) 107 o = as_append(out, o, "</p><small>" as *u8) 108 o = as_append_escaped(out, o, adv, as_len(adv)) 109 o = as_append(out, o, " &middot; chosen by what you're viewing, not who you are &mdash; no tracking</small></aside>" as *u8) 110 return o 111}