Browse Source

basic multiple login check

pbs
jake 4 years ago
parent
commit
fe03515871
  1. 22
      src/login/character.rs
  2. 2
      src/ship/packet/builder/lobby.rs

22
src/login/character.rs

@ -323,10 +323,13 @@ impl<EG: EntityGateway> CharacterServerState<EG> {
Ok(user) => { Ok(user) => {
if let Some(connected_client) = self.connected_clients.get(&user.id) { if let Some(connected_client) = self.connected_clients.get(&user.id) {
if let Some(expires) = connected_client.expires { if let Some(expires) = connected_client.expires {
if expires < chrono::Utc::now() {
if expires > chrono::Utc::now() {
return Ok(vec![SendCharacterPacket::LoginResponse(LoginResponse::by_status(AccountStatus::AlreadyOnline, Session::new()))]); return Ok(vec![SendCharacterPacket::LoginResponse(LoginResponse::by_status(AccountStatus::AlreadyOnline, Session::new()))]);
} }
} }
else {
return Ok(vec![SendCharacterPacket::LoginResponse(LoginResponse::by_status(AccountStatus::AlreadyOnline, Session::new()))]);
}
} }
let mut response = LoginResponse::by_status(AccountStatus::Ok, Session::new()); let mut response = LoginResponse::by_status(AccountStatus::Ok, Session::new());
@ -337,7 +340,7 @@ impl<EG: EntityGateway> CharacterServerState<EG> {
self.connected_clients.insert(user.id.clone(), ConnectedClient { self.connected_clients.insert(user.id.clone(), ConnectedClient {
ship_id: None, ship_id: None,
expires: Some(chrono::Utc::now() + chrono::Duration::minutes(1)),
expires: None, //Some(chrono::Utc::now() + chrono::Duration::minutes(1)),
}); });
client.user = Some(user); client.user = Some(user);
@ -509,11 +512,19 @@ impl<EG: EntityGateway> CharacterServerState<EG> {
]) ])
} }
fn select_ship(&mut self, menuselect: &MenuSelect) -> Result<Vec<SendCharacterPacket>, anyhow::Error> {
fn select_ship(&mut self, id: ClientId, menuselect: &MenuSelect) -> Result<Vec<SendCharacterPacket>, anyhow::Error> {
if menuselect.menu != SHIP_MENU_ID { if menuselect.menu != SHIP_MENU_ID {
Err(CharacterError::InvalidMenuSelection(menuselect.menu, menuselect.item))?; Err(CharacterError::InvalidMenuSelection(menuselect.menu, menuselect.item))?;
} }
if let Some(client) = self.clients.get(&id) {
if let Some(user) = &client.user {
if let Some(cc) = self.connected_clients.get_mut(&user.id) {
cc.ship_id = Some(ServerId(menuselect.item as usize));
}
}
}
let ship = self.ships.get(&ServerId(menuselect.item as usize)) let ship = self.ships.get(&ServerId(menuselect.item as usize))
.ok_or(CharacterError::InvalidMenuSelection(menuselect.menu, menuselect.item))?; .ok_or(CharacterError::InvalidMenuSelection(menuselect.menu, menuselect.item))?;
Ok(vec![SendCharacterPacket::RedirectClient(RedirectClient::new(u32::from_le_bytes(ship.ip.octets()), ship.port))]) Ok(vec![SendCharacterPacket::RedirectClient(RedirectClient::new(u32::from_le_bytes(ship.ip.octets()), ship.port))])
@ -604,9 +615,8 @@ impl<EG: EntityGateway> ServerState for CharacterServerState<EG> {
async fn on_disconnect(&mut self, id: ClientId) -> Result<Vec<(ClientId, SendCharacterPacket)>, anyhow::Error> { async fn on_disconnect(&mut self, id: ClientId) -> Result<Vec<(ClientId, SendCharacterPacket)>, anyhow::Error> {
if let Some(client) = self.clients.remove(&id) { if let Some(client) = self.clients.remove(&id) {
if let Some(mut user) = client.user {
user.at_character= false;
self.entity_gateway.save_user(&user).await;
if let Some(user) = client.user {
self.connected_clients.remove(&user.id);
} }
} }
Ok(Vec::new()) Ok(Vec::new())

2
src/ship/packet/builder/lobby.rs

@ -13,7 +13,7 @@ pub fn join_lobby(id: ClientId,
clients: &Clients, clients: &Clients,
item_manager: &ItemManager, item_manager: &ItemManager,
level_table: &CharacterLevelTable) level_table: &CharacterLevelTable)
-> Result<JoinLobby, ShipError> {
-> Result<JoinLobby, anyhow::Error> {
let lobby_clients = client_location.get_clients_in_lobby(lobby).map_err(|err| -> ClientLocationError { err.into() })?; let lobby_clients = client_location.get_clients_in_lobby(lobby).map_err(|err| -> ClientLocationError { err.into() })?;
let playerinfo = lobby_clients.iter() let playerinfo = lobby_clients.iter()
.map(|area_client| { .map(|area_client| {

Loading…
Cancel
Save