parsav  Diff

Differences From Artifact [dac341c838]:

To Artifact [900216dd8b]:


     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