| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- import strutils, strformat, sequtils, tables, uri
- import types
- const
- separators = @["AND", "OR"]
- validFilters* = @[
- "media", "images", "twimg", "videos",
- "native_video", "consumer_video", "pro_video",
- "links", "news", "quote", "mentions",
- "replies", "retweets", "nativeretweets",
- "verified", "safe"
- ]
- template `@`(param: string): untyped =
- if param in pms: pms[param]
- else: ""
- proc initQuery*(pms: Table[string, string]; name=""): Query =
- result = Query(
- kind: parseEnum[QueryKind](@"f", tweets),
- text: @"q",
- filters: validFilters.filterIt("f-" & it in pms),
- excludes: validFilters.filterIt("e-" & it in pms),
- since: @"since",
- until: @"until",
- near: @"near"
- )
- if name.len > 0:
- result.fromUser = name.split(",")
- if @"e-nativeretweets".len == 0:
- result.includes.add "nativeretweets"
- proc getMediaQuery*(name: string): Query =
- Query(
- kind: media,
- filters: @["twimg", "native_video"],
- fromUser: @[name],
- sep: "OR"
- )
- proc getReplyQuery*(name: string): Query =
- Query(
- kind: replies,
- includes: @["nativeretweets"],
- fromUser: @[name]
- )
- proc genQueryParam*(query: Query; rewriteReplies=true): string =
- var
- filters: seq[string]
- param: string
- if query.kind == users:
- return query.text
- let rewrite = rewriteReplies and query.fromUser.len > 0 and
- query.kind notin {tweets, replies}
- for i, user in query.fromUser:
- if rewrite:
- param &= &"(from:{user}(to:{user} OR -filter:replies)) "
- else:
- param &= &"from:{user} "
- if i < query.fromUser.high:
- param &= "OR "
- for f in query.filters:
- filters.add "filter:" & f
- for e in query.excludes:
- if rewrite and e == "replies": continue
- filters.add "-filter:" & e
- for i in query.includes:
- filters.add "include:" & i
- result = strip(param & filters.join(&" {query.sep} "))
- if query.since.len > 0:
- result &= " since:" & query.since
- if query.until.len > 0:
- result &= " until:" & query.until
- if query.near.len > 0:
- result &= &" near:\"{query.near}\" within:15mi"
- if query.text.len > 0:
- result &= " " & query.text
- if rewrite and result.len >= 500:
- return genQueryParam(query, rewriteReplies=false)
- proc genQueryUrl*(query: Query): string =
- if query.kind notin {tweets, users}: return
- var params = @[&"f={query.kind}"]
- if query.text.len > 0:
- params.add "q=" & encodeUrl(query.text)
- for f in query.filters:
- params.add "f-" & f & "=on"
- for e in query.excludes:
- params.add "e-" & e & "=on"
- for i in query.includes.filterIt(it != "nativeretweets"):
- params.add "i-" & i & "=on"
- if query.since.len > 0:
- params.add "since=" & query.since
- if query.until.len > 0:
- params.add "until=" & query.until
- if query.near.len > 0:
- params.add "near=" & query.near
- if params.len > 0:
- result &= params.join("&")
|