From f7c1c283680c5ebe0ad7c97d9044e58ec4881cf3 Mon Sep 17 00:00:00 2001 From: Zed Date: Fri, 23 Aug 2019 02:15:25 +0200 Subject: [PATCH] Initial search refactoring --- src/api.nim | 8 ++++---- src/parser.nim | 6 +++--- src/types.nim | 20 +++++++++++--------- src/views/status.nim | 10 +++++----- src/views/timeline.nim | 6 +++--- 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/api.nim b/src/api.nim index 3ab0397..1de4e32 100644 --- a/src/api.nim +++ b/src/api.nim @@ -13,10 +13,10 @@ const apiBase = parseUri("https://api.twitter.com/1.1/") timelineUrl = "i/profiles/show/$1/timeline/tweets" - timelineSearchUrl = "i/search/timeline" timelineMediaUrl = "i/profiles/show/$1/media_timeline" profilePopupUrl = "i/profiles/popup" profileIntentUrl = "intent/user" + searchUrl = "i/search/timeline" tweetUrl = "status" videoUrl = "videos/tweet/config/$1.json" tokenUrl = "guest/activate.json" @@ -40,7 +40,7 @@ macro genMediaGet(media: untyped; token=false) = quote do: proc `multi`(thread: Thread | Timeline; agent: string; token="") {.async.} = if thread == nil: return - var `media` = thread.tweets.filterIt(it.`media`.isSome) + var `media` = thread.content.filterIt(it.`media`.isSome) when `token`: var gToken = token if gToken.len == 0: gToken = await getGuestToken(agent) @@ -299,7 +299,7 @@ proc finishTimeline(json: JsonNode; query: Option[Query]; after, agent: string): cardFut = getCards(thread, agent) await all(vidsFut, pollFut, cardFut) - result.tweets = thread.tweets + result.content = thread.content proc getTimeline*(username, after, agent: string): Future[Timeline] {.async.} = let headers = newHttpHeaders({ @@ -348,7 +348,7 @@ proc getTimelineSearch*(query: Query; after, agent: string): Future[Timeline] {. "reset_error_state": "false" } - let json = await fetchJson(base / timelineSearchUrl ? params, headers) + let json = await fetchJson(base / searchUrl ? params, headers) result = await finishTimeline(json, some(query), after, agent) proc getProfileAndTimeline*(username, agent, after: string): Future[(Profile, Timeline)] {.async.} = diff --git a/src/parser.nim b/src/parser.nim index acf0963..a137b9e 100644 --- a/src/parser.nim +++ b/src/parser.nim @@ -121,11 +121,11 @@ proc parseThread*(nodes: XmlNode): Thread = for n in nodes.filterIt(it.kind != xnText): let class = n.attr("class").toLower() if "tombstone" in class or "unavailable" in class or "withheld" in class: - result.tweets.add Tweet() + result.content.add Tweet() elif "morereplies" in class: result.more = getMoreReplies(n) else: - result.tweets.add parseTweet(n) + result.content.add parseTweet(n) proc parseConversation*(node: XmlNode): Conversation = result = Conversation( @@ -150,7 +150,7 @@ proc parseConversation*(node: XmlNode): Conversation = proc parseTimeline*(node: XmlNode; after: string): Timeline = if node == nil: return result = Timeline( - tweets: parseThread(node.select(".stream > .stream-items")).tweets, + content: parseThread(node.select(".stream > .stream-items")).content, minId: node.attr("data-min-position"), maxId: node.attr("data-max-position"), hasMore: node.select(".has-more-items") != nil, diff --git a/src/types.nim b/src/types.nim index 943f5b1..40c3cb5 100644 --- a/src/types.nim +++ b/src/types.nim @@ -75,6 +75,14 @@ type fromUser*: seq[string] sep*: string + Result*[T] = ref object + content*: seq[T] + minId*: string + maxId*: string + hasMore*: bool + beginning*: bool + query*: Option[Query] + Gif* = object url*: string thumb*: string @@ -151,7 +159,7 @@ type poll*: Option[Poll] Thread* = ref object - tweets*: seq[Tweet] + content*: seq[Tweet] more*: int Conversation* = ref object @@ -160,13 +168,7 @@ type after*: Thread replies*: seq[Thread] - Timeline* = ref object - tweets*: seq[Tweet] - minId*: string - maxId*: string - hasMore*: bool - beginning*: bool - query*: Option[Query] + Timeline* = Result[Tweet] Config* = ref object address*: string @@ -178,4 +180,4 @@ type profileCacheTime*: int proc contains*(thread: Thread; tweet: Tweet): bool = - thread.tweets.anyIt(it.id == tweet.id) + thread.content.anyIt(it.id == tweet.id) diff --git a/src/views/status.nim b/src/views/status.nim index 91b8293..aa109ba 100644 --- a/src/views/status.nim +++ b/src/views/status.nim @@ -13,8 +13,8 @@ proc renderMoreReplies(thread: Thread): VNode = proc renderReplyThread(thread: Thread; prefs: Prefs): VNode = buildHtml(tdiv(class="reply thread thread-line")): - for i, tweet in thread.tweets: - let last = (i == thread.tweets.high and thread.more == 0) + for i, tweet in thread.content: + let last = (i == thread.content.high and thread.more == 0) renderTweet(tweet, prefs, index=i, last=last) if thread.more != 0: @@ -26,7 +26,7 @@ proc renderConversation*(conversation: Conversation; prefs: Prefs): VNode = tdiv(class="main-thread"): if conversation.before != nil: tdiv(class="before-tweet thread-line"): - for i, tweet in conversation.before.tweets: + for i, tweet in conversation.before.content: renderTweet(tweet, prefs, index=i) tdiv(class="main-tweet"): @@ -35,9 +35,9 @@ proc renderConversation*(conversation: Conversation; prefs: Prefs): VNode = if hasAfter: tdiv(class="after-tweet thread-line"): - let total = conversation.after.tweets.high + let total = conversation.after.content.high let more = conversation.after.more - for i, tweet in conversation.after.tweets: + for i, tweet in conversation.after.content: renderTweet(tweet, prefs, index=i, last=(i == total and more == 0)) if more != 0: diff --git a/src/views/timeline.nim b/src/views/timeline.nim index f9d0744..ef8c0bd 100644 --- a/src/views/timeline.nim +++ b/src/views/timeline.nim @@ -65,9 +65,9 @@ proc threadFilter(it: Tweet; tweetThread: string): bool = proc renderTweets(timeline: Timeline; prefs: Prefs): VNode = buildHtml(tdiv(id="posts")): var threads: seq[string] - for tweet in timeline.tweets: + for tweet in timeline.content: if tweet.threadId in threads: continue - let thread = timeline.tweets.filterIt(threadFilter(it, tweet.threadId)) + let thread = timeline.content.filterIt(threadFilter(it, tweet.threadId)) if thread.len < 2: renderTweet(tweet, prefs, class="timeline-tweet") else: @@ -88,7 +88,7 @@ proc renderTimeline*(timeline: Timeline; username: string; protected: bool; if protected: renderProtected(username) - elif timeline.tweets.len == 0: + elif timeline.content.len == 0: renderNoneFound() else: renderTweets(timeline, prefs)