From a182ced637f683eede181183169ad28847716e43 Mon Sep 17 00:00:00 2001 From: "NG (Graham)" Date: Sat, 28 Mar 2026 10:58:34 -0400 Subject: [PATCH] Fix existing platoon not showing when returning from battle --- rc_social_room/src/operations/mod.rs | 2 +- rc_social_room/src/operations/platoon_data.rs | 75 +++++++++++++++++-- 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/rc_social_room/src/operations/mod.rs b/rc_social_room/src/operations/mod.rs index 95ae04a..148a796 100644 --- a/rc_social_room/src/operations/mod.rs +++ b/rc_social_room/src/operations/mod.rs @@ -54,7 +54,7 @@ pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler::default()) // validate pending season rewards (this just always needs to be ack-ed) .add(season_rewards::season_rewards_provider()) .add(previous_battle_rewards::pending_battle_rewards_provider()) - .add(platoon_data::platoon_provider()) + .add(platoon_data::platoon_provider(init_ctx)) .add(polariton_server::operations::Ack::<6, _>::default()) // AvatarUpdatedRequest, sent on services_room avatar_set success (just needs to be ack-ed; no params) .add(calculate_mmr::mmr_provider()) .add(polariton_server::operations::Ack::<25, _>::default()) // save social settings, sent on escape menu settings save (should probably be saved someday...) diff --git a/rc_social_room/src/operations/platoon_data.rs b/rc_social_room/src/operations/platoon_data.rs index d6ac699..4ae6292 100644 --- a/rc_social_room/src/operations/platoon_data.rs +++ b/rc_social_room/src/operations/platoon_data.rs @@ -1,15 +1,80 @@ -use polariton_server::operations::SimpleFunc; -use polariton::operation::ParameterTable; +use polariton_server::operations::{SimpleOpError, SimpleOperation, SimpleOpImpl}; +use polariton::operation::{ParameterTable, Typed}; + +const CODE: u8 = 18; const PLATOON_ID_PARAM_KEY: u8 = 16; -//const PLATOON_LEADER_PARAM_KEY: u8 = 17; -//const USER_LIST_PARAM_KEY: u8 = 7; +const PLATOON_LEADER_PARAM_KEY: u8 = 17; +const USER_LIST_PARAM_KEY: u8 = 7; -pub(super) fn platoon_provider() -> SimpleFunc<18, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result, i16>) + Sync + Sync, C> { +/*pub(super) fn platoon_provider() -> SimpleFunc<18, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result, i16>) + Sync + Sync, C> { SimpleFunc::new(|params, _| { let mut params = params.to_dict(); // if platoon ID is not provided, you're not in a platoon params.insert(PLATOON_ID_PARAM_KEY, polariton::operation::Typed::Null); Ok(params.into()) }) +}*/ + +pub(super) struct PlatoonInformer { + social: std::sync::Arc, } + +#[async_trait::async_trait] +impl SimpleOperation for PlatoonInformer { + type User = crate::UserTy; + const CODE: u8 = CODE; + + async fn handle(&self, mut params: ParameterTable, user: &Self::User) -> Result, SimpleOpError> { + let user_info = user.user()?; + let my_public_id = user_info.public_id(); + log::debug!("Checking for existing platoon of user {}", my_public_id); + if let Some(platoon_id) = self.social.platoon_of_user(my_public_id).await { + log::debug!("User {} is in platoon {}", my_public_id, platoon_id); + let members = self.social.users_of_platoon(&platoon_id).await; + let member_ids = members.iter() + .map(|mem| mem.public_id.clone()) + .collect::>(); + let social_infos = user_info.list_social_info(&member_ids).await?; + if social_infos.len() != members.len() { + let diff = members.len().wrapping_sub(social_infos.len()); + return Err(SimpleOpError::with_message( + oj_rc_core::data::error_codes::SocialErrorCode::UserDoesNotExist as i16, + format!("Could not find user avatar info for {} user(s) in platoon {}", diff, platoon_id), + )); + } + params.insert(PLATOON_ID_PARAM_KEY, Typed::Str(platoon_id.into())); + params.insert(PLATOON_LEADER_PARAM_KEY, Typed::Str(member_ids.first().unwrap().clone().into())); + params.insert(USER_LIST_PARAM_KEY, Typed::Arr(polariton::operation::Arr { + ty: polariton::serdes::TypePrefix::Custom, + custom_ty: Some(1), + items: members.into_iter() + .map(|mem| { + let social_info = social_infos.iter() + .find(|soc| soc.public_id == mem.public_id) + .unwrap(); + Typed::Custom(crate::data::custom::CustomType::PlatoonMember(crate::data::platoon::PlatoonMemberInfo { + public_id: mem.public_id, + display_name: social_info.display_name.clone(), + status: mem.status, + added: mem.timestamp, + avatar_id: social_info.avatar_id.unwrap_or(0), + use_custom_avatar: social_info.avatar_id.is_none(), + })) + }) + .collect(), + })); + } else { + log::debug!("User {} is not in a platoon", my_public_id); + params.insert(PLATOON_ID_PARAM_KEY, Typed::Null); + } + Ok(params) + } +} + +pub(super) fn platoon_provider(init_ctx: &crate::InitConfig) -> SimpleOpImpl { + SimpleOpImpl::new(PlatoonInformer { + social: init_ctx.social.clone(), + }) +} +