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