From 192f3216b2ab63cd919cb6c8023198b1f5decd82 Mon Sep 17 00:00:00 2001 From: "NG (Graham)" Date: Thu, 9 Jul 2026 17:45:43 -0400 Subject: [PATCH] Use cube converter on factory; fix #26 --- .../src/operations/crf_purchase.rs | 24 +++++++++++++------ .../src/operations/crf_vehicle_data.rs | 19 +++++++++++---- rc_services_room/src/operations/mod.rs | 4 ++-- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/rc_services_room/src/operations/crf_purchase.rs b/rc_services_room/src/operations/crf_purchase.rs index 715fb0b..fb35f61 100644 --- a/rc_services_room/src/operations/crf_purchase.rs +++ b/rc_services_room/src/operations/crf_purchase.rs @@ -9,7 +9,7 @@ const PAID_CURRENCY_COST_PARAM_KEY: u8 = 6; // in; int const FACTORY_ID_PARAM_KEY: u8 = 94; // in; int -async fn do_handling(params: ParameterTable<()>, user: &crate::UserTy, factory: &std::sync::Arc, weapon_order: &std::sync::Arc, cpu_counter: &std::sync::Arc,) -> Result { +async fn do_handling(params: ParameterTable<()>, user: &crate::UserTy, factory: &std::sync::Arc, weapon_order: &std::sync::Arc, cpu_counter: &std::sync::Arc, converter: &std::sync::Arc) -> Result { let mut params = params.to_dict(); let user_info = user.user()?; let slot = if let Some(Typed::Int(slot)) = params.remove(&SLOT_PARAM_KEY) { @@ -32,15 +32,23 @@ async fn do_handling(params: ParameterTable<()>, user: &crate::UserTy, factory: oj_rc_core::data::error_codes::WebServicesError::DatabaseError as i16 })?; if let Some((vehicle_to_copy, vehicle_meta)) = vehicle { + // upgrade vehicle to modern cubes + let modernised_vehicle = converter.upgrade_to_modern( + &mut std::io::Cursor::new(vehicle_to_copy.cube_data), + &mut std::io::Cursor::new(vehicle_to_copy.colour_data), + ).map_err(|e| { + log::error!("Failed to convert vehicle {} (for copy-construct) from factory: {}", factory_id, e); + oj_rc_core::data::error_codes::WebServicesError::DatabaseError as i16 + })?; // parse cube data for weapon order - let mut cursor = std::io::Cursor::new(&vehicle_to_copy.cube_data); + let mut cursor = std::io::Cursor::new(&modernised_vehicle.cube_data); let weapons = weapon_order.guess_weapons(&mut cursor); // save to database let to_save = oj_rc_core::persist::user::VehicleData { name: Some(vehicle_meta.name), slot, - robot_data: vehicle_to_copy.cube_data, - colour_data: vehicle_to_copy.colour_data, + robot_data: modernised_vehicle.cube_data, + colour_data: modernised_vehicle.colour_data, weapon_order: weapons, crf_id: Some(factory_id), was_rated: Some(false), @@ -68,6 +76,7 @@ pub struct CrfItemPurchaseProvider { factory: std::sync::Arc, weapon_order: std::sync::Arc, cpu_counter: std::sync::Arc, + converter: std::sync::Arc, } #[async_trait::async_trait] @@ -75,7 +84,7 @@ impl polariton_server::operations::Operation<()> for CrfItemPurchaseProvider { type User = crate::UserTy; async fn handle_async(&self, params: ParameterTable<()>, user: &Self::User) -> OperationResponse<()> { - polariton_server::operations::result_to_op_resp::(do_handling(params, user, &self.factory, &self.weapon_order, &self.cpu_counter).await) + polariton_server::operations::result_to_op_resp::(do_handling(params, user, &self.factory, &self.weapon_order, &self.cpu_counter, &self.converter).await) } } @@ -86,10 +95,11 @@ impl polariton_server::operations::OperationCode for CrfItemPurchaseProvider { } -pub(super) fn crf_copy_to_bay_provider(factory: &std::sync::Arc, weapon_order: std::sync::Arc, cpu_counter: std::sync::Arc) -> CrfItemPurchaseProvider { +pub(super) fn crf_copy_to_bay_provider(factory: &std::sync::Arc, weapon_order: std::sync::Arc, cpu_counter: std::sync::Arc, converter: std::sync::Arc) -> CrfItemPurchaseProvider { CrfItemPurchaseProvider { factory: factory.to_owned(), weapon_order, - cpu_counter + cpu_counter, + converter, } } diff --git a/rc_services_room/src/operations/crf_vehicle_data.rs b/rc_services_room/src/operations/crf_vehicle_data.rs index 4d94fd7..995c348 100644 --- a/rc_services_room/src/operations/crf_vehicle_data.rs +++ b/rc_services_room/src/operations/crf_vehicle_data.rs @@ -7,14 +7,23 @@ const CODE: u8 = 87; const ID_PARAM_KEY: u8 = 94; const DATA_PARAM_KEY: u8 = 95; -async fn do_handling(params: ParameterTable<()>, _user: &crate::UserTy, factory: &std::sync::Arc) -> Result { +async fn do_handling(params: ParameterTable<()>, _user: &crate::UserTy, factory: &std::sync::Arc, converter: &std::sync::Arc) -> Result { let mut params = params.to_dict(); if let Some(Typed::Int(id)) = params.remove(&ID_PARAM_KEY) { let vehicle = factory.vehicle(id as _).await.map_err(|e| { log::error!("Failed to retrieve vehicle {} from factory: {}", id, e); oj_rc_core::data::error_codes::WebServicesError::DatabaseError as i16 })?; - if let Some(vehicle) = vehicle { + if let Some(mut vehicle) = vehicle { + let modernised_vehicle = converter.upgrade_to_modern( + &mut std::io::Cursor::new(vehicle.0.cube_data), + &mut std::io::Cursor::new(vehicle.0.colour_data), + ).map_err(|e| { + log::error!("Failed to convert vehicle {} from factory: {}", id, e); + oj_rc_core::data::error_codes::WebServicesError::DatabaseError as i16 + })?; + vehicle.0.cube_data = modernised_vehicle.cube_data; + vehicle.0.colour_data = modernised_vehicle.colour_data; let vehicle_data = crate::data::crf::ItemData::from(vehicle.0); params.insert(DATA_PARAM_KEY, vehicle_data.as_transmissible()); } else { @@ -27,6 +36,7 @@ async fn do_handling(params: ParameterTable<()>, _user: &crate::UserTy, factory: pub struct CrfItemDataProvider { factory: std::sync::Arc, + convert: std::sync::Arc, } #[async_trait::async_trait] @@ -34,7 +44,7 @@ impl Operation<()> for CrfItemDataProvider { type User = crate::UserTy; async fn handle_async(&self, params: polariton::operation::ParameterTable<()>, user: &Self::User) -> polariton::operation::OperationResponse<()> { - polariton_server::operations::result_to_op_resp::(do_handling(params, user, &self.factory).await) + polariton_server::operations::result_to_op_resp::(do_handling(params, user, &self.factory, &self.convert).await) } } @@ -44,8 +54,9 @@ impl OperationCode for CrfItemDataProvider { } } -pub(super) fn crf_item_data_provider(factory: &std::sync::Arc) -> CrfItemDataProvider { +pub(super) fn crf_item_data_provider(factory: &std::sync::Arc, convert: std::sync::Arc) -> CrfItemDataProvider { CrfItemDataProvider { factory: factory.to_owned(), + convert, } } diff --git a/rc_services_room/src/operations/mod.rs b/rc_services_room/src/operations/mod.rs index 41b0e68..316adb3 100644 --- a/rc_services_room/src/operations/mod.rs +++ b/rc_services_room/src/operations/mod.rs @@ -228,8 +228,8 @@ pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler .add(garage_slot_upgrade::garage_slot_upgrage_provider()) .add(crf_earnings::robot_shop_user_earnings_provider()) .add(crf_list_query::crf_item_list_query_provider(&init_ctx.factory)) - .add(crf_vehicle_data::crf_item_data_provider(&init_ctx.factory)) - .add(crf_purchase::crf_copy_to_bay_provider(&init_ctx.factory, init_ctx.parsers.weapon_order(), init_ctx.parsers.cpu_counter())) + .add(crf_vehicle_data::crf_item_data_provider(&init_ctx.factory, init_ctx.parsers.converter())) + .add(crf_purchase::crf_copy_to_bay_provider(&init_ctx.factory, init_ctx.parsers.weapon_order(), init_ctx.parsers.cpu_counter(), init_ctx.parsers.converter())) .add(crf_upload::crf_upload_provider(&init_ctx.factory)) .add(avatar_set_custom::custom_avatar_upload_handler()) .add(avatar_set::avatar_set_provider())