From 75260c40a04fe618fe622ab889982660035f48a5 Mon Sep 17 00:00:00 2001 From: jake Date: Mon, 16 Nov 2020 23:05:28 -0700 Subject: [PATCH] improve error handling in new character --- src/login/character.rs | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/login/character.rs b/src/login/character.rs index 82434f3..9443c8f 100644 --- a/src/login/character.rs +++ b/src/login/character.rs @@ -17,7 +17,7 @@ use crate::common::interserver::{ServerId, InterserverActor, LoginMessage, ShipM use crate::common::leveltable::CharacterLevelTable; use libpso::{utf8_to_array, utf8_to_utf16_array}; -use crate::entity::gateway::EntityGateway; +use crate::entity::gateway::{EntityGateway, GatewayError}; use crate::entity::account::{UserAccountEntity, NewUserSettingsEntity, USERFLAG_NEWCHAR, USERFLAG_DRESSINGROOM}; use crate::entity::item::{NewItemEntity, ItemDetail, ItemLocation, InventoryItemEntity, InventoryEntity, BankEntity, BankName, EquippedEntity}; use crate::entity::item::weapon::Weapon; @@ -41,7 +41,7 @@ pub enum CharacterError { CouldNotLoadSettings, CouldNotLoadCharacters, CouldNotLoadGuildcard, - DbError, + GatewayError(#[from] GatewayError), } #[derive(Debug)] @@ -181,7 +181,7 @@ pub struct CharacterServerState { } -async fn new_character(entity_gateway: &mut EG, user: &UserAccountEntity, preview: &CharacterPreview) { +async fn new_character(entity_gateway: &mut EG, user: &UserAccountEntity, preview: &CharacterPreview) -> Result<(), anyhow::Error> { let mut character = new_character_from_preview(user, preview); match character.char_class { CharacterClass::FOmar | CharacterClass::FOmarl| CharacterClass::FOnewm | CharacterClass::FOnewearl => character.techs.set_tech(Technique::Foie, TechLevel(1)), @@ -189,7 +189,7 @@ async fn new_character(entity_gateway: &mut EG, user: &UserAc } character.meseta = 300; - let character = entity_gateway.create_character(character).await.unwrap(); + let character = entity_gateway.create_character(character).await?; let new_weapon = match character.char_class { CharacterClass::HUmar | CharacterClass::HUnewearl | CharacterClass::HUcast | CharacterClass::HUcaseal => item::weapon::WeaponType::Saber, @@ -211,7 +211,7 @@ async fn new_character(entity_gateway: &mut EG, user: &UserAc }), location: ItemLocation::Inventory { character_id: character.id, - }}).await.unwrap(); + }}).await?; let armor = entity_gateway.create_item( NewItemEntity { @@ -225,7 +225,7 @@ async fn new_character(entity_gateway: &mut EG, user: &UserAc }), location: ItemLocation::Inventory { character_id: character.id, - }}).await.unwrap(); + }}).await?; let mut mag = { if character.char_class.is_android() { @@ -240,7 +240,7 @@ async fn new_character(entity_gateway: &mut EG, user: &UserAc item: ItemDetail::Mag(mag), location: ItemLocation::Inventory { character_id: character.id, - }}).await.unwrap(); + }}).await?; let mut monomates = Vec::new(); for _ in 0..4usize { @@ -252,7 +252,7 @@ async fn new_character(entity_gateway: &mut EG, user: &UserAc }), location: ItemLocation::Inventory { character_id: character.id, - }}).await.unwrap()) + }}).await?) } let mut monofluids = Vec::new(); @@ -265,20 +265,21 @@ async fn new_character(entity_gateway: &mut EG, user: &UserAc }), location: ItemLocation::Inventory { character_id: character.id, - }}).await.unwrap()) + }}).await?) } let inventory = InventoryEntity { items: vec![InventoryItemEntity::Individual(weapon.clone()), InventoryItemEntity::Individual(armor.clone()), InventoryItemEntity::Individual(mag.clone()), InventoryItemEntity::Stacked(monomates), InventoryItemEntity::Stacked(monofluids)], }; - entity_gateway.set_character_inventory(&character.id, &inventory).await; - entity_gateway.set_character_bank(&character.id, &BankEntity::default(), BankName("".into())).await; + entity_gateway.set_character_inventory(&character.id, &inventory).await?; + entity_gateway.set_character_bank(&character.id, &BankEntity::default(), BankName("".into())).await?; let mut equipped = EquippedEntity::default(); equipped.weapon = Some(weapon.id); equipped.armor = Some(armor.id); equipped.mag = Some(mag.id); - entity_gateway.set_character_equips(&character.id, &equipped).await; + entity_gateway.set_character_equips(&character.id, &equipped).await?; + Ok(()) } @@ -303,7 +304,7 @@ impl CharacterServerState { Ok(match get_login_status(&self.entity_gateway, pkt).await.and_then(check_if_already_online) { Ok(mut user) => { user.at_character = true; - self.entity_gateway.save_user(&user).await.map_err(|_| CharacterError::DbError)?; + self.entity_gateway.save_user(&user).await?; let mut response = LoginResponse::by_status(AccountStatus::Ok, Session::new()); response.guildcard = user.guildcard; @@ -457,7 +458,7 @@ impl CharacterServerState { let client = self.clients.get_mut(&id).ok_or(CharacterError::ClientNotFound(id))?; let mut user = client.user.as_mut().unwrap(); if user.flags == USERFLAG_NEWCHAR { - new_character(&mut self.entity_gateway, &user, preview).await + new_character(&mut self.entity_gateway, &user, preview).await? } if user.flags == USERFLAG_DRESSINGROOM { // TODO: dressing room stuff