Initial search refactoring
This commit is contained in:
		
							parent
							
								
									c7339d2126
								
							
						
					
					
						commit
						f7c1c28368
					
				
					 5 changed files with 26 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -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.} =
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue