| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- import strutils, strformat, sequtils
- 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"
- ]
- # Experimental, this might break in the future
- # Till then, it results in shorter urls
- const
- posPrefix = "thGAVUV0VFVBa"
- posSuffix = "EjUAFQAlAFUAFQAA"
- proc initQuery*(filters, includes, excludes, separator: string; name=""): Query =
- var sep = separator.strip().toUpper()
- Query(
- kind: custom,
- filters: filters.split(",").filterIt(it in validFilters),
- includes: includes.split(",").filterIt(it in validFilters),
- excludes: excludes.split(",").filterIt(it in validFilters),
- fromUser: @[name],
- sep: if sep in separators: sep else: ""
- )
- 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): string =
- var filters: seq[string]
- var param: string
- for i, user in query.fromUser:
- param &= &"from:{user} "
- if i < query.fromUser.high:
- param &= "OR "
- for f in query.filters:
- filters.add "filter:" & f
- for i in query.includes:
- filters.add "include:" & i
- for e in query.excludes:
- filters.add "-filter:" & e
- return strip(param & filters.join(&" {query.sep} "))
- proc genQueryUrl*(query: Query): string =
- if query.kind == multi: return "?"
- result = &"/{query.kind}?"
- if query.kind != custom: return
- var params: seq[string]
- if query.filters.len > 0:
- params &= "filter=" & query.filters.join(",")
- if query.includes.len > 0:
- params &= "include=" & query.includes.join(",")
- if query.excludes.len > 0:
- params &= "not=" & query.excludes.join(",")
- if query.sep.len > 0:
- params &= "sep=" & query.sep
- if params.len > 0:
- result &= params.join("&") & "&"
- proc cleanPos*(pos: string): string =
- pos.multiReplace((posPrefix, ""), (posSuffix, ""))
- proc genPos*(pos: string): string =
- posPrefix & pos & posSuffix
|