From c82c11fc1c8490d8891172e3ac5bc633cd2baf75 Mon Sep 17 00:00:00 2001 From: "NG (Graham)" Date: Wed, 8 Apr 2026 21:06:06 -0400 Subject: [PATCH] Make factory upload limit configurable and increase default to mitigate #105 --- assets/robocraft/config.json | 2 ++ rc_core/src/persist/config/cubes_json.rs | 6 ++++++ rc_core/src/persist/config/mod.rs | 2 +- rc_core/src/persist/config/traits.rs | 5 +++++ rc_core/src/persist/vehicle_factory.rs | 6 ++++++ rc_services_room/src/operations/crf_limits.rs | 13 +++++++------ rc_services_room/src/operations/mod.rs | 2 +- 7 files changed, 28 insertions(+), 8 deletions(-) diff --git a/assets/robocraft/config.json b/assets/robocraft/config.json index 8829f87..84beb2b 100644 --- a/assets/robocraft/config.json +++ b/assets/robocraft/config.json @@ -14537,6 +14537,8 @@ }, "shop": {}, "settings": { + "server": { + }, "banners": [ { "message": "No jam was harmed in the reverse-engineering of this game", diff --git a/rc_core/src/persist/config/cubes_json.rs b/rc_core/src/persist/config/cubes_json.rs index 9a13f13..bf1db79 100644 --- a/rc_core/src/persist/config/cubes_json.rs +++ b/rc_core/src/persist/config/cubes_json.rs @@ -318,6 +318,12 @@ impl super::ConfigProvider for CubeConfig { crate::factory::Factory::from_config(&self.factory, &>::server_config(self), builtin_factory_provider).await } + fn factory_config(&self) -> super::FactoryConfig { + super::FactoryConfig { + upload_limit: self.factory.upload_limit, + } + } + fn cubes(&self) -> &'_ indexmap::IndexMap { &self.cubes } diff --git a/rc_core/src/persist/config/mod.rs b/rc_core/src/persist/config/mod.rs index 95cf497..ff7168c 100644 --- a/rc_core/src/persist/config/mod.rs +++ b/rc_core/src/persist/config/mod.rs @@ -2,7 +2,7 @@ mod cubes_json; pub use cubes_json::CubeConfig; mod traits; -pub use traits::{ConfigProvider, DevMessageProvider, ServerConfig, GarageUpgrades, GarageUpgradeIncrement, ChatSystemConfig, GameEventSequence, GameEvents, GameRotationStrategy, GameEvent, GameMap, GameVisibility, GameType, SingleplayerConfig, VehicleInfo, VehicleDescriptor, QueueChangeMode, Point, Sphere, MapConfig, LinksConfig, FakePlayer, ClientEmulator, EnergyConfig, BattleArenaResolver, PitSettings, PitWinCondition, TeamDeathMatchSettings, ShopEntriesResolver, ShopAction, ShopGain, PromoCode, MultiplayerSettings, BattleArenaCrystalParams, VehicleValidators, TeamChoosers}; +pub use traits::{ConfigProvider, DevMessageProvider, ServerConfig, GarageUpgrades, GarageUpgradeIncrement, ChatSystemConfig, GameEventSequence, GameEvents, GameRotationStrategy, GameEvent, GameMap, GameVisibility, GameType, SingleplayerConfig, VehicleInfo, VehicleDescriptor, QueueChangeMode, Point, Sphere, MapConfig, LinksConfig, FakePlayer, ClientEmulator, EnergyConfig, BattleArenaResolver, PitSettings, PitWinCondition, TeamDeathMatchSettings, ShopEntriesResolver, ShopAction, ShopGain, PromoCode, MultiplayerSettings, BattleArenaCrystalParams, VehicleValidators, TeamChoosers, FactoryConfig}; mod validation; pub use validation::{SelfValidator, ValidationInfo, ValidationMessage}; diff --git a/rc_core/src/persist/config/traits.rs b/rc_core/src/persist/config/traits.rs index 9fc066f..ea2420b 100644 --- a/rc_core/src/persist/config/traits.rs +++ b/rc_core/src/persist/config/traits.rs @@ -21,6 +21,7 @@ pub trait ConfigProvider { fn server_config(&self) -> ServerConfig; fn garage_upgrades(&self) -> GarageUpgrades; async fn factory(&self, builtin_factory_provider: &(dyn (Fn() -> oj_rc_database::FactoryDatabase) + Sync)) -> Result>; + fn factory_config(&self) -> FactoryConfig; fn cubes(&self) -> &'_ indexmap::IndexMap; fn chat_system_config(&self) -> ChatSystemConfig; fn gamemode_events(&self) -> GameEventSequence; @@ -143,6 +144,10 @@ impl GarageUpgrades { } } +pub struct FactoryConfig { + pub upload_limit: i32, +} + #[derive(Clone, Debug)] pub struct ChatSystemConfig { pub command_channel: String, diff --git a/rc_core/src/persist/vehicle_factory.rs b/rc_core/src/persist/vehicle_factory.rs index e85f449..a587336 100644 --- a/rc_core/src/persist/vehicle_factory.rs +++ b/rc_core/src/persist/vehicle_factory.rs @@ -4,6 +4,8 @@ use serde::{Serialize, Deserialize}; pub struct FactoryConfig { #[serde(default = "default_variant")] pub adapter: AdapterSettings, + #[serde(default = "default_upload_limit")] + pub upload_limit: i32, } impl super::config::SelfValidator for FactoryConfig { @@ -18,6 +20,10 @@ fn default_variant() -> AdapterSettings { AdapterSettings::BuiltIn } +fn default_upload_limit() -> i32 { + 4096 +} + #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(tag = "variant")] pub enum AdapterSettings { diff --git a/rc_services_room/src/operations/crf_limits.rs b/rc_services_room/src/operations/crf_limits.rs index 01ce1ec..ad185dd 100644 --- a/rc_services_room/src/operations/crf_limits.rs +++ b/rc_services_room/src/operations/crf_limits.rs @@ -1,15 +1,16 @@ -use polariton_server::operations::SimpleFunc; +use polariton_server::operations::Immediate; use polariton::operation::{ParameterTable, Typed}; const PARAM_KEY: u8 = 100; -pub(super) fn robot_shop_submission_infos_provider() -> SimpleFunc<95, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - SimpleFunc::new(|params, _| { - let mut params = params.to_dict(); +pub(super) fn robot_shop_submission_infos_provider(config: &oj_rc_core::ConfigImpl) -> Immediate<95, crate::UserTy> { + let max_subs = >::factory_config(config).upload_limit; + Immediate::new(|| { + let mut params = ParameterTable::with_capacity(2); params.insert(PARAM_KEY, Typed::HashMap(vec![ (Typed::Str("submissionCount".into()), Typed::Int(0)), - (Typed::Str("maxSubmissions".into()), Typed::Int(10)), + (Typed::Str("maxSubmissions".into()), Typed::Int(max_subs)), ].into())); - Ok(params.into()) + params }) } diff --git a/rc_services_room/src/operations/mod.rs b/rc_services_room/src/operations/mod.rs index d233e4e..d451dce 100644 --- a/rc_services_room/src/operations/mod.rs +++ b/rc_services_room/src/operations/mod.rs @@ -179,7 +179,7 @@ pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler .add(player_rank::rank_static_provider()) .add(ab_test_group::test_group_provider()) .add(league_limits::league_battle_parameters_provider()) - .add(crf_limits::robot_shop_submission_infos_provider()) + .add(crf_limits::robot_shop_submission_infos_provider(&init_ctx.cubes)) .add(robot_mastery_settings::robot_mastery_settings_provider()) .add(player_started_purchase::started_purchase_provider()) .add(custom_games_team::team_setup_provider())