47 lines
2.4 KiB
Rust
Raw Normal View History

2020-04-21 22:18:57 -06:00
use libpso::packet::login::{Login, LoginResponse, AccountStatus, Session};
use libpso::packet::ship::*;
use crate::common::serverstate::ClientId;
use crate::ship::ship::{SendShipPacket, ShipError, ClientState, Clients};
2021-06-18 20:38:29 -06:00
use crate::login::login::get_login_status;
2020-04-21 22:18:57 -06:00
use crate::entity::gateway::EntityGateway;
2022-05-14 13:06:40 -06:00
use crate::ship::items::state::ItemState;
use crate::common::interserver::ShipMessage;
2020-04-21 22:18:57 -06:00
2021-06-18 12:18:29 -06:00
#[allow(clippy::too_many_arguments)]
2020-06-02 18:51:18 -06:00
pub async fn validate_login<EG: EntityGateway>(id: ClientId,
2020-11-24 23:17:42 -07:00
pkt: &Login,
mut entity_gateway: EG,
2020-11-24 23:17:42 -07:00
clients: &mut Clients,
2022-05-14 13:06:40 -06:00
item_state: &mut ItemState,
2020-11-24 23:17:42 -07:00
shipgate_sender: &Option<Box<dyn Fn(ShipMessage) + Send + Sync>>,
2021-06-18 12:18:29 -06:00
ship_name: &str,
2020-11-24 23:17:42 -07:00
num_blocks: usize)
2020-11-16 21:27:03 -07:00
-> Result<Vec<SendShipPacket>, anyhow::Error> {
Ok(match get_login_status(&mut entity_gateway, pkt).await {
2020-11-24 23:17:42 -07:00
Ok(user) => {
let mut response = LoginResponse::by_status(AccountStatus::Ok, Session::new());
response.guildcard = user.id.0 as u32;
response.team_id = user.team_id.map_or(31, |ti| ti) as u32;
let characters = entity_gateway.get_characters_by_user(&user).await?;
let character = characters
.get(pkt.session.character_slot as usize)
.ok_or(ShipError::InvalidSlot(id, pkt.session.character_slot as u32))?.as_ref()
.ok_or(ShipError::NoCharacterInSlot(id, pkt.session.character_slot as u32))?
.clone();
let settings = entity_gateway.get_user_settings_by_user(&user).await?;
2020-04-21 22:18:57 -06:00
item_state.load_character(&mut entity_gateway, &character).await?;
if let Some(shipgate_sender) = shipgate_sender.as_ref() {
2021-06-18 12:18:29 -06:00
shipgate_sender(ShipMessage::AddUser(user.id));
}
clients.insert(id, ClientState::new(user, settings, character, pkt.session));
2021-06-18 12:18:29 -06:00
vec![SendShipPacket::LoginResponse(response), SendShipPacket::ShipBlockList(ShipBlockList::new(ship_name, num_blocks))]
2020-04-21 22:18:57 -06:00
},
Err(err) => {
vec![SendShipPacket::LoginResponse(LoginResponse::by_status(err, Session::new()))]
}
})
}