2022-03-12 21:01:00 +00:00
|
|
|
/**
|
|
|
|
* Instance normalizer:
|
|
|
|
* Converts API instances into our internal format.
|
|
|
|
* @see {@link https://docs.joinmastodon.org/entities/instance/}
|
|
|
|
*/
|
2022-03-09 22:00:43 +00:00
|
|
|
import {
|
|
|
|
Map as ImmutableMap,
|
|
|
|
List as ImmutableList,
|
|
|
|
Record as ImmutableRecord,
|
2022-03-17 02:33:09 +00:00
|
|
|
fromJS,
|
2022-03-09 22:00:43 +00:00
|
|
|
} from 'immutable';
|
2022-02-23 16:24:36 +00:00
|
|
|
|
|
|
|
import { parseVersion, PLEROMA } from 'soapbox/utils/features';
|
2022-02-28 02:21:39 +00:00
|
|
|
import { mergeDefined } from 'soapbox/utils/normalizers';
|
2022-02-23 16:24:36 +00:00
|
|
|
import { isNumber } from 'soapbox/utils/numbers';
|
|
|
|
|
|
|
|
// Use Mastodon defaults
|
2022-03-12 21:01:00 +00:00
|
|
|
// https://docs.joinmastodon.org/entities/instance/
|
2022-03-17 02:15:38 +00:00
|
|
|
export const InstanceRecord = ImmutableRecord({
|
2022-03-09 05:25:30 +00:00
|
|
|
approval_required: false,
|
2022-04-26 18:36:08 +00:00
|
|
|
contact_account: ImmutableMap<string, any>(),
|
|
|
|
configuration: ImmutableMap<string, any>({
|
|
|
|
media_attachments: ImmutableMap<string, any>(),
|
2022-11-21 17:21:02 +00:00
|
|
|
chats: ImmutableMap<string, number>({
|
2023-02-08 18:24:41 +00:00
|
|
|
max_characters: 5000,
|
|
|
|
max_media_attachments: 1,
|
2022-11-21 17:21:02 +00:00
|
|
|
}),
|
2022-04-26 18:36:08 +00:00
|
|
|
polls: ImmutableMap<string, number>({
|
2022-02-23 16:24:36 +00:00
|
|
|
max_options: 4,
|
|
|
|
max_characters_per_option: 25,
|
|
|
|
min_expiration: 300,
|
|
|
|
max_expiration: 2629746,
|
|
|
|
}),
|
2022-04-26 18:36:08 +00:00
|
|
|
statuses: ImmutableMap<string, number>({
|
2022-03-09 05:25:30 +00:00
|
|
|
max_characters: 500,
|
|
|
|
max_media_attachments: 4,
|
|
|
|
}),
|
2023-03-08 18:00:28 +00:00
|
|
|
groups: ImmutableMap<string, number>({
|
|
|
|
max_characters_name: 50,
|
2023-04-05 14:11:11 +00:00
|
|
|
max_characters_description: 160,
|
2023-03-08 18:00:28 +00:00
|
|
|
}),
|
2022-03-09 05:25:30 +00:00
|
|
|
}),
|
|
|
|
description: '',
|
|
|
|
description_limit: 1500,
|
|
|
|
email: '',
|
2022-03-26 19:23:29 +00:00
|
|
|
feature_quote: false,
|
2022-03-09 05:25:30 +00:00
|
|
|
fedibird_capabilities: ImmutableList(),
|
|
|
|
invites_enabled: false,
|
|
|
|
languages: ImmutableList(),
|
2022-06-10 17:56:22 +00:00
|
|
|
login_message: '',
|
2022-04-26 18:36:08 +00:00
|
|
|
pleroma: ImmutableMap<string, any>({
|
|
|
|
metadata: ImmutableMap<string, any>({
|
2022-03-09 05:25:30 +00:00
|
|
|
account_activation_required: false,
|
|
|
|
birthday_min_age: 0,
|
|
|
|
birthday_required: false,
|
|
|
|
features: ImmutableList(),
|
2022-04-26 18:36:08 +00:00
|
|
|
federation: ImmutableMap<string, any>({
|
2022-03-09 05:25:30 +00:00
|
|
|
enabled: true,
|
|
|
|
exclusions: false,
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
stats: ImmutableMap(),
|
2022-02-23 16:24:36 +00:00
|
|
|
}),
|
2022-03-09 05:25:30 +00:00
|
|
|
registrations: false,
|
|
|
|
rules: ImmutableList(),
|
|
|
|
short_description: '',
|
2022-04-26 18:36:08 +00:00
|
|
|
stats: ImmutableMap<string, number>({
|
2022-03-09 22:02:50 +00:00
|
|
|
domain_count: 0,
|
|
|
|
status_count: 0,
|
|
|
|
user_count: 0,
|
|
|
|
}),
|
2023-08-27 04:24:18 +00:00
|
|
|
nostr: ImmutableMap<string, any>({
|
|
|
|
relay: undefined as string | undefined,
|
|
|
|
pubkey: undefined as string | undefined,
|
|
|
|
}),
|
2022-03-09 05:25:30 +00:00
|
|
|
title: '',
|
|
|
|
thumbnail: '',
|
|
|
|
uri: '',
|
2022-04-26 18:36:08 +00:00
|
|
|
urls: ImmutableMap<string, string>(),
|
2022-02-23 16:24:36 +00:00
|
|
|
version: '0.0.0',
|
|
|
|
});
|
|
|
|
|
|
|
|
// Build Mastodon configuration from Pleroma instance
|
2022-03-11 18:14:32 +00:00
|
|
|
const pleromaToMastodonConfig = (instance: ImmutableMap<string, any>) => {
|
2022-02-23 16:24:36 +00:00
|
|
|
return ImmutableMap({
|
|
|
|
statuses: ImmutableMap({
|
|
|
|
max_characters: instance.get('max_toot_chars'),
|
|
|
|
}),
|
|
|
|
polls: ImmutableMap({
|
|
|
|
max_options: instance.getIn(['poll_limits', 'max_options']),
|
|
|
|
max_characters_per_option: instance.getIn(['poll_limits', 'max_option_chars']),
|
|
|
|
min_expiration: instance.getIn(['poll_limits', 'min_expiration']),
|
|
|
|
max_expiration: instance.getIn(['poll_limits', 'max_expiration']),
|
|
|
|
}),
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
// Get the software's default attachment limit
|
2022-03-24 19:27:27 +00:00
|
|
|
const getAttachmentLimit = (software: string | null) => software === PLEROMA ? Infinity : 4;
|
2022-02-23 16:24:36 +00:00
|
|
|
|
2022-03-17 03:41:25 +00:00
|
|
|
// Normalize version
|
|
|
|
const normalizeVersion = (instance: ImmutableMap<string, any>) => {
|
|
|
|
return instance.update('version', '0.0.0', version => {
|
|
|
|
// Handle Mastodon release candidates
|
2023-09-20 17:10:49 +00:00
|
|
|
if (new RegExp(/[0-9.]+rc[0-9]+/g).test(version)) {
|
2022-03-17 03:41:25 +00:00
|
|
|
return version.split('rc').join('-rc');
|
|
|
|
} else {
|
|
|
|
return version;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2022-12-27 20:42:17 +00:00
|
|
|
/** Rename Akkoma to Pleroma+akkoma */
|
2022-12-27 22:56:33 +00:00
|
|
|
const fixAkkoma = (instance: ImmutableMap<string, any>) => {
|
2022-12-27 20:42:17 +00:00
|
|
|
const version: string = instance.get('version', '');
|
|
|
|
|
2022-12-27 22:56:33 +00:00
|
|
|
if (version.includes('Akkoma')) {
|
|
|
|
return instance.set('version', '2.7.2 (compatible; Pleroma 2.4.50+akkoma)');
|
2022-12-27 20:42:17 +00:00
|
|
|
} else {
|
|
|
|
return instance;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2023-01-03 22:42:15 +00:00
|
|
|
/** Set Takahē version to a Pleroma-like string */
|
2022-12-27 22:56:33 +00:00
|
|
|
const fixTakahe = (instance: ImmutableMap<string, any>) => {
|
2022-11-09 04:34:17 +00:00
|
|
|
const version: string = instance.get('version', '');
|
|
|
|
|
2022-12-27 22:56:33 +00:00
|
|
|
if (version.startsWith('takahe/')) {
|
|
|
|
return instance.set('version', `0.0.0 (compatible; Takahe ${version.slice(7)})`);
|
2022-11-09 04:34:17 +00:00
|
|
|
} else {
|
|
|
|
return instance;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2022-02-23 16:24:36 +00:00
|
|
|
// Normalize instance (Pleroma, Mastodon, etc.) to Mastodon's format
|
2022-03-17 02:33:09 +00:00
|
|
|
export const normalizeInstance = (instance: Record<string, any>) => {
|
2022-03-09 05:25:30 +00:00
|
|
|
return InstanceRecord(
|
2022-03-17 02:33:09 +00:00
|
|
|
ImmutableMap(fromJS(instance)).withMutations((instance: ImmutableMap<string, any>) => {
|
|
|
|
const { software } = parseVersion(instance.get('version'));
|
|
|
|
const mastodonConfig = pleromaToMastodonConfig(instance);
|
|
|
|
|
2022-03-09 05:25:30 +00:00
|
|
|
// Merge configuration
|
|
|
|
instance.update('configuration', ImmutableMap(), configuration => (
|
|
|
|
configuration.mergeDeepWith(mergeDefined, mastodonConfig)
|
|
|
|
));
|
2022-02-23 16:24:36 +00:00
|
|
|
|
2022-03-09 05:25:30 +00:00
|
|
|
// If max attachments isn't set, check the backend software
|
|
|
|
instance.updateIn(['configuration', 'statuses', 'max_media_attachments'], value => {
|
|
|
|
return isNumber(value) ? value : getAttachmentLimit(software);
|
|
|
|
});
|
2022-02-23 16:24:36 +00:00
|
|
|
|
2023-01-18 21:41:54 +00:00
|
|
|
// Urls can't be null, fix for Friendica
|
|
|
|
if (instance.get('urls') === null) instance.delete('urls');
|
|
|
|
|
2022-03-17 03:41:25 +00:00
|
|
|
// Normalize version
|
|
|
|
normalizeVersion(instance);
|
2022-12-27 20:42:17 +00:00
|
|
|
fixTakahe(instance);
|
2022-11-09 04:34:17 +00:00
|
|
|
fixAkkoma(instance);
|
2022-03-17 03:41:25 +00:00
|
|
|
|
2022-03-11 00:08:41 +00:00
|
|
|
// Merge defaults
|
2022-03-09 05:25:30 +00:00
|
|
|
instance.mergeDeepWith(mergeDefined, InstanceRecord());
|
|
|
|
}),
|
|
|
|
);
|
2022-02-23 16:24:36 +00:00
|
|
|
};
|