user.nim 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import std/[algorithm, unicode, re, strutils, strformat]
  2. import jsony
  3. import utils, slices
  4. import ../types/user as userType
  5. from ../../types import User, Error
  6. let
  7. unRegex = re"(^|[^A-z0-9-_./?])@([A-z0-9_]{1,15})"
  8. unReplace = "$1<a href=\"/$2\">@$2</a>"
  9. htRegex = re"(^|[^\w-_./?])([##$])([\w_]+)"
  10. htReplace = "$1<a href=\"/search?q=%23$3\">$2$3</a>"
  11. proc expandUserEntities(user: var User; raw: RawUser) =
  12. let
  13. orig = user.bio.toRunes
  14. ent = raw.entities
  15. if ent.url.urls.len > 0:
  16. user.website = ent.url.urls[0].expandedUrl
  17. var replacements = newSeq[ReplaceSlice]()
  18. for u in ent.description.urls:
  19. replacements.extractUrls(u, orig.high)
  20. replacements.dedupSlices
  21. replacements.sort(cmp)
  22. user.bio = orig.replacedWith(replacements, 0 .. orig.len)
  23. .replacef(unRegex, unReplace)
  24. .replacef(htRegex, htReplace)
  25. proc getBanner(user: RawUser): string =
  26. if user.profileBannerUrl.len > 0:
  27. return user.profileBannerUrl & "/1500x500"
  28. if user.profileLinkColor.len > 0:
  29. return '#' & user.profileLinkColor
  30. if user.profileImageExtensions.mediaColor.r.ok.palette.len > 0:
  31. let color = user.profileImageExtensions.mediaColor.r.ok.palette[0].rgb
  32. return &"#{color.red:02x}{color.green:02x}{color.blue:02x}"
  33. proc toUser*(raw: RawUser): User =
  34. result = User(
  35. id: raw.idStr,
  36. username: raw.screenName,
  37. fullname: raw.name,
  38. location: raw.location,
  39. bio: raw.description,
  40. following: raw.friendsCount,
  41. followers: raw.followersCount,
  42. tweets: raw.statusesCount,
  43. likes: raw.favouritesCount,
  44. media: raw.mediaCount,
  45. verified: raw.verified,
  46. protected: raw.protected,
  47. joinDate: parseTwitterDate(raw.createdAt),
  48. banner: getBanner(raw),
  49. userPic: getImageUrl(raw.profileImageUrlHttps).replace("_normal", "")
  50. )
  51. if raw.pinnedTweetIdsStr.len > 0:
  52. result.pinnedTweet = parseBiggestInt(raw.pinnedTweetIdsStr[0])
  53. result.expandUserEntities(raw)
  54. proc parseUser*(json: string; username=""): User =
  55. handleErrors:
  56. case error.code
  57. of suspended: return User(username: username, suspended: true)
  58. of userNotFound: return
  59. else: echo "[error - parseUser]: ", error
  60. result = toUser json.fromJson(RawUser)