on_connect/on_disconnect return results
This commit is contained in:
parent
99cc651fd9
commit
bacf309978
@ -224,15 +224,23 @@ async fn state_client_loop<STATE, S, R, E>(state: Arc<Mutex<STATE>>,
|
||||
match action {
|
||||
ClientAction::NewClient(client_id, sender) => {
|
||||
clients.insert(client_id, sender.clone());
|
||||
for action in state.on_connect(client_id).await {
|
||||
match action {
|
||||
OnConnect::Cipher((inc, outc)) => {
|
||||
sender.send(ServerStateAction::Cipher(inc, outc)).await;
|
||||
},
|
||||
OnConnect::Packet(pkt) => {
|
||||
sender.send(ServerStateAction::Packet(pkt)).await;
|
||||
let actions = state.on_connect(client_id).await;
|
||||
match actions {
|
||||
Ok(actions) => {
|
||||
for action in actions {
|
||||
match action {
|
||||
OnConnect::Cipher((inc, outc)) => {
|
||||
sender.send(ServerStateAction::Cipher(inc, outc)).await;
|
||||
},
|
||||
OnConnect::Packet(pkt) => {
|
||||
sender.send(ServerStateAction::Packet(pkt)).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
warn!("[client {:?} state on_connect error] {:?}", client_id, err);
|
||||
}
|
||||
}
|
||||
},
|
||||
ClientAction::Packet(client_id, pkt) => {
|
||||
@ -252,14 +260,21 @@ async fn state_client_loop<STATE, S, R, E>(state: Arc<Mutex<STATE>>,
|
||||
},
|
||||
ClientAction::Disconnect(client_id) => {
|
||||
let pkts = state.on_disconnect(client_id).await;
|
||||
for (client_id, pkt) in pkts {
|
||||
if let Some(client) = clients.get_mut(&client_id) {
|
||||
client.send(ServerStateAction::Packet(pkt)).await;
|
||||
}
|
||||
}
|
||||
match pkts {
|
||||
Ok(pkts) => {
|
||||
for (client_id, pkt) in pkts {
|
||||
if let Some(client) = clients.get_mut(&client_id) {
|
||||
client.send(ServerStateAction::Packet(pkt)).await;
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(client) = clients.get_mut(&client_id) {
|
||||
client.send(ServerStateAction::Disconnect).await;
|
||||
if let Some(client) = clients.get_mut(&client_id) {
|
||||
client.send(ServerStateAction::Disconnect).await;
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
warn!("[client {:?} state on_disconnect error] {:?}", client_id, err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,9 +24,9 @@ pub trait ServerState {
|
||||
type RecvPacket: RecvServerPacket;
|
||||
type PacketError;
|
||||
|
||||
async fn on_connect(&mut self, id: ClientId) -> Vec<OnConnect<Self::SendPacket>>;
|
||||
async fn on_connect(&mut self, id: ClientId) -> Result<Vec<OnConnect<Self::SendPacket>>, Self::PacketError>;
|
||||
async fn handle(&mut self, id: ClientId, pkt: &Self::RecvPacket)
|
||||
-> Result<Box<dyn Iterator<Item = (ClientId, Self::SendPacket)> + Send>, Self::PacketError>;
|
||||
async fn on_disconnect(&mut self, id: ClientId) -> Vec<(ClientId, Self::SendPacket)>;
|
||||
async fn on_disconnect(&mut self, id: ClientId) -> Result<Vec<(ClientId, Self::SendPacket)>, Self::PacketError>;
|
||||
}
|
||||
|
||||
|
@ -144,7 +144,7 @@ impl EntityGateway for PostgresGateway {
|
||||
}
|
||||
|
||||
async fn get_user_settings_by_user(&self, user: &UserAccountEntity) -> Result<UserSettingsEntity, GatewayError> {
|
||||
let settings = sqlx::query_as::<_, PgUserSettings>("select * from user_settings where id = $1")
|
||||
let settings = sqlx::query_as::<_, PgUserSettings>("select * from user_settings where user_account = $1")
|
||||
.bind(user.id.0)
|
||||
.fetch_one(&self.pool).await?;
|
||||
Ok(settings.into())
|
||||
|
@ -475,7 +475,7 @@ impl<EG: EntityGateway> ServerState for CharacterServerState<EG> {
|
||||
type RecvPacket = RecvCharacterPacket;
|
||||
type PacketError = CharacterError;
|
||||
|
||||
async fn on_connect(&mut self, id: ClientId) -> Vec<OnConnect<Self::SendPacket>> {
|
||||
async fn on_connect(&mut self, id: ClientId) -> Result<Vec<OnConnect<Self::SendPacket>>, CharacterError> {
|
||||
self.clients.insert(id, ClientState::new());
|
||||
|
||||
let mut rng = rand::thread_rng();
|
||||
@ -485,10 +485,10 @@ impl<EG: EntityGateway> ServerState for CharacterServerState<EG> {
|
||||
rng.fill(&mut server_key[..]);
|
||||
rng.fill(&mut client_key[..]);
|
||||
|
||||
vec![OnConnect::Packet(SendCharacterPacket::LoginWelcome(LoginWelcome::new(server_key, client_key))),
|
||||
Ok(vec![OnConnect::Packet(SendCharacterPacket::LoginWelcome(LoginWelcome::new(server_key, client_key))),
|
||||
OnConnect::Cipher((Box::new(PSOBBCipher::new(ELSEWHERE_PARRAY, ELSEWHERE_PRIVATE_KEY, client_key)),
|
||||
Box::new(PSOBBCipher::new(ELSEWHERE_PARRAY, ELSEWHERE_PRIVATE_KEY, server_key))))
|
||||
]
|
||||
])
|
||||
}
|
||||
|
||||
async fn handle(&mut self, id: ClientId, pkt: &RecvCharacterPacket)
|
||||
@ -535,14 +535,14 @@ impl<EG: EntityGateway> ServerState for CharacterServerState<EG> {
|
||||
})
|
||||
}
|
||||
|
||||
async fn on_disconnect(&mut self, id: ClientId) -> Vec<(ClientId, SendCharacterPacket)> {
|
||||
async fn on_disconnect(&mut self, id: ClientId) -> Result<Vec<(ClientId, SendCharacterPacket)>, CharacterError> {
|
||||
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;
|
||||
}
|
||||
}
|
||||
Vec::new()
|
||||
Ok(Vec::new())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -132,7 +132,7 @@ impl<EG: EntityGateway> ServerState for LoginServerState<EG> {
|
||||
type RecvPacket = RecvLoginPacket;
|
||||
type PacketError = LoginError;
|
||||
|
||||
async fn on_connect(&mut self, _id: ClientId) -> Vec<OnConnect<Self::SendPacket>> {
|
||||
async fn on_connect(&mut self, _id: ClientId) -> Result<Vec<OnConnect<Self::SendPacket>>, LoginError> {
|
||||
let mut rng = rand::thread_rng();
|
||||
|
||||
let mut server_key = [0u8; 48];
|
||||
@ -140,10 +140,10 @@ impl<EG: EntityGateway> ServerState for LoginServerState<EG> {
|
||||
rng.fill(&mut server_key[..]);
|
||||
rng.fill(&mut client_key[..]);
|
||||
|
||||
vec![OnConnect::Packet(SendLoginPacket::LoginWelcome(LoginWelcome::new(server_key, client_key))),
|
||||
Ok(vec![OnConnect::Packet(SendLoginPacket::LoginWelcome(LoginWelcome::new(server_key, client_key))),
|
||||
OnConnect::Cipher((Box::new(PSOBBCipher::new(ELSEWHERE_PARRAY, ELSEWHERE_PRIVATE_KEY, client_key)),
|
||||
Box::new(PSOBBCipher::new(ELSEWHERE_PARRAY, ELSEWHERE_PRIVATE_KEY, server_key))))
|
||||
]
|
||||
])
|
||||
}
|
||||
|
||||
async fn handle(&mut self, id: ClientId, pkt: &Self::RecvPacket)
|
||||
@ -159,14 +159,14 @@ impl<EG: EntityGateway> ServerState for LoginServerState<EG> {
|
||||
})
|
||||
}
|
||||
|
||||
async fn on_disconnect(&mut self, id: ClientId) -> Vec<(ClientId, SendLoginPacket)> {
|
||||
async fn on_disconnect(&mut self, id: ClientId) -> Result<Vec<(ClientId, SendLoginPacket)>, LoginError> {
|
||||
if let Some(username) = self.clients.remove(&id) {
|
||||
if let Ok(mut user) = self.entity_gateway.get_user_by_name(username).await {
|
||||
user.at_login = false;
|
||||
self.entity_gateway.save_user(&user).await;
|
||||
}
|
||||
}
|
||||
Vec::new()
|
||||
Ok(Vec::new())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -160,14 +160,14 @@ impl ServerState for PatchServerState {
|
||||
type RecvPacket = RecvPatchPacket;
|
||||
type PacketError = PatchError;
|
||||
|
||||
async fn on_connect(&mut self, _id: ClientId) -> Vec<OnConnect<Self::SendPacket>> {
|
||||
async fn on_connect(&mut self, _id: ClientId) -> Result<Vec<OnConnect<Self::SendPacket>>, PatchError> {
|
||||
let mut rng = rand::thread_rng();
|
||||
let key_in: u32 = rng.gen();
|
||||
let key_out: u32 = rng.gen();
|
||||
|
||||
vec![OnConnect::Packet(SendPatchPacket::PatchWelcome(PatchWelcome::new(key_out, key_in))),
|
||||
Ok(vec![OnConnect::Packet(SendPatchPacket::PatchWelcome(PatchWelcome::new(key_out, key_in))),
|
||||
OnConnect::Cipher((Box::new(PSOPCCipher::new(key_in)), Box::new(PSOPCCipher::new(key_out))))
|
||||
]
|
||||
])
|
||||
}
|
||||
|
||||
async fn handle(&mut self, id: ClientId, pkt: &RecvPatchPacket)
|
||||
@ -202,8 +202,8 @@ impl ServerState for PatchServerState {
|
||||
})
|
||||
}
|
||||
|
||||
async fn on_disconnect(&mut self, _id: ClientId) -> Vec<(ClientId, SendPatchPacket)> {
|
||||
Vec::new()
|
||||
async fn on_disconnect(&mut self, _id: ClientId) -> Result<Vec<(ClientId, SendPatchPacket)>, PatchError> {
|
||||
Ok(Vec::new())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -456,7 +456,7 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
|
||||
type RecvPacket = RecvShipPacket;
|
||||
type PacketError = ShipError;
|
||||
|
||||
async fn on_connect(&mut self, _id: ClientId) -> Vec<OnConnect<Self::SendPacket>> {
|
||||
async fn on_connect(&mut self, _id: ClientId) -> Result<Vec<OnConnect<Self::SendPacket>>, ShipError> {
|
||||
let mut rng = rand::thread_rng();
|
||||
|
||||
let mut server_key = [0u8; 48];
|
||||
@ -464,10 +464,10 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
|
||||
rng.fill(&mut server_key[..]);
|
||||
rng.fill(&mut client_key[..]);
|
||||
|
||||
vec![OnConnect::Packet(SendShipPacket::ShipWelcome(ShipWelcome::new(server_key, client_key))),
|
||||
Ok(vec![OnConnect::Packet(SendShipPacket::ShipWelcome(ShipWelcome::new(server_key, client_key))),
|
||||
OnConnect::Cipher((Box::new(PSOBBCipher::new(ELSEWHERE_PARRAY, ELSEWHERE_PRIVATE_KEY, client_key)),
|
||||
Box::new(PSOBBCipher::new(ELSEWHERE_PARRAY, ELSEWHERE_PRIVATE_KEY, server_key))))
|
||||
]
|
||||
])
|
||||
}
|
||||
|
||||
async fn handle(&mut self, id: ClientId, pkt: &RecvShipPacket)
|
||||
@ -577,7 +577,7 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
|
||||
})
|
||||
}
|
||||
|
||||
async fn on_disconnect(&mut self, id: ClientId) -> Vec<(ClientId, SendShipPacket)> {
|
||||
async fn on_disconnect(&mut self, id: ClientId) -> Result<Vec<(ClientId, SendShipPacket)>, ShipError> {
|
||||
// TODO: don't unwrap!
|
||||
let client = self.clients.get(&id).unwrap();
|
||||
let area_client = self.client_location.get_local_client(id).unwrap();
|
||||
@ -605,9 +605,9 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
|
||||
self.entity_gateway.save_user(&client.user).await;
|
||||
}
|
||||
|
||||
neighbors.into_iter().map(|n| {
|
||||
Ok(neighbors.into_iter().map(|n| {
|
||||
(n.client, pkt.clone())
|
||||
}).collect()
|
||||
}).collect())
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user