diff options
| author | troido <troido@protonmail.com> | 2020-04-08 15:43:57 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-08 15:43:57 +0200 |
| commit | d0d71818c70586d7e2fb806ced57f039bd1d12f6 (patch) | |
| tree | d2ec5f8f64476daa4e004b17e577694087ac8a32 /src | |
| parent | 7a4a62eb2804b6b19b4e71eee42d6b3d7ad08a3a (diff) | |
reject player if the savefile player id does not match actual player id
Diffstat (limited to 'src')
| -rw-r--r-- | src/gameserver.rs | 4 | ||||
| -rw-r--r-- | src/main.rs | 19 | ||||
| -rw-r--r-- | src/world.rs | 5 |
3 files changed, 23 insertions, 5 deletions
diff --git a/src/gameserver.rs b/src/gameserver.rs index 9778275..7136399 100644 --- a/src/gameserver.rs +++ b/src/gameserver.rs @@ -93,6 +93,10 @@ impl GameServer { } } + pub fn send_player_error(&mut self, player: &PlayerId, errname: &str, err_text: &str) -> Result<(), io::Error> { + self.send(player, json!(["error", errname, err_text])) + } + fn handle_message(&mut self, (serverid, connectionid): (usize, usize), msg: Message) -> Option<Action> { let id = (serverid, connectionid); match msg { diff --git a/src/main.rs b/src/main.rs index b4e8d82..3f2cc90 100644 --- a/src/main.rs +++ b/src/main.rs @@ -124,13 +124,22 @@ fn main(){ for action in actions { match action { Action::Input(player, control) => { - let _ = world.control_player(player, control); + if let Err(err) = world.control_player(player.clone(), control){ + println!("error controlling player {:?}: {:?}", player, err); + } } Action::Join(player) => { - world.add_player(&player).expect("can not add player"); + if let Err(err) = world.add_player(&player) { + println!("Error: can not add player {:?}: {:?}", player, err); + if let Err(senderr) = gameserver.send_player_error(&player, "worlderror", "invalid room or savefile") { + println!("Error: can not send error message to {:?}: {:?}", player, senderr); + } + } } Action::Leave(player) => { - world.remove_player(&player).expect("can not remove player"); + if let Err(err) = world.remove_player(&player) { + println!("Error: can not remove player {:?}: {:?}", player, err); + } message_cache.remove(&player); } } @@ -147,7 +156,9 @@ fn main(){ continue; } // println!("m {}", message.to_json()); - let _ = gameserver.send(&player, message.to_json()); + if let Err(err) = gameserver.send(&player, message.to_json()) { + println!("Error: failed to send to {:?}: {:?}", player, err); + } } count += 1; diff --git a/src/world.rs b/src/world.rs index 59b3aba..5105df2 100644 --- a/src/world.rs +++ b/src/world.rs @@ -66,7 +66,7 @@ impl <'a, 'b>World<'a, 'b> { } else { let mut room = Room::new(id.clone(), self.encyclopedia.clone(), None); let template = self.template_loader.load_room(id.clone())?; - room.load_from_template(&template); + room.load_from_template(&template)?; room }; if let Ok(state) = self.persistence.load_room(id.clone()){ @@ -96,6 +96,9 @@ impl <'a, 'b>World<'a, 'b> { .unwrap_or_else(|_err| // todo: what if player exists but can't be loaded for another reason? PlayerState::new(playerid.clone()) ); + if &state.id != playerid { + return Err(aerr!("Player ids do not match. Wanted {:?}, got {:?}", playerid, state.id)); + } if state.room == Some(purgatory::purgatory_id()){ state.respawn(); } |
