diff --git a/Cargo.lock b/Cargo.lock index 00f77f3..6b9e695 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -168,7 +168,7 @@ dependencies = [ [[package]] name = "auth" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "env_logger", @@ -1593,7 +1593,7 @@ dependencies = [ [[package]] name = "polariton_auth" -version = "0.1.0" +version = "0.2.0" dependencies = [ "log", "num", @@ -1811,7 +1811,7 @@ dependencies = [ [[package]] name = "rc_chat" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "env_logger", @@ -1824,7 +1824,7 @@ dependencies = [ [[package]] name = "rc_chat_room" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "env_logger", @@ -1838,7 +1838,7 @@ dependencies = [ [[package]] name = "rc_core" -version = "0.1.0" +version = "0.2.0" dependencies = [ "argon2", "chrono", @@ -1855,7 +1855,7 @@ dependencies = [ [[package]] name = "rc_microtransactions" -version = "0.1.0" +version = "0.2.0" dependencies = [ "env_logger", "libfj", @@ -1865,7 +1865,7 @@ dependencies = [ [[package]] name = "rc_services" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "env_logger", @@ -1878,7 +1878,7 @@ dependencies = [ [[package]] name = "rc_services_room" -version = "0.1.0" +version = "0.2.0" dependencies = [ "base64 0.22.1", "chrono", @@ -1898,7 +1898,7 @@ dependencies = [ [[package]] name = "rc_singleplayer" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "env_logger", @@ -1911,7 +1911,7 @@ dependencies = [ [[package]] name = "rc_singleplayer_room" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "env_logger", @@ -1925,7 +1925,7 @@ dependencies = [ [[package]] name = "rc_social" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "env_logger", @@ -1938,7 +1938,7 @@ dependencies = [ [[package]] name = "rc_social_room" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "env_logger", @@ -1952,7 +1952,7 @@ dependencies = [ [[package]] name = "rc_static_data" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "env_logger", @@ -2331,7 +2331,7 @@ dependencies = [ [[package]] name = "servers" -version = "0.1.0" +version = "0.2.0" [[package]] name = "sharded-slab" diff --git a/Cargo.toml b/Cargo.toml index c6545d3..c0f2ade 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,8 +4,8 @@ version.workspace = true edition.workspace = true [workspace.package] -version = "0.1.0" -edition = "2021" +version = "0.2.0" +edition = "2024" repository = "https://git.ngram.ca/OpenJam/servers" license = "GPLv3" authors = ["NGnius "] diff --git a/rc_services_room/src/operations/cube_inventory.rs b/rc_services_room/src/operations/cube_inventory.rs index 6de6330..1afb69a 100644 --- a/rc_services_room/src/operations/cube_inventory.rs +++ b/rc_services_room/src/operations/cube_inventory.rs @@ -1,17 +1,39 @@ -use polariton_server::operations::SimpleFunc; -use polariton::{operation::{Dict, ParameterTable, Typed}, serdes::TypePrefix}; +use polariton_server::operations::{Operation, OperationCode}; +use polariton::{operation::{Dict, Typed}, serdes::TypePrefix}; use rc_core::ConfigProvider; const PARAM_KEY: u8 = 16; -pub(super) fn cube_inv_provider(cubes: &rc_core::ConfigImpl) -> SimpleFunc<16, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - let cube_ids = >::ids(cubes); - SimpleFunc::new(move |params, _| { +pub struct CubeInventoryProvider { + cube_ids: Vec, +} + +impl Operation for CubeInventoryProvider { + type State = (); + type User = crate::UserTy; + + fn handle(&self, params: polariton::operation::ParameterTable, _: &mut Self::State, _user: &Self::User) -> polariton::operation::OperationResponse { let mut params = params.to_dict(); params.insert(PARAM_KEY, Typed::Dict(Dict { key_ty: TypePrefix::Int, // int val_ty: TypePrefix::Int, // int - items: cube_ids.iter().map(|id| (Typed::Int(*id as _), Typed::Int(1))).collect()})); - Ok(params.into()) - }) + items: self.cube_ids.iter().map(|id| (Typed::Int(*id as _), Typed::Int(1))).collect()})); + polariton::operation::OperationResponse { + code: Self::op_code(), + return_code: 0, + message: polariton::operation::Typed::Null, + params: params.into(), + } + } +} + +impl OperationCode for CubeInventoryProvider { + fn op_code() -> u8 { + 16 + } +} + +pub(super) fn cube_inv_provider<'a>(cubes: &'a rc_core::ConfigImpl) -> CubeInventoryProvider { + let cube_ids = >::ids(cubes); + CubeInventoryProvider { cube_ids } } diff --git a/rc_services_room/src/operations/dev_message.rs b/rc_services_room/src/operations/dev_message.rs index a01175f..19d4e4d 100644 --- a/rc_services_room/src/operations/dev_message.rs +++ b/rc_services_room/src/operations/dev_message.rs @@ -1,19 +1,40 @@ -use polariton_server::operations::SimpleFunc; -use polariton::operation::ParameterTable; +use polariton_server::operations::{Operation, OperationCode}; use rand::Rng; use rc_core::ConfigProvider; const MESSAGE_PARAM_KEY: u8 = 2; const DISPLAY_TIME_PARAM_KEY: u8 = 15; -pub(super) fn dev_message_provider(conf: &rc_core::ConfigImpl) -> SimpleFunc<8, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - let messages = conf.login_messages(); - SimpleFunc::new(move |params, _| { +pub struct DevMessageProvider { + messages: rc_core::persist::config::DevMessageProvider, +} + +impl Operation for DevMessageProvider { + type State = (); + type User = crate::UserTy; + + fn handle(&self, params: polariton::operation::ParameterTable, _: &mut Self::State, _user: &Self::User) -> polariton::operation::OperationResponse { let mut params = params.to_dict(); let index = rand::rng().random::(); - let dev_msg = messages.get(index as _); + let dev_msg = self.messages.get(index as _); params.insert(MESSAGE_PARAM_KEY, dev_msg.message); params.insert(DISPLAY_TIME_PARAM_KEY, dev_msg.display_time); - Ok(params.into()) - }) + polariton::operation::OperationResponse { + code: Self::op_code(), + return_code: 0, + message: polariton::operation::Typed::Null, + params: params.into(), + } + } +} + +impl OperationCode for DevMessageProvider { + fn op_code() -> u8 { + 16 + } +} + +pub(super) fn dev_message_provider(conf: &rc_core::ConfigImpl) -> DevMessageProvider<()> { + let messages = conf.login_messages(); + DevMessageProvider { messages } } diff --git a/rc_services_room/src/operations/game_mode_config.rs b/rc_services_room/src/operations/game_mode_config.rs index 1d65a03..a26fae5 100644 --- a/rc_services_room/src/operations/game_mode_config.rs +++ b/rc_services_room/src/operations/game_mode_config.rs @@ -1,15 +1,14 @@ -use polariton_server::operations::SimpleFunc; -use polariton::operation::ParameterTable; +use polariton_server::operations::Immediate; use rc_core::ConfigProvider; const PARAM_KEY: u8 = 1; -pub(super) fn game_mode_config_provider(conf: &rc_core::ConfigImpl) -> SimpleFunc<113, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { +pub(super) fn game_mode_config_provider(conf: &rc_core::ConfigImpl) -> Immediate<113, crate::UserTy> { let game_config = conf.game_mode_config(); - SimpleFunc::new(move |params, _| { - let mut params = params.to_dict(); + Immediate::new(move || { + let mut params = std::collections::HashMap::with_capacity(1); params.insert(PARAM_KEY, game_config.clone()); - Ok(params.into()) + params.into() }) } diff --git a/rc_services_room/src/operations/singleplayer_campaigns.rs b/rc_services_room/src/operations/singleplayer_campaigns.rs index a38ae3a..9e1b520 100644 --- a/rc_services_room/src/operations/singleplayer_campaigns.rs +++ b/rc_services_room/src/operations/singleplayer_campaigns.rs @@ -1,4 +1,5 @@ use polariton_server::operations::{Immediate, SimpleFunc}; +use polariton_server::operations::{Operation, OperationCode}; use polariton::operation::{ParameterTable, Typed}; use rc_core::ConfigProvider; @@ -29,19 +30,53 @@ const CAMPAIGN_ID_PARAM_KEY: u8 = 22; // string; in const CAMPAIGN_DIFFICULTY_PARAM_KEY: u8 = 23; // i32; in const CAMPAIGN_WAVES_PARAM_KEY: u8 = 75; // bytes; out -pub(super) fn singleplayer_complete_campaign_provider(conf: &rc_core::ConfigImpl) -> SimpleFunc<64, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - let campaign_details = >::campaign_details(conf); - SimpleFunc::new(move |params, _| { +pub struct SingleplayerCompleteCampaignProvider { + campaign_details: rc_core::persist::config::CompleteCampaignProvider, +} + +impl Operation for SingleplayerCompleteCampaignProvider { + type State = (); + type User = crate::UserTy; + + fn handle(&self, params: polariton::operation::ParameterTable, _: &mut Self::State, _user: &Self::User) -> polariton::operation::OperationResponse { let mut params = params.to_dict(); if let Some(Typed::Str(campaign_id)) = params.get(&CAMPAIGN_ID_PARAM_KEY) { if let Some(Typed::Int(campaign_difficulty)) = params.get(&CAMPAIGN_DIFFICULTY_PARAM_KEY) { - let complete_campaign = campaign_details.get(&campaign_id.string, campaign_difficulty)?; - params.clear(); - params.insert(CAMPAIGN_WAVES_PARAM_KEY, complete_campaign); + match self.campaign_details.get(&campaign_id.string, campaign_difficulty) { + Ok(complete_campaign) => { + params.clear(); + params.insert(CAMPAIGN_WAVES_PARAM_KEY, complete_campaign); + }, + Err(e) => { + return polariton::operation::OperationResponse { + code: Self::op_code(), + return_code: e, + message: polariton::operation::Typed::Null, + params: std::collections::HashMap::default().into(), + } + } + }; + } } - Ok(params.into()) - }) + polariton::operation::OperationResponse { + code: Self::op_code(), + return_code: 0, + message: polariton::operation::Typed::Null, + params: params.into(), + } + } +} + +impl OperationCode for SingleplayerCompleteCampaignProvider { + fn op_code() -> u8 { + 16 + } +} + +pub(super) fn singleplayer_complete_campaign_provider(conf: &rc_core::ConfigImpl) -> SingleplayerCompleteCampaignProvider { + let campaign_details: rc_core::persist::config::CompleteCampaignProvider = >::campaign_details(conf); + SingleplayerCompleteCampaignProvider { campaign_details } } const CAMPAIGN_WAVE_NUMBER_PARAM_KEYL: u8 = 73;