rss.nim 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import asyncdispatch, strutils
  2. import jester
  3. import router_utils, timeline
  4. import ".."/[cache, agents, query]
  5. import ../views/general
  6. include "../views/rss.nimf"
  7. proc showRss*(name, hostname: string; query: Query): Future[string] {.async.} =
  8. let (profile, timeline, _) =
  9. await fetchSingleTimeline(name, "", getAgent(), query, media=false)
  10. if timeline != nil:
  11. return renderTimelineRss(timeline, profile, hostname)
  12. template respRss*(rss: typed) =
  13. if rss.len == 0:
  14. resp Http404, showError("User \"" & @"name" & "\" not found", cfg)
  15. resp rss, "application/rss+xml;charset=utf-8"
  16. proc createRssRouter*(cfg: Config) =
  17. router rss:
  18. get "/search/rss":
  19. if @"q".len > 200:
  20. resp Http400, showError("Search input too long.", cfg)
  21. let query = initQuery(params(request))
  22. if query.kind != tweets:
  23. resp Http400, showError("Only Tweet searches are allowed for RSS feeds.", cfg)
  24. let tweets = await getSearch[Tweet](query, "", getAgent(), media=false)
  25. respRss(renderSearchRss(tweets.content, query.text, genQueryUrl(query), cfg.hostname))
  26. get "/@name/rss":
  27. cond '.' notin @"name"
  28. respRss(await showRss(@"name", cfg.hostname, Query()))
  29. get "/@name/with_replies/rss":
  30. cond '.' notin @"name"
  31. respRss(await showRss(@"name", cfg.hostname, getReplyQuery(@"name")))
  32. get "/@name/media/rss":
  33. cond '.' notin @"name"
  34. respRss(await showRss(@"name", cfg.hostname, getMediaQuery(@"name")))
  35. get "/@name/search/rss":
  36. cond '.' notin @"name"
  37. respRss(await showRss(@"name", cfg.hostname, initQuery(params(request), name=(@"name"))))
  38. get "/@name/lists/@list/rss":
  39. cond '.' notin @"name"
  40. let list = await getListTimeline(@"name", @"list", getAgent(), "", media=false)
  41. respRss(renderListRss(list.content, @"name", @"list", cfg.hostname))