status.nim 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # SPDX-License-Identifier: AGPL-3.0-only
  2. import asyncdispatch, strutils, sequtils, uri, options, sugar
  3. import jester, karax/vdom
  4. import router_utils
  5. import ".."/[types, formatters, api]
  6. import ../views/[general, status]
  7. export uri, sequtils, options, sugar
  8. export router_utils
  9. export api, formatters
  10. export status
  11. proc createStatusRouter*(cfg: Config) =
  12. router status:
  13. get "/@name/status/@id/?":
  14. cond '.' notin @"name"
  15. let id = @"id"
  16. if id.len > 19 or id.any(c => not c.isDigit):
  17. resp Http404, showError("Invalid tweet ID", cfg)
  18. let prefs = cookiePrefs()
  19. # used for the infinite scroll feature
  20. if @"scroll".len > 0:
  21. let replies = await getReplies(id, getCursor())
  22. if replies.content.len == 0:
  23. resp Http404, ""
  24. resp $renderReplies(replies, prefs, getPath())
  25. let conv = await getTweet(id, getCursor())
  26. if conv == nil:
  27. echo "nil conv"
  28. if conv == nil or conv.tweet == nil or conv.tweet.id == 0:
  29. var error = "Tweet not found"
  30. if conv != nil and conv.tweet != nil and conv.tweet.tombstone.len > 0:
  31. error = conv.tweet.tombstone
  32. resp Http404, showError(error, cfg)
  33. let
  34. title = pageTitle(conv.tweet)
  35. ogTitle = pageTitle(conv.tweet.user)
  36. desc = conv.tweet.text
  37. var
  38. images = conv.tweet.photos
  39. video = ""
  40. if conv.tweet.video.isSome():
  41. images = @[get(conv.tweet.video).thumb]
  42. video = getVideoEmbed(cfg, conv.tweet.id)
  43. elif conv.tweet.gif.isSome():
  44. images = @[get(conv.tweet.gif).thumb]
  45. video = getPicUrl(get(conv.tweet.gif).url)
  46. elif conv.tweet.card.isSome():
  47. let card = conv.tweet.card.get()
  48. if card.image.len > 0:
  49. images = @[card.image]
  50. elif card.video.isSome():
  51. images = @[card.video.get().thumb]
  52. let html = renderConversation(conv, prefs, getPath() & "#m")
  53. resp renderMain(html, request, cfg, prefs, title, desc, ogTitle,
  54. images=images, video=video)
  55. get "/@name/@s/@id/@m/?@i?":
  56. cond @"s" in ["status", "statuses"]
  57. cond @"m" in ["video", "photo"]
  58. redirect("/$1/status/$2" % [@"name", @"id"])
  59. get "/@name/statuses/@id/?":
  60. redirect("/$1/status/$2" % [@"name", @"id"])
  61. get "/i/web/status/@id":
  62. redirect("/i/status/" & @"id")
  63. get "/@name/thread/@id/?":
  64. redirect("/$1/status/$2" % [@"name", @"id"])