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