move validate_login
This commit is contained in:
parent
881b7c8e46
commit
4a01beb9e8
40
src/ship/packet/handler/auth.rs
Normal file
40
src/ship/packet/handler/auth.rs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use libpso::packet::login::{Login, LoginResponse, AccountStatus, Session};
|
||||||
|
use libpso::packet::ship::*;
|
||||||
|
use crate::common::serverstate::ClientId;
|
||||||
|
use crate::ship::ship::{SendShipPacket, ShipError, ClientState};
|
||||||
|
use crate::login::login::get_login_status;
|
||||||
|
use crate::entity::gateway::EntityGateway;
|
||||||
|
use crate::ship::items::ActiveItemDatabase;
|
||||||
|
|
||||||
|
pub fn validate_login<EG: EntityGateway>(id: ClientId,
|
||||||
|
pkt: &Login,
|
||||||
|
entity_gateway: &mut EG,
|
||||||
|
clients: &mut HashMap<ClientId, ClientState>,
|
||||||
|
item_database: &mut ActiveItemDatabase,
|
||||||
|
ship_name: &String)
|
||||||
|
-> Result<Vec<SendShipPacket>, ShipError> {
|
||||||
|
Ok(match get_login_status(entity_gateway, pkt) {
|
||||||
|
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);
|
||||||
|
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)
|
||||||
|
.ok_or(ShipError::ClientNotFound(id))?;
|
||||||
|
let inventory = item_database.get_character_inventory(entity_gateway, &character);
|
||||||
|
|
||||||
|
clients.insert(id, ClientState::new(user, settings, character, inventory, pkt.session));
|
||||||
|
vec![SendShipPacket::LoginResponse(response), SendShipPacket::ShipBlockList(ShipBlockList::new(&&ship_name, 3))]
|
||||||
|
},
|
||||||
|
Err(err) => {
|
||||||
|
vec![SendShipPacket::LoginResponse(LoginResponse::by_status(err, Session::new()))]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -12,7 +12,8 @@ pub fn send_player_to_lobby(id: ClientId,
|
|||||||
_pkt: &CharData,
|
_pkt: &CharData,
|
||||||
client_location: &mut ClientLocation,
|
client_location: &mut ClientLocation,
|
||||||
clients: &HashMap<ClientId, ClientState>,
|
clients: &HashMap<ClientId, ClientState>,
|
||||||
level_table: &CharacterLevelTable) -> Result<Vec<(ClientId, SendShipPacket)>, ShipError> {
|
level_table: &CharacterLevelTable)
|
||||||
|
-> Result<Vec<(ClientId, SendShipPacket)>, ShipError> {
|
||||||
let lobby = client_location.add_client_to_next_available_lobby(id, LobbyId(0)).map_err(|_| ShipError::TooManyClients)?;
|
let lobby = client_location.add_client_to_next_available_lobby(id, LobbyId(0)).map_err(|_| ShipError::TooManyClients)?;
|
||||||
let lobby_clients = client_location.get_clients_in_lobby(lobby).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let lobby_clients = client_location.get_clients_in_lobby(lobby).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
||||||
let playerinfo = lobby_clients.iter()
|
let playerinfo = lobby_clients.iter()
|
||||||
|
@ -1 +1,2 @@
|
|||||||
|
pub mod auth;
|
||||||
pub mod lobby;
|
pub mod lobby;
|
||||||
|
@ -20,7 +20,6 @@ use crate::entity::gateway::EntityGateway;
|
|||||||
use crate::entity::account::{UserAccountEntity, UserSettingsEntity, USERFLAG_NEWCHAR, USERFLAG_DRESSINGROOM};
|
use crate::entity::account::{UserAccountEntity, UserSettingsEntity, USERFLAG_NEWCHAR, USERFLAG_DRESSINGROOM};
|
||||||
use crate::entity::character::CharacterEntity;
|
use crate::entity::character::CharacterEntity;
|
||||||
use crate::entity::item::{ItemLocation, ItemEntity};
|
use crate::entity::item::{ItemLocation, ItemEntity};
|
||||||
use crate::login::login::get_login_status;
|
|
||||||
use crate::ship::location::{ClientLocation, LobbyId, RoomId, RoomLobby, MAX_ROOMS};
|
use crate::ship::location::{ClientLocation, LobbyId, RoomId, RoomLobby, MAX_ROOMS};
|
||||||
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
|
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
|
||||||
use crate::ship::items;
|
use crate::ship::items;
|
||||||
@ -146,7 +145,7 @@ pub struct ClientState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ClientState {
|
impl ClientState {
|
||||||
fn new(user: UserAccountEntity, settings: UserSettingsEntity, character: CharacterEntity, inventory: items::ActiveInventory, /*bank: Bank,*/ session: Session) -> ClientState {
|
pub fn new(user: UserAccountEntity, settings: UserSettingsEntity, character: CharacterEntity, inventory: items::ActiveInventory, /*bank: Bank,*/ session: Session) -> ClientState {
|
||||||
ClientState {
|
ClientState {
|
||||||
user: user,
|
user: user,
|
||||||
settings: settings,
|
settings: settings,
|
||||||
@ -183,30 +182,6 @@ impl<EG: EntityGateway> ShipServerState<EG> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn validate_login(&mut self, id: ClientId, pkt: &Login) -> Result<Vec<SendShipPacket>, ShipError> {
|
|
||||||
Ok(match get_login_status(&self.entity_gateway, pkt) {
|
|
||||||
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 = self.entity_gateway.get_characters_by_user(&user);
|
|
||||||
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 = self.entity_gateway.get_user_settings_by_user(&user)
|
|
||||||
.ok_or(ShipError::ClientNotFound(id))?;
|
|
||||||
let inventory = self.item_database.get_character_inventory(&mut self.entity_gateway, &character);
|
|
||||||
|
|
||||||
self.clients.insert(id, ClientState::new(user, settings, character, inventory, pkt.session));
|
|
||||||
vec![SendShipPacket::LoginResponse(response), SendShipPacket::ShipBlockList(ShipBlockList::new(&self.name, 3))]
|
|
||||||
},
|
|
||||||
Err(err) => {
|
|
||||||
vec![SendShipPacket::LoginResponse(LoginResponse::by_status(err, Session::new()))]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn block_selected(&mut self, id: ClientId, pkt: &MenuSelect) -> Result<Vec<SendShipPacket>, ShipError> {
|
fn block_selected(&mut self, id: ClientId, pkt: &MenuSelect) -> Result<Vec<SendShipPacket>, ShipError> {
|
||||||
let client = self.clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?;
|
let client = self.clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?;
|
||||||
@ -598,7 +573,7 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
|
|||||||
-> Result<Box<dyn Iterator<Item = (ClientId, SendShipPacket)> + Send>, ShipError> {
|
-> Result<Box<dyn Iterator<Item = (ClientId, SendShipPacket)> + Send>, ShipError> {
|
||||||
Ok(match pkt {
|
Ok(match pkt {
|
||||||
RecvShipPacket::Login(login) => {
|
RecvShipPacket::Login(login) => {
|
||||||
Box::new(self.validate_login(id, login)?.into_iter().map(move |pkt| (id, pkt)))
|
Box::new(handler::auth::validate_login(id, login, &mut self.entity_gateway, &mut self.clients, &mut self.item_database, &self.name)?.into_iter().map(move |pkt| (id, pkt)))
|
||||||
},
|
},
|
||||||
RecvShipPacket::MenuSelect(menuselect) => {
|
RecvShipPacket::MenuSelect(menuselect) => {
|
||||||
match menuselect.menu {
|
match menuselect.menu {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user