You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 lines
2.3 KiB

use libpso::packet::login::{Login, LoginResponse, AccountStatus, Session};
use libpso::packet::ship::*;
use networking::serverstate::ClientId;
use crate::{SendShipPacket, ShipError};
use client::{Clients, ClientState};
use login_server::login::get_login_status;
use entity::gateway::EntityGateway;
use items::state::ItemState;
use networking::interserver::ShipMessage;
#[allow(clippy::too_many_arguments)]
pub async fn validate_login<EG>(id: ClientId,
pkt: Login,
entity_gateway: &mut EG,
clients: &mut Clients,
item_state: &mut ItemState,
shipgate_sender: &Option<async_std::channel::Sender<ShipMessage>>,
ship_name: &str,
num_blocks: usize)
-> Result<Vec<SendShipPacket>, anyhow::Error>
where
EG: EntityGateway,
{
Ok(match get_login_status(entity_gateway, &pkt).await {
Ok(user) => {
let mut response = LoginResponse::by_status(AccountStatus::Ok, Session::new());
response.guildcard = user.id.0;
response.team_id = user.team_id.map_or(31, |ti| ti);
let characters = entity_gateway.get_characters_by_user(&user).await?;
let character = characters
.get(pkt.session.character_slot as usize)
.ok_or_else(|| ShipError::InvalidSlot(id, pkt.session.character_slot as u32))?
.as_ref()
.ok_or_else(|| ShipError::NoCharacterInSlot(id, pkt.session.character_slot as u32))?
.clone();
let settings = entity_gateway.get_user_settings_by_user(&user).await?;
item_state.load_character(entity_gateway, &character).await?;
if let Some(shipgate_sender) = shipgate_sender.as_ref() {
shipgate_sender.send(ShipMessage::AddUser(user.id)).await?;
}
clients.add(id, ClientState::new(user, settings, character, pkt.session)).await;
vec![SendShipPacket::LoginResponse(response), SendShipPacket::ShipBlockList(ShipBlockList::new(ship_name, num_blocks))]
},
Err(err) => {
vec![SendShipPacket::LoginResponse(LoginResponse::by_status(err, Session::new()))]
}
})
}