Differences From
Artifact [ecfc7ba460]:
1 1 -- vim: ft=terra
2 +local pstr = lib.mem.ptr(int8)
3 +local terra cs(s: rawstring)
4 + return pstr { ptr = s, ct = lib.str.sz(s) }
5 +end
6 +
2 7 local terra
3 8 render_profile(co: &lib.srv.convo, actor: &lib.store.actor)
4 9 var aux: lib.str.acc
5 - var auxp: rawstring
10 + var auxp: pstr
6 11 if co.aid ~= 0 and co.who.id == actor.id then
7 - auxp = '<a href="/conf/profile">alter</a>'
12 + auxp = lib.str.plit '<a href="/conf/profile">alter</a>'
8 13 elseif co.aid ~= 0 then
9 14 aux:compose('<a href="/', actor.xid, '/follow">follow</a><a href="/',
10 15 actor.xid, '/chat">chat</a>')
11 16 if co.who.rights.powers:affect_users() then
12 17 aux:push('<a href="/',11):push(actor.xid,0):push('/ctl">control</a>',17)
13 18 end
14 - auxp = aux.buf
19 + auxp = aux:finalize()
15 20 else
16 21 aux:compose('<a href="/', actor.xid, '/follow">remote follow</a>')
17 22 end
18 23 var avistr: lib.str.acc if actor.origin == 0 then
19 24 avistr:compose('/avi/',actor.handle)
20 25 end
21 26 var timestr: int8[26] lib.osclock.ctime_r(&actor.knownsince, ×tr[0])
22 27
23 28 var strfbuf: int8[28*4]
24 29 var stats = co.srv:actor_stats(actor.id)
25 - var sn_posts = lib.math.decstr_friendly(stats.posts, &strfbuf[ [strfbuf.type.N - 1] ])
26 - var sn_follows = lib.math.decstr_friendly(stats.follows, sn_posts - 1)
27 - var sn_followers = lib.math.decstr_friendly(stats.followers, sn_follows - 1)
28 - var sn_mutuals = lib.math.decstr_friendly(stats.mutuals, sn_followers - 1)
30 + var sn_posts = cs(lib.math.decstr_friendly(stats.posts, &strfbuf[ [strfbuf.type.N - 1] ]))
31 + var sn_follows = cs(lib.math.decstr_friendly(stats.follows, sn_posts.ptr - 1))
32 + var sn_followers = cs(lib.math.decstr_friendly(stats.followers, sn_follows.ptr - 1))
33 + var sn_mutuals = cs(lib.math.decstr_friendly(stats.mutuals, sn_followers.ptr - 1))
29 34
30 35 var profile = data.view.profile {
31 - nym = lib.coalesce(actor.nym, actor.handle);
32 - bio = lib.coalesce(actor.bio, "<em>tall, dark, and mysterious</em>");
33 - xid = actor.xid;
34 - avatar = lib.trn(actor.origin == 0, avistr.buf,
35 - lib.coalesce(actor.avatar, '/s/default-avatar.webp'));
36 + nym = cs(lib.coalesce(actor.nym, actor.handle));
37 + bio = cs(lib.coalesce(actor.bio, "<em>tall, dark, and mysterious</em>"));
38 + xid = cs(actor.xid);
39 + avatar = lib.trn(actor.origin == 0, pstr{ptr=avistr.buf,ct=avistr.sz},
40 + cs(lib.coalesce(actor.avatar, '/s/default-avatar.webp')));
36 41
37 42 nposts = sn_posts, nfollows = sn_follows;
38 43 nfollowers = sn_followers, nmutuals = sn_mutuals;
39 - tweetday = timestr;
40 - timephrase = lib.trn(actor.origin == 0, 'joined', 'known since');
44 + tweetday = cs(timestr);
45 + timephrase = lib.trn(actor.origin == 0, lib.str.plit'joined', lib.str.plit'known since');
41 46
42 47 auxbtn = auxp;
43 48 }
44 49
45 50 var ret = profile:tostr()
46 51 if actor.origin == 0 then avistr:free() end
47 - if not (co.aid ~= 0 and co.who.id == actor.id) then aux:free() end
52 + if not (co.aid ~= 0 and co.who.id == actor.id) then auxp:free() end
48 53 return ret
49 54 end
50 55
51 56 return render_profile