From 185ac523c2dd2a9430f57937236becbd21bd1b14 Mon Sep 17 00:00:00 2001 From: mkljczk Date: Mon, 17 Mar 2025 16:15:49 +0100 Subject: [PATCH] pl-api: Separate Akkoma support from Pleroma Signed-off-by: mkljczk --- packages/pl-api/lib/entities/instance.ts | 5 -- packages/pl-api/lib/features.ts | 76 ++++++++++++++++++++---- 2 files changed, 63 insertions(+), 18 deletions(-) diff --git a/packages/pl-api/lib/entities/instance.ts b/packages/pl-api/lib/entities/instance.ts index f9c471de2..9a4ef8e07 100644 --- a/packages/pl-api/lib/entities/instance.ts +++ b/packages/pl-api/lib/entities/instance.ts @@ -96,11 +96,6 @@ const fixVersion = (version: string) => { return version.split('rc').join('-rc'); } - // Rename Akkoma to Pleroma+akkoma - if (version.includes('Akkoma')) { - return '2.7.2 (compatible; Pleroma 2.4.50+akkoma)'; - } - // Set Takahē version to a Pleroma-like string if (version.startsWith('takahe/')) { return `0.0.0 (compatible; Takahe ${version.slice(7)})`; diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts index aefdc9956..889466380 100644 --- a/packages/pl-api/lib/features.ts +++ b/packages/pl-api/lib/features.ts @@ -176,13 +176,19 @@ const getFeatures = (instance: Instance) => { * @see GET /api/v1/pleroma/backups * @see POST /api/v1/pleroma/backups */ - accountBackups: v.software === PLEROMA, + accountBackups: any([ + v.software === AKKOMA, + v.software === PLEROMA, + ]), /** * The accounts API allows an acct instead of an ID. * @see GET /api/v1/accounts/:acct_or_id */ - accountByUsername: v.software === PLEROMA, + accountByUsername: any([ + v.software === AKKOMA, + v.software === PLEROMA, + ]), /** * Ability to create accounts. @@ -201,7 +207,10 @@ const getFeatures = (instance: Instance) => { * @see POST /api/v1/accounts/:id/unpin * @see GET /api/v1/pleroma/accounts/:id/endorsements */ - accountEndorsements: v.software === PLEROMA && gte(v.version, '2.5.0'), + accountEndorsements: any([ + v.software === AKKOMA, + v.software === PLEROMA && gte(v.version, '2.5.0'), + ]), /** * Ability to set one's location on their profile. @@ -216,6 +225,7 @@ const getFeatures = (instance: Instance) => { * @see GET /api/v1/accounts/lookup */ accountLookup: any([ + v.software === AKKOMA, v.software === DITTO, v.software === FIREFISH, v.software === GOTOSOCIAL, @@ -232,13 +242,17 @@ const getFeatures = (instance: Instance) => { * Move followers to a different ActivityPub account. * @see POST /api/pleroma/move_account */ - accountMoving: v.software === PLEROMA && gte(v.version, '2.5.0'), + accountMoving: any([ + v.software === AKKOMA, + v.software === PLEROMA && gte(v.version, '2.5.0'), + ]), /** * Ability to subscribe to notifications every time an account posts. * @see POST /api/v1/accounts/:id/follow */ accountNotifies: any([ + v.software === AKKOMA, v.software === MASTODON, v.software === PLEROMA && gte(v.version, '2.5.0'), v.software === GOTOSOCIAL, @@ -248,7 +262,10 @@ const getFeatures = (instance: Instance) => { * Ability to address a status to a list of users. * @see POST /api/v1/statuses */ - addressableLists: v.software === PLEROMA && gte(v.version, '1.0.2'), + addressableLists: any([ + v.software === AKKOMA, + v.software === PLEROMA, + ]), /** * Can display announcements set by admins. @@ -257,6 +274,7 @@ const getFeatures = (instance: Instance) => { * @see {@link https://docs.joinmastodon.org/methods/announcements/} */ announcements: any([ + v.software === AKKOMA, v.software === FIREFISH, v.software === ICESHRIMP, v.software === ICESHRIMP_NET, @@ -311,6 +329,7 @@ const getFeatures = (instance: Instance) => { * @see GET /api/v1/bookmarks */ bookmarks: any([ + v.software === AKKOMA, v.software === DITTO, v.software === FIREFISH, v.software === GOTOSOCIAL, @@ -330,6 +349,7 @@ const getFeatures = (instance: Instance) => { * @see PATCH /api/v1/accounts/update_credentials */ bots: any([ + v.software === AKKOMA, v.software === GOTOSOCIAL, v.software === ICESHRIMP, v.software === ICESHRIMP_NET, @@ -364,6 +384,7 @@ const getFeatures = (instance: Instance) => { * @see {@link https://docs.joinmastodon.org/methods/conversations/} */ conversations: any([ + v.software === AKKOMA, v.software === FIREFISH, v.software === FRIENDICA, v.software === GOTOSOCIAL && gte(v.version, '0.17.0'), @@ -378,12 +399,18 @@ const getFeatures = (instance: Instance) => { /** * @see GET /api/v1/conversations */ - conversationsByRecipients: v.software === PLEROMA, + conversationsByRecipients: any([ + v.software === AKKOMA, + v.software === PLEROMA, + ]), /** * @see POST /api/v1/statuses */ - createStatusExpiration: v.software === PLEROMA, + createStatusExpiration: any([ + v.software === AKKOMA, + v.software === PLEROMA, + ]), /** * Ability to address recipients of a status explicitly (with `to`). @@ -397,18 +424,25 @@ const getFeatures = (instance: Instance) => { /** * @see POST /api/v1/statuses */ - createStatusReplyToConversation: v.software === PLEROMA, + createStatusReplyToConversation: any([ + v.software === AKKOMA, + v.software === PLEROMA, + ]), /** * Ability to address a status to a list of users. * @see POST /api/v1/statuses */ - createStatusListScope: v.software === PLEROMA, + createStatusListScope: any([ + v.software === AKKOMA, + v.software === PLEROMA, + ]), /** * @see POST /api/v1/statuses */ createStatusLocalScope: any([ + v.software === AKKOMA, v.software === ICESHRIMP_NET, v.software === PLEROMA, ]), @@ -428,7 +462,10 @@ const getFeatures = (instance: Instance) => { /** * @see POST /api/v1/statuses */ - createStatusPreview: v.software === PLEROMA, + createStatusPreview: any([ + v.software === AKKOMA, + v.software === PLEROMA, + ]), /** * Ability to add non-standard reactions to a status. @@ -443,6 +480,7 @@ const getFeatures = (instance: Instance) => { * @see POST /api/pleroma/delete_account */ deleteAccount: any([ + v.software === AKKOMA, v.software === GOTOSOCIAL, v.software === PLEROMA, ]), @@ -461,6 +499,7 @@ const getFeatures = (instance: Instance) => { * @see PATCH /api/v1/accounts/update_credentials */ editProfile: any([ + v.software === AKKOMA, v.software === FIREFISH, v.software === FRIENDICA, v.software === GOTOSOCIAL, @@ -515,6 +554,7 @@ const getFeatures = (instance: Instance) => { * @see POST /v1/statuses/:id/unreact/:emoji */ emojiReacts: any([ + v.software === AKKOMA, v.software === FIREFISH, v.software === MITRA && gte(v.version, '2.21.0'), v.software === PLEROMA, @@ -527,6 +567,7 @@ const getFeatures = (instance: Instance) => { * @see GET /api/v1/statuses/:id/emoji_reactioned_by */ emojiReactsList: any([ + v.software === AKKOMA, v.software === PLEROMA, instance.api_versions['emoji_reaction.fedibird.pl-api'] >= 1, ]), @@ -592,6 +633,7 @@ const getFeatures = (instance: Instance) => { * @see {@link https://docs.joinmastodon.org/methods/filters/#v1} */ filters: any([ + v.software === AKKOMA, v.software === GOTOSOCIAL, v.software === PLEROMA, ]), @@ -625,10 +667,10 @@ const getFeatures = (instance: Instance) => { * @see GET /api/v1/followed_tags */ followedHashtagsList: any([ + v.software === AKKOMA, v.software === GOTOSOCIAL && gte(v.version, '0.17.0'), v.software === MASTODON && gte(v.compatVersion, '4.1.0'), v.software === PIXELFED, - v.software === PLEROMA && v.build === AKKOMA, v.software === PLEROMA && gte(v.version, '2.9.0'), v.software === TAKAHE && gte(v.version, '0.9.0'), ]), @@ -639,10 +681,10 @@ const getFeatures = (instance: Instance) => { * @see POST /api/v1/tags/:name/unfollow */ followHashtags: any([ + v.software === AKKOMA, v.software === GOTOSOCIAL && gte(v.version, '0.17.0'), v.software === MASTODON && gte(v.compatVersion, '4.0.0'), v.software === PIXELFED, - v.software === PLEROMA && v.build === AKKOMA, v.software === PLEROMA && gte(v.version, '2.9.0'), v.software === TAKAHE && gte(v.version, '0.9.0'), ]), @@ -652,6 +694,7 @@ const getFeatures = (instance: Instance) => { * @see PATCH /api/v1/accounts/update_credentials */ followRequests: any([ + v.software === AKKOMA, v.software === FIREFISH, v.software === GOTOSOCIAL, v.software === MASTODON, @@ -665,6 +708,7 @@ const getFeatures = (instance: Instance) => { * @see GET /api/pleroma/frontend_configurations */ frontendConfigurations: any([ + v.software === AKKOMA, v.software === DITTO, v.software === ICESHRIMP_NET, v.software === PLEROMA, @@ -747,6 +791,7 @@ const getFeatures = (instance: Instance) => { * @see PATCH /api/v1/accounts/update_credentials */ hideNetwork: any([ + v.software === AKKOMA, v.software === GOTOSOCIAL && gte(v.version, '0.15.0'), v.software === PLEROMA, ]), @@ -757,6 +802,7 @@ const getFeatures = (instance: Instance) => { * @see POST /api/v1/import */ importBlocks: any([ + v.software === AKKOMA, v.software === GOTOSOCIAL && gte(v.version, '0.17.0'), v.software === PLEROMA, ]), @@ -768,6 +814,7 @@ const getFeatures = (instance: Instance) => { */ importFollows: any([ + v.software === AKKOMA, v.software === GOTOSOCIAL && gte(v.version, '0.17.0'), v.software === PLEROMA, ]), @@ -776,7 +823,10 @@ const getFeatures = (instance: Instance) => { * Import a .csv file with a list of muted users. * @see POST /api/pleroma/mutes_import */ - importMutes: v.software === PLEROMA, + importMutes: any([ + v.software === AKKOMA, + v.software === PLEROMA, + ]), /** * Allow to specify mode of data import to either `merge` or `overwrite`.