search.nim 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import strutils, strformat, sequtils
  2. import types
  3. const
  4. separators = @["AND", "OR"]
  5. validFilters = @[
  6. "media", "images", "twimg",
  7. "native_video", "consumer_video", "pro_video",
  8. "links", "news", "quote", "mentions",
  9. "replies", "retweets", "nativeretweets",
  10. "verified", "safe"
  11. ]
  12. # Experimental, this might break in the future
  13. # Till then, it results in shorter urls
  14. const
  15. posPrefix = "thGAVUV0VFVBa"
  16. posSuffix = "EjUAFQAlAFUAFQAA"
  17. proc initQuery*(filters, includes, excludes, separator: string; name=""): Query =
  18. var sep = separator.strip().toUpper()
  19. Query(
  20. kind: custom,
  21. filters: filters.split(",").filterIt(it in validFilters),
  22. includes: includes.split(",").filterIt(it in validFilters),
  23. excludes: excludes.split(",").filterIt(it in validFilters),
  24. fromUser: @[name],
  25. sep: if sep in separators: sep else: ""
  26. )
  27. proc getMediaQuery*(name: string): Query =
  28. Query(
  29. kind: media,
  30. filters: @["twimg", "native_video"],
  31. fromUser: @[name],
  32. sep: "OR"
  33. )
  34. proc getReplyQuery*(name: string): Query =
  35. Query(
  36. kind: replies,
  37. includes: @["nativeretweets"],
  38. fromUser: @[name]
  39. )
  40. proc genQueryParam*(query: Query): string =
  41. var filters: seq[string]
  42. var param: string
  43. for i, user in query.fromUser:
  44. param &= &"from:{user} "
  45. if i < query.fromUser.high:
  46. param &= "OR "
  47. for f in query.filters:
  48. filters.add "filter:" & f
  49. for i in query.includes:
  50. filters.add "include:" & i
  51. for e in query.excludes:
  52. filters.add "-filter:" & e
  53. return strip(param & filters.join(&" {query.sep} "))
  54. proc genQueryUrl*(query: Query): string =
  55. if query.kind == multi: return "?"
  56. result = &"/{query.kind}?"
  57. if query.kind != custom: return
  58. var params: seq[string]
  59. if query.filters.len > 0:
  60. params &= "filter=" & query.filters.join(",")
  61. if query.includes.len > 0:
  62. params &= "include=" & query.includes.join(",")
  63. if query.excludes.len > 0:
  64. params &= "not=" & query.excludes.join(",")
  65. if query.sep.len > 0:
  66. params &= "sep=" & query.sep
  67. if params.len > 0:
  68. result &= params.join("&") & "&"
  69. proc cleanPos*(pos: string): string =
  70. pos.multiReplace((posPrefix, ""), (posSuffix, ""))
  71. proc genPos*(pos: string): string =
  72. posPrefix & pos & posSuffix