Differences From
Artifact [dac341c838]:
5 5 requires_login(m: modes.t): bool
6 6 return m == modes.follow
7 7 or m == modes.mutual
8 8 or m == modes.circle
9 9 end
10 10
11 11 local terra
12 -render_timeline(co: &lib.srv.convo, modestr: lib.mem.ref(int8))
12 +render_timeline(co: &lib.srv.convo, hpath: lib.mem.ptr(lib.mem.ref(int8)))
13 + var modestr = lib.str.ref.null()
14 + var spec = lib.str.ref.null()
15 + if hpath.ct >= 2 then
16 + modestr = hpath(1)
17 + if hpath.ct >= 3 then spec = hpath(2) end
18 + end
13 19 var mode = modes.follow
14 20 var circle: uint64 = 0
15 - if modestr:cmp('local') then mode = [modes['local']]
16 - elseif modestr:cmp('mutual') then mode = modes.mutual
17 - elseif modestr:cmp('fedi') then mode = modes.fedi
18 - elseif modestr:cmp('circle') then mode = modes.circle
21 + if modestr:ref() then
22 + if modestr:cmp('local' ) then mode = [modes['local']]
23 + elseif modestr:cmp('mutual') then mode = modes.mutual
24 + elseif modestr:cmp('fedi' ) then mode = modes.fedi
25 + elseif modestr:cmp('circle') then mode = modes.circle
26 + end
19 27 end
20 28 if requires_login(mode) and co.aid == 0 then mode = [modes['local']] end
21 29
22 30
23 31 var stoptime = lib.osclock.time(nil)
24 32
25 33 var posts = [lib.mem.vec(lib.mem.ptr(lib.store.post))] {
................................................................................
41 49 var acc = co:stra(1024)
42 50 var modelabels = arrayof(pstr, 'followed', 'mutuals', 'local instance', 'fediverse', 'circle')
43 51 var modelinks = arrayof(pstr, [modes.members])
44 52 acc:lpush('<div style="text-align: right"><em>showing ')
45 53 for i=0, [modelabels.type.N] do
46 54 if co.aid ~= 0 or not requires_login(i) then
47 55 if i > 0 then acc:lpush(' ยท ') end
48 - if i == mode then
56 + if i == mode and not (mode == modes.circle and spec:ref()) then
49 57 acc:lpush('<strong>'):ppush(modelabels[i]):lpush('</strong>')
50 58 else
51 59 acc:lpush('<a href="/tl/'):ppush(modelinks[i]):lpush('">'):ppush(modelabels[i]):lpush('</a>')
52 60 end
53 61 end
54 62 end
55 63 acc:lpush('</em></div>')
56 - acc:lpush('<div id="tl" data-live="10">')
57 64 var newest: lib.store.timepoint = 0
58 - for i = 0, posts.sz do
59 - var author = co:uid2actor(posts(i).ptr.author)
60 - if mode == modes.mutual and posts(i).ptr.author ~= co.who.id then
61 - if not author.relationship.recip.follow() then goto skip end
65 + if mode == modes.circle and not spec then
66 + var circles = co.srv:circle_search(&co.srv.pool, co.who.id, 0)
67 + acc:lpush '<menu class="circles">'
68 + for i:intptr = 0, circles.ct do
69 + acc:lpush '<li><a href="/tl/circle/'
70 + :shpush(circles(i).cid)
71 + :lpush '">'
72 + :ppush(circles(i).name)
73 + :lpush '</a></li>'
74 + end
75 + -- TODO list circles
76 + acc:lpush '</menu>'
77 + else
78 + acc:lpush('<div id="tl" data-live="10">')
79 + for i = 0, posts.sz do
80 + var author = co:uid2actor(posts(i).ptr.author)
81 + if mode == modes.mutual and posts(i).ptr.author ~= co.who.id then
82 + if not author.relationship.recip.follow() then goto skip end
83 + end
84 + if author.relationship.rel.mute() or
85 + author.relationship.rel.avoid() or
86 + author.relationship.recip.exclude() then goto skip end
87 + lib.render.tweet(co, posts(i).ptr, &acc)
88 + var t = lib.math.biggest(lib.math.biggest(posts(i).ptr.posted, posts(i).ptr.discovered),posts(i).ptr.edited)
89 + if t > newest then newest = t end
90 + ::skip:: posts(i):free()
62 91 end
63 - if author.relationship.rel.mute() or
64 - author.relationship.rel.avoid() or
65 - author.relationship.recip.exclude() then goto skip end
66 - lib.render.tweet(co, posts(i).ptr, &acc)
67 - var t = lib.math.biggest(lib.math.biggest(posts(i).ptr.posted, posts(i).ptr.discovered),posts(i).ptr.edited)
68 - if t > newest then newest = t end
69 - ::skip:: posts(i):free()
92 + if posts.run > 0 then posts:free() end
93 + acc:lpush('</div>')
70 94 end
71 - if posts.run > 0 then posts:free() end
72 - acc:lpush('</div>')
73 95
74 96 var doc = [lib.srv.convo.page] {
75 97 title = 'timeline';
76 98 body = acc:finalize();
77 99 class = 'timeline';
78 100 cache = false;
79 101 }
80 - co:livepage(doc,newest)
102 + if newest ~= 0
103 + then co:livepage(doc,newest)
104 + else co:stdpage(doc)
105 + end
81 106 --doc.body:free()
82 107 end
83 108 return render_timeline