2024-02-25 22:16:08 -05:00
use std ::collections ::BTreeMap ;
2022-01-13 12:06:20 +01:00
2025-02-23 01:17:45 -05:00
use axum ::{ Json , extract ::State , response ::IntoResponse };
2025-04-04 03:30:13 +00:00
use conduwuit ::Result ;
2024-08-08 17:18:30 +00:00
use futures ::StreamExt ;
2026-04-12 11:12:43 -04:00
use ruma ::{ api ::client ::discovery ::get_supported_versions , assign };
2022-04-06 21:31:29 +02:00
2025-04-04 03:30:13 +00:00
use crate ::Ruma ;
2020-07-30 18:14:47 +02:00
2020-07-31 14:40:28 +02:00
/// # `GET /_matrix/client/versions`
///
/// Get the versions of the specification and unstable features supported by
/// this server.
///
/// - Versions take the form MAJOR.MINOR.PATCH
/// - Only the latest PATCH release will be reported for each MAJOR.MINOR value
2021-08-31 19:14:37 +02:00
/// - Unstable features are namespaced and may include version information in
/// their name
2020-07-31 14:40:28 +02:00
///
/// Note: Unstable features are used while developing new features. Clients
/// should avoid using unstable features in their stable releases
2024-04-22 23:48:57 -04:00
pub ( crate ) async fn get_supported_versions_route (
2022-12-14 13:09:10 +01:00
_body : Ruma < get_supported_versions ::Request > ,
2022-01-22 16:58:32 +01:00
) -> Result < get_supported_versions ::Response > {
2026-04-12 11:12:43 -04:00
let versions = vec! [
"r0.0.1" . to_owned (),
"r0.1.0" . to_owned (),
"r0.2.0" . to_owned (),
"r0.3.0" . to_owned (),
"r0.4.0" . to_owned (),
"r0.5.0" . to_owned (),
"r0.6.0" . to_owned (),
"r0.6.1" . to_owned (),
"v1.1" . to_owned (),
"v1.2" . to_owned (),
"v1.3" . to_owned (),
"v1.4" . to_owned (),
"v1.5" . to_owned (),
"v1.8" . to_owned (),
"v1.11" . to_owned (),
"v1.12" . to_owned (),
"v1.13" . to_owned (),
"v1.14" . to_owned (),
];
2020-07-30 18:14:47 +02:00
2026-04-12 11:12:43 -04:00
let unstable_features = BTreeMap ::from_iter ([
( "org.matrix.e2e_cross_signing" . to_owned (), true ),
( "org.matrix.msc2285.stable" . to_owned (), true ), /* private read receipts (https://github.com/matrix-org/matrix-spec-proposals/pull/2285) */
2026-05-09 17:01:07 -04:00
( "uk.half-shot.msc2666.query_mutual_rooms.stable" . to_owned (), true ), /* query mutual rooms (https://github.com/matrix-org/matrix-spec-proposals/pull/2666) */
2026-04-12 11:12:43 -04:00
( "org.matrix.msc2836" . to_owned (), true ), /* threading/threads (https://github.com/matrix-org/matrix-spec-proposals/pull/2836) */
( "org.matrix.msc2946" . to_owned (), true ), /* spaces/hierarchy summaries (https://github.com/matrix-org/matrix-spec-proposals/pull/2946) */
( "org.matrix.msc3026.busy_presence" . to_owned (), true ), /* busy presence status (https://github.com/matrix-org/matrix-spec-proposals/pull/3026) */
( "org.matrix.msc3814" . to_owned (), true ), /* dehydrated devices */
( "org.matrix.msc3827" . to_owned (), true ), /* filtering of /publicRooms by room type (https://github.com/matrix-org/matrix-spec-proposals/pull/3827) */
( "org.matrix.msc3952_intentional_mentions" . to_owned (), true ), /* intentional mentions (https://github.com/matrix-org/matrix-spec-proposals/pull/3952) */
( "org.matrix.msc3916.stable" . to_owned (), true ), /* authenticated media (https://github.com/matrix-org/matrix-spec-proposals/pull/3916) */
( "org.matrix.msc4180" . to_owned (), true ), /* stable flag for 3916 (https://github.com/matrix-org/matrix-spec-proposals/pull/4180) */
( "uk.tcpip.msc4133" . to_owned (), true ), /* Extending User Profile API with Key:Value Pairs (https://github.com/matrix-org/matrix-spec-proposals/pull/4133) */
( "us.cloke.msc4175" . to_owned (), true ), /* Profile field for user time zone (https://github.com/matrix-org/matrix-spec-proposals/pull/4175) */
( "org.matrix.simplified_msc3575" . to_owned (), true ), /* Simplified Sliding sync (https://github.com/matrix-org/matrix-spec-proposals/pull/4186) */
( "uk.timedout.msc4323" . to_owned (), true ), /* agnostic suspend (https://github.com/matrix-org/matrix-spec-proposals/pull/4323) */
( "org.matrix.msc4155" . to_owned (), true ), /* invite filtering (https://github.com/matrix-org/matrix-spec-proposals/pull/4155) */
]);
Ok ( assign! ( get_supported_versions ::Response ::new ( versions ), { unstable_features }))
2020-07-30 18:14:47 +02:00
}
2023-07-06 10:32:25 +02:00
2024-03-27 10:17:11 -04:00
/// # `GET /_conduwuit/server_version`
///
/// Conduwuit-specific API to get the server version, results akin to
/// `/_matrix/federation/v1/version`
2024-04-22 23:48:57 -04:00
pub ( crate ) async fn conduwuit_server_version () -> Result < impl IntoResponse > {
2024-03-27 10:17:11 -04:00
Ok ( Json ( serde_json ::json! ({
2024-12-14 21:58:01 -05:00
"name" : conduwuit ::version ::name (),
"version" : conduwuit ::version ::version (),
2024-01-07 21:24:55 -05:00
})))
}
2024-05-23 11:26:27 -04:00
/// # `GET /_conduwuit/local_user_count`
///
/// conduwuit-specific API to return the amount of users registered on this
/// homeserver. Endpoint is disabled if federation is disabled for privacy. This
2026-05-05 09:09:38 -04:00
/// only includes active users (not deactivated, etc)
2024-12-15 00:05:47 -05:00
pub ( crate ) async fn conduwuit_local_user_count (
State ( services ) : State < crate ::State > ,
) -> Result < impl IntoResponse > {
2024-08-08 17:18:30 +00:00
let user_count = services . users . list_local_users (). count (). await ;
2024-05-23 11:26:27 -04:00
Ok ( Json ( serde_json ::json! ({
"count" : user_count
})))
}