2021-04-09 00:22:17 +00:00
|
|
|
use serde::Serialize;
|
|
|
|
|
2023-04-25 13:49:35 +00:00
|
|
|
use fedimovies_config::{Config, RegistrationType, REEF_VERSION};
|
|
|
|
use fedimovies_utils::markdown::markdown_to_html;
|
2023-02-18 23:52:48 +00:00
|
|
|
|
2023-03-14 15:17:56 +00:00
|
|
|
use crate::mastodon_api::MASTODON_API_VERSION;
|
2023-02-12 18:54:29 +00:00
|
|
|
use crate::media::SUPPORTED_MEDIA_TYPES;
|
2023-04-07 23:50:50 +00:00
|
|
|
use crate::validators::posts::ATTACHMENT_LIMIT;
|
2021-04-09 00:22:17 +00:00
|
|
|
|
2022-10-04 20:50:00 +00:00
|
|
|
#[derive(Serialize)]
|
|
|
|
struct InstanceStats {
|
|
|
|
user_count: i64,
|
|
|
|
status_count: i64,
|
|
|
|
domain_count: i64,
|
|
|
|
}
|
|
|
|
|
2023-01-06 16:46:59 +00:00
|
|
|
#[derive(Serialize)]
|
|
|
|
struct InstanceStatusLimits {
|
|
|
|
max_characters: usize,
|
|
|
|
max_media_attachments: usize,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Serialize)]
|
|
|
|
struct InstanceMediaLimits {
|
2023-01-22 23:45:43 +00:00
|
|
|
supported_mime_types: Vec<String>,
|
2023-01-06 16:46:59 +00:00
|
|
|
image_size_limit: usize,
|
|
|
|
}
|
|
|
|
|
2023-04-26 20:10:34 +00:00
|
|
|
#[derive(Serialize, Default)]
|
|
|
|
struct PollsLimits {
|
|
|
|
max_options: usize,
|
|
|
|
max_option_characters_per_option: usize,
|
|
|
|
min_expiration: usize,
|
|
|
|
max_expiration: usize,
|
|
|
|
}
|
|
|
|
|
2023-01-06 16:46:59 +00:00
|
|
|
#[derive(Serialize)]
|
|
|
|
struct InstanceConfiguration {
|
|
|
|
statuses: InstanceStatusLimits,
|
|
|
|
media_attachments: InstanceMediaLimits,
|
2023-04-26 20:10:34 +00:00
|
|
|
polls: PollsLimits,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Serialize, Default)]
|
|
|
|
struct Urls {
|
|
|
|
streaming_api: Option<String>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Serialize)]
|
|
|
|
struct Rule {
|
|
|
|
id: String,
|
|
|
|
text: String,
|
2023-01-06 16:46:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// https://docs.joinmastodon.org/entities/V1_Instance/
|
2021-04-09 00:22:17 +00:00
|
|
|
#[derive(Serialize)]
|
2021-11-10 14:32:27 +00:00
|
|
|
pub struct InstanceInfo {
|
2021-04-09 00:22:17 +00:00
|
|
|
uri: String,
|
|
|
|
title: String,
|
|
|
|
short_description: String,
|
|
|
|
description: String,
|
2022-12-22 20:44:32 +00:00
|
|
|
description_source: String,
|
2021-04-09 00:22:17 +00:00
|
|
|
version: String,
|
|
|
|
registrations: bool,
|
2023-01-25 02:13:26 +00:00
|
|
|
approval_required: bool,
|
|
|
|
invites_enabled: bool,
|
2022-10-04 20:50:00 +00:00
|
|
|
stats: InstanceStats,
|
2023-01-06 16:46:59 +00:00
|
|
|
configuration: InstanceConfiguration,
|
2023-04-26 20:10:34 +00:00
|
|
|
thumbnail: Option<String>,
|
|
|
|
email: String,
|
|
|
|
languages: Vec<String>,
|
|
|
|
rules: Vec<Rule>,
|
|
|
|
urls: Option<Urls>,
|
2021-04-09 00:22:17 +00:00
|
|
|
|
|
|
|
login_message: String,
|
2023-02-04 21:47:13 +00:00
|
|
|
post_character_limit: usize, // deprecated
|
2021-04-09 00:22:17 +00:00
|
|
|
ipfs_gateway_url: Option<String>,
|
|
|
|
}
|
|
|
|
|
2022-02-08 01:12:36 +00:00
|
|
|
fn get_full_api_version(version: &str) -> String {
|
2023-04-26 20:10:34 +00:00
|
|
|
format!(
|
|
|
|
"{0} (compatible; FediMovies {1})",
|
|
|
|
MASTODON_API_VERSION, version,
|
|
|
|
)
|
2022-02-08 01:12:36 +00:00
|
|
|
}
|
|
|
|
|
2022-06-28 23:02:31 +00:00
|
|
|
impl InstanceInfo {
|
2023-04-24 15:35:32 +00:00
|
|
|
pub fn create(config: &Config, user_count: i64, post_count: i64, peer_count: i64) -> Self {
|
2021-04-09 00:22:17 +00:00
|
|
|
Self {
|
2022-11-24 01:51:43 +00:00
|
|
|
uri: config.instance().hostname(),
|
2021-04-09 00:22:17 +00:00
|
|
|
title: config.instance_title.clone(),
|
|
|
|
short_description: config.instance_short_description.clone(),
|
2022-12-22 20:44:32 +00:00
|
|
|
description: markdown_to_html(&config.instance_description),
|
|
|
|
description_source: config.instance_description.clone(),
|
2023-04-08 23:34:07 +00:00
|
|
|
version: get_full_api_version(REEF_VERSION),
|
2023-04-24 15:35:32 +00:00
|
|
|
registrations: config.registration.registration_type != RegistrationType::Invite,
|
2023-01-25 02:13:26 +00:00
|
|
|
approval_required: false,
|
2023-04-24 15:35:32 +00:00
|
|
|
invites_enabled: config.registration.registration_type == RegistrationType::Invite,
|
2022-10-04 20:50:00 +00:00
|
|
|
stats: InstanceStats {
|
|
|
|
user_count,
|
|
|
|
status_count: post_count,
|
|
|
|
domain_count: peer_count,
|
|
|
|
},
|
2023-01-06 16:46:59 +00:00
|
|
|
configuration: InstanceConfiguration {
|
|
|
|
statuses: InstanceStatusLimits {
|
2023-02-04 21:47:13 +00:00
|
|
|
max_characters: config.limits.posts.character_limit,
|
2023-04-07 23:50:50 +00:00
|
|
|
max_media_attachments: ATTACHMENT_LIMIT,
|
2023-01-06 16:46:59 +00:00
|
|
|
},
|
|
|
|
media_attachments: InstanceMediaLimits {
|
2023-04-24 15:35:32 +00:00
|
|
|
supported_mime_types: SUPPORTED_MEDIA_TYPES
|
|
|
|
.iter()
|
|
|
|
.map(|media_type| media_type.to_string())
|
|
|
|
.collect(),
|
2023-03-14 15:17:56 +00:00
|
|
|
image_size_limit: config.limits.media.file_size_limit,
|
2023-01-06 16:46:59 +00:00
|
|
|
},
|
2023-04-26 20:10:34 +00:00
|
|
|
polls: Default::default(),
|
2023-01-06 16:46:59 +00:00
|
|
|
},
|
2023-04-26 20:10:34 +00:00
|
|
|
thumbnail: None,
|
|
|
|
email: "".to_string(),
|
|
|
|
languages: vec![],
|
|
|
|
rules: vec![],
|
|
|
|
urls: None,
|
2021-04-09 00:22:17 +00:00
|
|
|
login_message: config.login_message.clone(),
|
2023-02-04 21:47:13 +00:00
|
|
|
post_character_limit: config.limits.posts.character_limit,
|
2021-04-09 00:22:17 +00:00
|
|
|
ipfs_gateway_url: config.ipfs_gateway_url.clone(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|