Optimize timeline data structure

This commit is contained in:
Zed 2023-07-12 01:34:39 +02:00
parent 0bc3c153d9
commit b290f6fd29
5 changed files with 21 additions and 23 deletions

View file

@ -486,7 +486,7 @@ proc parseGraphTimeline*(js: JsonNode; root: string; after=""): Profile =
result.tweets.content.add tweet result.tweets.content.add tweet
elif "-conversation-" in entryId or entryId.startsWith("homeConversation"): elif "-conversation-" in entryId or entryId.startsWith("homeConversation"):
let (thread, self) = parseGraphThread(e) let (thread, self) = parseGraphThread(e)
result.tweets.content.add thread result.tweets.content.add thread.content
elif entryId.startsWith("cursor-bottom"): elif entryId.startsWith("cursor-bottom"):
result.tweets.bottom = e{"content", "value"}.getStr result.tweets.bottom = e{"content", "value"}.getStr
if after.len == 0 and i{"__typename"}.getStr == "TimelinePinEntry": if after.len == 0 and i{"__typename"}.getStr == "TimelinePinEntry":

View file

@ -56,9 +56,7 @@ proc fetchProfile*(after: string; query: Query; skipRail=false;
of posts: await getGraphUserTweets(userId, TimelineKind.tweets, after) of posts: await getGraphUserTweets(userId, TimelineKind.tweets, after)
of replies: await getGraphUserTweets(userId, TimelineKind.replies, after) of replies: await getGraphUserTweets(userId, TimelineKind.replies, after)
of media: await getGraphUserTweets(userId, TimelineKind.media, after) of media: await getGraphUserTweets(userId, TimelineKind.media, after)
else: Profile(tweets: Timeline(beginning: true, content: @[Chain(content: else: Profile(tweets: Timeline(beginning: true, content: @[@[Tweet(tombstone: "Tweet search is unavailable for now")]]))
@[Tweet(tombstone: "Tweet search is unavailable for now")]
)]))
# else: await getGraphSearch(query, after) # else: await getGraphSearch(query, after)
result.user = await user result.user = await user
@ -74,9 +72,7 @@ proc showTimeline*(request: Request; query: Query; cfg: Config; prefs: Prefs;
if query.fromUser.len != 1: if query.fromUser.len != 1:
let let
# timeline = await getGraphSearch(query, after) # timeline = await getGraphSearch(query, after)
timeline = Profile(tweets: Timeline(beginning: true, content: @[Chain(content: timeline = Profile(tweets: Timeline(beginning: true, content: @[@[Tweet(tombstone: "This features is unavailable for now")]]))
@[Tweet(tombstone: "This features is unavailable for now")]
)]))
html = renderTweetSearch(timeline.tweets, prefs, getPath()) html = renderTweetSearch(timeline.tweets, prefs, getPath())
return renderMain(html, request, cfg, prefs, "Multi", rss=rss) return renderMain(html, request, cfg, prefs, "Multi", rss=rss)

View file

@ -205,6 +205,8 @@ type
video*: Option[Video] video*: Option[Video]
photos*: seq[string] photos*: seq[string]
Tweets* = seq[Tweet]
Result*[T] = object Result*[T] = object
content*: seq[T] content*: seq[T]
top*, bottom*: string top*, bottom*: string
@ -212,7 +214,7 @@ type
query*: Query query*: Query
Chain* = object Chain* = object
content*: seq[Tweet] content*: Tweets
hasMore*: bool hasMore*: bool
cursor*: string cursor*: string
@ -222,7 +224,7 @@ type
after*: Chain after*: Chain
replies*: Result[Chain] replies*: Result[Chain]
Timeline* = Result[Chain] Timeline* = Result[Tweets]
Profile* = object Profile* = object
user*: User user*: User
@ -275,5 +277,5 @@ type
proc contains*(thread: Chain; tweet: Tweet): bool = proc contains*(thread: Chain; tweet: Tweet): bool =
thread.content.anyIt(it.id == tweet.id) thread.content.anyIt(it.id == tweet.id)
proc add*(timeline: var seq[Chain]; tweet: Tweet) = proc add*(timeline: var seq[Tweets]; tweet: Tweet) =
timeline.add Chain(content: @[tweet]) timeline.add @[tweet]

View file

@ -56,16 +56,16 @@ Twitter feed for: ${desc}. Generated by ${cfg.hostname}
#end if #end if
#end proc #end proc
# #
#proc renderRssTweets(tweets: seq[Chain]; cfg: Config; userId=""): string = #proc renderRssTweets(tweets: seq[Tweets]; cfg: Config; userId=""): string =
#let urlPrefix = getUrlPrefix(cfg) #let urlPrefix = getUrlPrefix(cfg)
#var links: seq[string] #var links: seq[string]
#for c in tweets: #for thread in tweets:
# for t in c.content: # for tweet in thread:
# if userId.len > 0 and t.user.id != userId: continue # if userId.len > 0 and tweet.user.id != userId: continue
# end if # end if
# #
# let retweet = if t.retweet.isSome: t.user.username else: "" # let retweet = if tweet.retweet.isSome: tweet.user.username else: ""
# let tweet = if retweet.len > 0: t.retweet.get else: t # let tweet = if retweet.len > 0: tweet.retweet.get else: tweet
# let link = getLink(tweet) # let link = getLink(tweet)
# if link in links: continue # if link in links: continue
# end if # end if
@ -113,7 +113,7 @@ ${renderRssTweets(profile.tweets.content, cfg, userId=profile.user.id)}
</rss> </rss>
#end proc #end proc
# #
#proc renderListRss*(tweets: seq[Chain]; list: List; cfg: Config): string = #proc renderListRss*(tweets: seq[Tweets]; list: List; cfg: Config): string =
#let link = &"{getUrlPrefix(cfg)}/i/lists/{list.id}" #let link = &"{getUrlPrefix(cfg)}/i/lists/{list.id}"
#result = "" #result = ""
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
@ -130,7 +130,7 @@ ${renderRssTweets(tweets, cfg)}
</rss> </rss>
#end proc #end proc
# #
#proc renderSearchRss*(tweets: seq[Chain]; name, param: string; cfg: Config): string = #proc renderSearchRss*(tweets: seq[Tweets]; name, param: string; cfg: Config): string =
#let link = &"{getUrlPrefix(cfg)}/search" #let link = &"{getUrlPrefix(cfg)}/search"
#let escName = xmltree.escape(name) #let escName = xmltree.escape(name)
#result = "" #result = ""

View file

@ -39,7 +39,7 @@ proc renderNoneFound(): VNode =
h2(class="timeline-none"): h2(class="timeline-none"):
text "No items found" text "No items found"
proc renderThread(thread: seq[Tweet]; prefs: Prefs; path: string): VNode = proc renderThread(thread: Tweets; prefs: Prefs; path: string): VNode =
buildHtml(tdiv(class="thread-line")): buildHtml(tdiv(class="thread-line")):
let sortedThread = thread.sortedByIt(it.id) let sortedThread = thread.sortedByIt(it.id)
for i, tweet in sortedThread: for i, tweet in sortedThread:
@ -106,9 +106,9 @@ proc renderTimelineTweets*(results: Timeline; prefs: Prefs; path: string;
var retweets: seq[int64] var retweets: seq[int64]
for thread in results.content: for thread in results.content:
if thread.content.len == 1: if thread.len == 1:
let let
tweet = thread.content[0] tweet = thread[0]
retweetId = if tweet.retweet.isSome: get(tweet.retweet).id else: 0 retweetId = if tweet.retweet.isSome: get(tweet.retweet).id else: 0
if retweetId in retweets or tweet.id in retweets or if retweetId in retweets or tweet.id in retweets or
@ -121,7 +121,7 @@ proc renderTimelineTweets*(results: Timeline; prefs: Prefs; path: string;
hasThread = get(tweet.retweet).hasThread hasThread = get(tweet.retweet).hasThread
renderTweet(tweet, prefs, path, showThread=hasThread) renderTweet(tweet, prefs, path, showThread=hasThread)
else: else:
renderThread(thread.content, prefs, path) renderThread(thread, prefs, path)
if results.bottom.len > 0: if results.bottom.len > 0:
renderMore(results.query, results.bottom) renderMore(results.query, results.bottom)