diff --git a/index.js b/index.js index 98aa545..b53cdb7 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,7 @@ import express from "express"; import { setupFederation, buildPersonActor } from "./lib/federation-setup.js"; import { createMastodonRouter } from "./lib/mastodon/router.js"; +import { setLocalIdentity } from "./lib/mastodon/entities/status.js"; import { initRedisCache } from "./lib/redis-cache.js"; import { lookupWithSecurity } from "./lib/lookup-helpers.js"; import { @@ -1492,6 +1493,9 @@ export default class ActivityPubEndpoint { routesPublic: this.contentNegotiationRoutes, }); + // Set local identity for own-post detection in status serialization + setLocalIdentity(this._publicationUrl, this.options.actor?.handle || "user"); + // Mastodon Client API — virtual endpoint at root // Mastodon-compatible clients (Phanpy, Elk, etc.) expect /api/v1/*, // /api/v2/*, /oauth/* at the domain root, not under /activitypub. diff --git a/lib/mastodon/entities/status.js b/lib/mastodon/entities/status.js index b561675..73fbb0f 100644 --- a/lib/mastodon/entities/status.js +++ b/lib/mastodon/entities/status.js @@ -16,6 +16,21 @@ import { serializeAccount } from "./account.js"; import { sanitizeHtml } from "./sanitize.js"; +// Module-level defaults set once at startup via setLocalIdentity() +let _localPublicationUrl = ""; +let _localHandle = ""; + +/** + * Set the local identity for own-post detection. + * Called once during plugin init. + * @param {string} publicationUrl - e.g. "https://rmendes.net/" + * @param {string} handle - e.g. "rick" + */ +export function setLocalIdentity(publicationUrl, handle) { + _localPublicationUrl = publicationUrl; + _localHandle = handle; +} + /** * Serialize an ap_timeline document as a Mastodon Status entity. * @@ -207,7 +222,11 @@ export function serializeStatus(item, { baseUrl, favouritedIds, rebloggedIds, bo reblog: null, application: null, account: item.author - ? serializeAccount(item.author, { baseUrl }) + ? serializeAccount(item.author, { + baseUrl, + isLocal: !!(_localPublicationUrl && item.author.url === _localPublicationUrl), + handle: _localHandle, + }) : null, media_attachments: mediaAttachments, mentions,