diff --git a/src/entity/account.rs b/src/entity/account.rs index d62f75e..7f45350 100644 --- a/src/entity/account.rs +++ b/src/entity/account.rs @@ -39,6 +39,7 @@ pub struct UserAccountEntity { pub muted_until: Option>, pub created_at: chrono::DateTime, pub flags: u32, // TODO: is this used for anything other than character creation? + pub activated: bool, } #[derive(Clone, Debug)] diff --git a/src/entity/gateway/postgres/models.rs b/src/entity/gateway/postgres/models.rs index ea8fc21..a987ba2 100644 --- a/src/entity/gateway/postgres/models.rs +++ b/src/entity/gateway/postgres/models.rs @@ -25,6 +25,7 @@ pub struct PgUserAccount { muted: Option>, created_at: chrono::DateTime, flags: i32, + activated: bool, } impl Into for PgUserAccount { @@ -37,9 +38,9 @@ impl Into for PgUserAccount { muted_until: self.muted, created_at: self.created_at, flags: self.flags as u32, - // TOOD guildcard: self.id as u32 + 1, team_id: None, + activated: self.activated } } } diff --git a/src/ship/packet/handler/auth.rs b/src/ship/packet/handler/auth.rs index a0cb15e..7cd5c20 100644 --- a/src/ship/packet/handler/auth.rs +++ b/src/ship/packet/handler/auth.rs @@ -15,21 +15,25 @@ pub async fn validate_login(id: ClientId, -> Result, ShipError> { 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 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 - .ok_or(ShipError::ClientNotFound(id))?; + if user.activated { + 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?; - item_manager.load_character(entity_gateway, &character).await; - clients.insert(id, ClientState::new(user, settings, character, pkt.session)); - vec![SendShipPacket::LoginResponse(response), SendShipPacket::ShipBlockList(ShipBlockList::new(&&ship_name, 3))] + item_manager.load_character(entity_gateway, &character).await; + clients.insert(id, ClientState::new(user, settings, character, pkt.session)); + vec![SendShipPacket::LoginResponse(response), SendShipPacket::ShipBlockList(ShipBlockList::new(&&ship_name, 3))] + } + else { + vec![SendShipPacket::LoginResponse(LoginResponse::by_status(AccountStatus::Locked, Session::new()))] + } }, Err(err) => { vec![SendShipPacket::LoginResponse(LoginResponse::by_status(err, Session::new()))]