From ca8e5b013bfef1647eabe4a428b6c68379f588ba Mon Sep 17 00:00:00 2001 From: "NG (Graham)" Date: Mon, 2 Mar 2026 19:53:30 -0500 Subject: [PATCH] Add maintenance mode lockout during login --- rc_core/src/persist/config/cubes_json.rs | 1 + rc_core/src/persist/config/traits.rs | 1 + rc_core/src/persist/settings.rs | 3 +++ rc_services_room/src/operations/maintenancer.rs | 15 ++++++++++++--- rc_services_room/src/operations/mod.rs | 2 +- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/rc_core/src/persist/config/cubes_json.rs b/rc_core/src/persist/config/cubes_json.rs index d78db9f..7621709 100644 --- a/rc_core/src/persist/config/cubes_json.rs +++ b/rc_core/src/persist/config/cubes_json.rs @@ -300,6 +300,7 @@ impl super::ConfigProvider for CubeConfig { intercom_url: self.settings.server.intercom_url.trim_end_matches('/').to_owned(), minimum_version: self.settings.server.min_version as i32, dos_protect: self.settings.server.dos_protection, + maintenance_message: self.settings.server.maintenance_message.clone(), } } diff --git a/rc_core/src/persist/config/traits.rs b/rc_core/src/persist/config/traits.rs index 569cb84..3016435 100644 --- a/rc_core/src/persist/config/traits.rs +++ b/rc_core/src/persist/config/traits.rs @@ -97,6 +97,7 @@ pub struct ServerConfig { pub intercom_url: String, pub minimum_version: i32, pub dos_protect: bool, + pub maintenance_message: Option, } pub enum QueueChangeMode { diff --git a/rc_core/src/persist/settings.rs b/rc_core/src/persist/settings.rs index f75c558..da1871f 100644 --- a/rc_core/src/persist/settings.rs +++ b/rc_core/src/persist/settings.rs @@ -102,6 +102,8 @@ pub struct ServerSettings { pub min_version: u32, #[serde(default = "default_true")] pub dos_protection: bool, + #[serde(default)] + pub maintenance_message: Option, } #[derive(Serialize, Deserialize, Clone, Debug, Default)] @@ -130,6 +132,7 @@ fn default_server_conf() -> ServerSettings { wiki_url: default_wiki_url(), min_version: default_game_version(), dos_protection: default_true(), + maintenance_message: None, } } diff --git a/rc_services_room/src/operations/maintenancer.rs b/rc_services_room/src/operations/maintenancer.rs index d694cd3..c8805c8 100644 --- a/rc_services_room/src/operations/maintenancer.rs +++ b/rc_services_room/src/operations/maintenancer.rs @@ -2,15 +2,18 @@ use std::collections::HashMap; use polariton_server::operations::{Operation, OperationCode}; -pub struct MaintenanceModeTeller; +pub struct MaintenanceModeTeller { + message: Option, +} impl Operation for MaintenanceModeTeller { type User = crate::UserTy; fn handle(&self, _: polariton::operation::ParameterTable, _: &Self::User) -> polariton::operation::OperationResponse { let mut resp_params = HashMap::new(); - resp_params.insert(20 /* is in maintenance mode? */, polariton::operation::Typed::Bool(false)); - resp_params.insert(19 /* maintenace mode message */, polariton::operation::Typed::Str("OpenJam's servers are currently undergoing maintenance".into())); + resp_params.insert(20 /* is in maintenance mode? */, polariton::operation::Typed::Bool(self.message.is_some())); + let message = self.message.clone().unwrap_or_default(); + resp_params.insert(19 /* maintenace mode message */, polariton::operation::Typed::Str(message.into())); polariton::operation::OperationResponse { code: 20, return_code: 0, @@ -25,3 +28,9 @@ impl OperationCode for MaintenanceModeTeller { 20 } } + +pub fn maintenace_teller(conf: &oj_rc_core::ConfigImpl) -> MaintenanceModeTeller { + MaintenanceModeTeller { + message: >::server_config(conf).maintenance_message, + } +} diff --git a/rc_services_room/src/operations/mod.rs b/rc_services_room/src/operations/mod.rs index 4e6c458..e1e16f9 100644 --- a/rc_services_room/src/operations/mod.rs +++ b/rc_services_room/src/operations/mod.rs @@ -117,7 +117,7 @@ pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler .add(eac::EacChallengeIgnorer) .add(more_auth::MoreLobbyAuth) .add(versioner::version_teller(&init_ctx.cubes)) - .add(maintenancer::MaintenanceModeTeller) + .add(maintenancer::maintenace_teller(&init_ctx.cubes)) .add(game_quality::QualityConfigTeller) .add(login_flags::UserFlagsTeller) .add(polariton_server::operations::Ack::<132, _>::default()) // verify user level