Refactor room_version support code

Fix advertising unsupported room versions
This commit is contained in:
dasha_uwu
2026-02-09 00:16:56 +05:00
committed by Jason Volk
parent d6ae4e5ff2
commit 4bba40982c
12 changed files with 79 additions and 93 deletions

View File

@@ -4,7 +4,7 @@ use either::Either;
use itertools::Itertools;
use super::{DEPRECATED_KEYS, IdentityProvider};
use crate::{Config, Err, Result, Server, debug, debug_info, error, warn};
use crate::{Config, Err, Result, debug, debug_info, error, warn};
/// Performs check() with additional checks specific to reloading old config
/// with new config.
@@ -294,9 +294,7 @@ pub fn check(config: &Config) -> Result {
));
}
if !Server::available_room_versions()
.any(|(version, _)| version == config.default_room_version)
{
if !config.supported_room_version(&config.default_room_version) {
return Err!(Config(
"default_room_version",
"Room version {:?} is not available",

View File

@@ -1,6 +1,7 @@
pub mod check;
pub mod manager;
pub mod proxy;
pub mod room_version;
use std::{
collections::{BTreeMap, BTreeSet},

View File

@@ -0,0 +1,56 @@
use ruma::{RoomVersionId, api::client::discovery::get_capabilities::v3::RoomVersionStability};
use crate::Config;
/// Partially supported non-compliant room versions
pub const UNSTABLE_ROOM_VERSIONS: &[RoomVersionId] =
&[RoomVersionId::V2, RoomVersionId::V3, RoomVersionId::V4, RoomVersionId::V5];
/// Supported and stable room versions
pub const STABLE_ROOM_VERSIONS: &[RoomVersionId] = &[
RoomVersionId::V6,
RoomVersionId::V7,
RoomVersionId::V8,
RoomVersionId::V9,
RoomVersionId::V10,
RoomVersionId::V11,
RoomVersionId::V12,
];
/// Experimental and prototype room versions under development.
pub const EXPERIMENTAL_ROOM_VERSIONS: &[RoomVersionId] = &[];
impl Config {
#[inline]
#[must_use]
pub fn supported_room_version(&self, version: &RoomVersionId) -> bool {
self.supported_room_versions()
.any(|(supported_version, _)| &supported_version == version)
}
#[inline]
pub fn supported_room_versions(
&self,
) -> impl Iterator<Item = (RoomVersionId, RoomVersionStability)> + '_ {
let stable_room_versions = STABLE_ROOM_VERSIONS
.iter()
.cloned()
.map(|version| (version, RoomVersionStability::Stable));
let unstable_room_versions = UNSTABLE_ROOM_VERSIONS
.iter()
.filter(|_| self.allow_unstable_room_versions)
.cloned()
.map(|version| (version, RoomVersionStability::Unstable));
let experimental_room_versions = EXPERIMENTAL_ROOM_VERSIONS
.iter()
.filter(|_| self.allow_experimental_room_versions)
.cloned()
.map(|version| (version, RoomVersionStability::Unstable));
stable_room_versions
.chain(unstable_room_versions)
.chain(experimental_room_versions)
}
}

View File

@@ -2,7 +2,6 @@
//! etc information which can be queried by admins or used by developers.
pub mod cargo;
pub mod room_version;
pub mod rustc;
pub mod version;

View File

@@ -1,72 +0,0 @@
//! Room version support
use std::iter::once;
use ruma::{RoomVersionId, api::client::discovery::get_capabilities::v3::RoomVersionStability};
use crate::{at, is_equal_to};
/// Partially supported non-compliant room versions
pub const UNSTABLE_ROOM_VERSIONS: &[RoomVersionId] =
&[RoomVersionId::V2, RoomVersionId::V3, RoomVersionId::V4, RoomVersionId::V5];
/// Supported and stable room versions
pub const STABLE_ROOM_VERSIONS: &[RoomVersionId] = &[
RoomVersionId::V6,
RoomVersionId::V7,
RoomVersionId::V8,
RoomVersionId::V9,
RoomVersionId::V10,
RoomVersionId::V11,
RoomVersionId::V12,
];
/// Experimental and prototype room versions under development.
pub const EXPERIMENTAL_ROOM_VERSIONS: &[RoomVersionId] = &[];
type RoomVersion = (RoomVersionId, RoomVersionStability);
impl crate::Server {
#[inline]
pub fn supported_room_version(&self, version: &RoomVersionId) -> bool {
self.supported_room_versions()
.any(is_equal_to!(*version))
}
#[inline]
pub fn supported_room_versions(&self) -> impl Iterator<Item = RoomVersionId> + '_ {
let experimental_room_versions = EXPERIMENTAL_ROOM_VERSIONS
.iter()
.cloned()
.zip(once(RoomVersionStability::Unstable).cycle())
.filter(|_| self.config.allow_experimental_room_versions);
Self::available_room_versions()
.filter(|(_, stability)| self.supported_stability(stability))
.chain(experimental_room_versions)
.map(at!(0))
}
#[inline]
pub fn available_room_versions() -> impl Iterator<Item = RoomVersion> {
available_room_versions()
}
#[inline]
fn supported_stability(&self, stability: &RoomVersionStability) -> bool {
self.config.allow_unstable_room_versions || *stability == RoomVersionStability::Stable
}
}
pub fn available_room_versions() -> impl Iterator<Item = RoomVersion> {
let unstable_room_versions = UNSTABLE_ROOM_VERSIONS
.iter()
.cloned()
.zip(once(RoomVersionStability::Unstable).cycle());
STABLE_ROOM_VERSIONS
.iter()
.cloned()
.zip(once(RoomVersionStability::Stable).cycle())
.chain(unstable_room_versions)
}