diff --git a/src/routes/activityspoof.nim b/src/routes/activityspoof.nim index a5c6be5..2e976ea 100644 --- a/src/routes/activityspoof.nim +++ b/src/routes/activityspoof.nim @@ -14,8 +14,20 @@ export mastoapi proc createActivityPubRouter*(cfg: Config) = router activityspoof: - get "/api/v1/accounts/?": - resp Http200, {"Content-Type": "application/json"}, """[]""" + get "/api/v1/accounts/@id": + let id = @"id" + if id.len == 0: + resp Http200, {"Content-Type": "application/json"}, """[]""" + + let username = await getCachedUsername(id) + if username.len > 0: + resp Http404, {"Content-Type": "application/json"}, """{"error":"Invalid account ID"}""" + + let user = await getCachedUser(username) + if user.suspended or user.id.len == 0: + resp Http404, {"Content-Type": "application/json"}, """{"error":"User not found"}""" + + resp Http200, {"Content-Type": "application/json"}, $getMastoAPIUser(user, cfg) get "/api/v1/statuses/@id": let id = @"id" @@ -105,8 +117,24 @@ proc createActivityPubRouter*(cfg: Config) = media.add(mediaObj) + var fields: seq[JsonNode] = @[] + + if tweet.user.location.len > 0: + var location = newJObject() + location["name"] = %"Location" + location["value"] = %tweet.user.location + location["verified_at"] = newJNull() + fields.add(location) + + if tweet.user.website.len > 0: + var website = newJObject() + website["name"] = %"Website" + website["value"] = %(&"{tweet.user.website}") + website["verified_at"] = newJNull() + fields.add(website) + var postJson = newJObject() - postJson["id"] = %(&"{tweet.id}") + postJson["id"] = %tweet.id postJson["url"] = %tweetUrl postJson["uri"] = %tweetUrl postJson["created_at"] = %($tweet.time) @@ -128,32 +156,7 @@ proc createActivityPubRouter*(cfg: Config) = "website": getUrlPrefix(cfg) } postJson["media_attachments"] = %media - postJson["account"] = %*{ - "id": &"{tweet.user.id}", - "display_name": tweet.user.fullname, - "username": tweet.user.username, - "acct": tweet.user.username, - "url": &"{getUrlPrefix(cfg)}/{tweet.user.username}", - "uri": &"{getUrlPrefix(cfg)}/{tweet.user.username}", - "created_at": $tweet.user.joinDate, - "locked": tweet.user.protected, - "bot": false, # TODO? - "discoverable": true, - "indexable": false, - "group": false, - "avatar": getUrlPrefix(cfg) & getPicUrl(tweet.user.userPic), - "avatar_static": getUrlPrefix(cfg) & getPicUrl(tweet.user.userPic), - "header": getUrlPrefix(cfg) & getPicUrl(tweet.user.banner), - "header_static": getUrlPrefix(cfg) & getPicUrl(tweet.user.banner), - "followers_count": tweet.user.followers, - "following_count": tweet.user.following, - "statuses_count": tweet.user.tweets, - "hide_collections": false, - "noindex": false, - "emojis": @[], - "roles": @[], - "fields": @[], - } + postJson["account"] = getMastoAPIUser(tweet.user, cfg) postJson["mentions"] = newJArray() # TODO: parse? postJson["tags"] = newJArray() # TODO: parse? postJson["emojis"] = newJArray() diff --git a/src/views/mastoapi.nim b/src/views/mastoapi.nim index e075de8..b37ad2f 100644 --- a/src/views/mastoapi.nim +++ b/src/views/mastoapi.nim @@ -203,3 +203,49 @@ proc getActivityStream*(user: User, cfg: Config, prefs: Prefs): JsonNode = } result = userJson + +proc getMastoAPIUser*(user: User, cfg: Config): JsonNode = + var fields: seq[JsonNode] = @[] + + if user.location.len > 0: + var location = newJObject() + location["name"] = %"Location" + location["value"] = %user.location + location["verified_at"] = newJNull() + fields.add(location) + + if user.website.len > 0: + var website = newJObject() + website["name"] = %"Website" + website["value"] = %(&"{user.website}") + website["verified_at"] = newJNull() + fields.add(website) + + var userJson = newJObject() + userJson["id"] = %user.id + userJson["username"] = %user.username + userJson["acct"] = %user.username + userJson["display_name"] = %user.fullname + userJson["locked"] = %user.protected + userJson["bot"] = %false # TODO? + userJson["discoverable"] = %true + userJson["indexable"] = %false + userJson["group"] = %false + userJson["created_at"] = %($user.joinDate) + userJson["note"] = %user.bio + userJson["url"] = %(&"{getUrlPrefix(cfg)}/{user.username}") + userJson["uri"] = %(&"{getUrlPrefix(cfg)}/{user.username}") + userJson["avatar"] = %(getUrlPrefix(cfg) & getPicUrl(user.userPic)) + userJson["avatar_static"] = %(getUrlPrefix(cfg) & getPicUrl(user.userPic)) + userJson["header"] = %(getUrlPrefix(cfg) & getPicUrl(user.banner)) + userJson["header_static"] = %(getUrlPrefix(cfg) & getPicUrl(user.banner)) + userJson["followers_count"] = %user.followers + userJson["following_count"] = %user.following + userJson["statuses_count"] = %user.tweets + userJson["hide_collections"] = %false + userJson["noindex"] = %false + userJson["emojis"] = %(@[]) + userJson["roles"] = %(@[]) + userJson["fields"] = %fields + + result = userJson