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, " · chosen by what you're viewing, not who you are — no tracking</small></aside>" as *u8)
110 return o
111}