Differences From
Artifact [43aca48007]:
1 1 -- vim: ft=terra
2 2 local pstr = lib.mem.ptr(int8)
3 3 local terra cs(s: rawstring)
4 4 return pstr { ptr = s, ct = lib.str.sz(s) }
5 5 end
6 6
7 +local terra
8 +push_promo_header(co: &lib.srv.convo, acc: &lib.str.acc, rter: &lib.store.actor, rid: uint64)
9 + acc:lpush('<div class="lede"><div class="promo"><img src="'):push(rter.avatar,0):lpush('"><a href="/')
10 + if rter.origin ~= 0 then acc:lpush('@') end
11 + acc:push(rter.xid,0):lpush('" class="username">')
12 + lib.render.nym(rter, 0, acc, true)
13 + acc:lpush('</a> retweeted</div>')
14 + if co.who.id == rter.id then
15 + acc:lpush('<a href="/post/'):shpush(rid):lpush('/del" class="del">✖</a>')
16 + end
17 +end
18 +
7 19 local terra
8 20 render_tweet(co: &lib.srv.convo, p: &lib.store.post, acc: &lib.str.acc)
9 - var author: &lib.store.actor
21 + var author: &lib.store.actor = nil
22 + var retweeter: &lib.store.actor = nil
10 23 for j = 0, co.actorcache.top do
11 - if p.author == co.actorcache(j).ptr.id then
12 - author = co.actorcache(j).ptr
24 + if p.author == co.actorcache(j).ptr.id then author = co.actorcache(j).ptr end
25 + if p.rtdby == co.actorcache(j).ptr.id then retweeter = co.actorcache(j).ptr end
26 + if author ~= nil and (p.rtdby == 0 or retweeter ~= nil) then
13 27 goto foundauth
14 28 end
15 29 end
16 - author = co.actorcache:insert(co.srv:actor_fetch_uid(p.author)).ptr
30 + if author == nil then
31 + author = co.actorcache:insert(co.srv:actor_fetch_uid(p.author)).ptr
32 + end
33 + if p.rtdby ~= 0 and retweeter == nil then
34 + retweeter = co.actorcache:insert(co.srv:actor_fetch_uid(p.rtdby)).ptr
35 + end
17 36
18 37 ::foundauth::
19 38 var avistr: lib.str.acc if author.origin == 0 then
20 39 avistr:compose('/avi/',author.handle)
21 40 end
22 41 var timestr: int8[26] lib.osclock.ctime_r(&p.posted, ×tr[0])
23 42
24 - var bhtml = lib.smackdown.html([lib.mem.ptr(int8)] {ptr=p.body,ct=0}) defer bhtml:free()
43 + var bhtml = lib.smackdown.html([lib.mem.ptr(int8)] {ptr=p.body,ct=0})
44 + defer bhtml:free()
25 45
26 46 var idbuf: int8[lib.math.shorthand.maxlen]
27 47 var idlen = lib.math.shorthand.gen(p.id, idbuf)
28 48 var permalink: lib.str.acc permalink:compose('/post/',{idbuf,idlen})
29 - var fullname = lib.render.nym(author,0,nil) defer fullname:free()
49 + var fullname = lib.render.nym(author,0,nil, false) defer fullname:free()
30 50 var tpl = data.view.tweet {
31 51 text = bhtml;
32 52 subject = cs(lib.coalesce(p.subject,''));
33 53 nym = fullname;
34 54 when = cs(×tr[0]);
35 55 avatar = cs(author.avatar);
36 56 acctlink = cs(author.xid);
37 57 permalink = permalink:finalize();
38 - attr = ''
58 + attr = pstr{'',0};
59 + stats = pstr{'',0};
39 60 }
61 + if p.rts + p.likes > 0 then
62 + var s: lib.str.acc s:init(128)
63 + s:lpush('<div class="stats">')
64 + if p.rts > 0 then s:lpush('<div class="rt">' ):ipush(p.rts ):lpush('</div>') end
65 + if p.likes > 0 then s:lpush('<div class="like">'):ipush(p.likes):lpush('</div>') end
66 + s:lpush('</div>')
67 + tpl.stats = s:finalize()
68 + end
40 69
41 70 var attrbuf: int8[32]
42 71 if p.accent ~= -1 and p.accent ~= co.ui_hue then
43 72 var hdecbuf: int8[21]
44 73 var hdec = lib.math.decstr(p.accent, &hdecbuf[20])
45 74 lib.str.cpy(&attrbuf[0], ' style="--hue:')
46 75 lib.str.cpy(&attrbuf[14], hdec)
47 76 var len = &hdecbuf[20] - hdec
48 77 lib.str.cpy(&attrbuf[14] + len, '"')
49 78 tpl.attr = &attrbuf[0]
50 79 end
51 80
52 81 defer tpl.permalink:free()
53 - if acc ~= nil then tpl:append(acc) return [lib.mem.ptr(int8)]{ptr=nil,ct=0} end
54 - var txt = tpl:tostr()
55 - return txt
82 + if acc ~= nil then
83 + if retweeter ~= nil then push_promo_header(co, acc, retweeter, p.rtact) end
84 + tpl:append(acc)
85 + if retweeter ~= nil then acc:lpush('</div>') end
86 + if p.rts + p.likes > 0 then tpl.stats:free() end
87 + return [lib.mem.ptr(int8)]{ptr=nil,ct=0}
88 + end
89 +
90 + if retweeter ~= nil then
91 + var rta: lib.str.acc rta:init(512)
92 + push_promo_header(co, &rta, retweeter, p.rtact)
93 + tpl:append(&rta) rta:lpush('</div>')
94 + return rta:finalize()
95 + else
96 + var txt = tpl:tostr()
97 + if p.rts + p.likes > 0 then tpl.stats:free() end
98 + return txt
99 + end
56 100 end
57 101 return render_tweet