don't crash client when bot crashes
This commit is contained in:
parent
d0948b54f4
commit
b75c0e15dc
3 changed files with 25 additions and 3 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1568,6 +1568,7 @@ dependencies = [
|
||||||
"prost",
|
"prost",
|
||||||
"serde",
|
"serde",
|
||||||
"shlex",
|
"shlex",
|
||||||
|
"thiserror",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-stream",
|
"tokio-stream",
|
||||||
"toml",
|
"toml",
|
||||||
|
|
|
@ -15,6 +15,7 @@ toml = "0.5"
|
||||||
planetwars-matchrunner = { path = "../planetwars-matchrunner" }
|
planetwars-matchrunner = { path = "../planetwars-matchrunner" }
|
||||||
clap = { version = "3.2", features = ["derive", "env"]}
|
clap = { version = "3.2", features = ["derive", "env"]}
|
||||||
shlex = "1.1"
|
shlex = "1.1"
|
||||||
|
thiserror = "1.0"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
tonic-build = "0.7.2"
|
tonic-build = "0.7.2"
|
||||||
|
|
|
@ -79,7 +79,12 @@ async fn main() {
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
run_player(bot_config, created_match.player_key, channel).await;
|
match run_player(bot_config, created_match.player_key, channel).await {
|
||||||
|
Ok(()) => (),
|
||||||
|
Err(RunPlayerError::RunBotError(err)) => {
|
||||||
|
println!("Error running bot: {}", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
println!(
|
println!(
|
||||||
"Match completed. Watch the replay at {}",
|
"Match completed. Watch the replay at {}",
|
||||||
created_match.match_url
|
created_match.match_url
|
||||||
|
@ -102,7 +107,17 @@ async fn create_match(
|
||||||
res.map(|response| response.into_inner())
|
res.map(|response| response.into_inner())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn run_player(bot_config: BotConfig, player_key: String, channel: Channel) {
|
#[derive(thiserror::Error, Debug)]
|
||||||
|
enum RunPlayerError {
|
||||||
|
#[error("error running bot")]
|
||||||
|
RunBotError(std::io::Error),
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn run_player(
|
||||||
|
bot_config: BotConfig,
|
||||||
|
player_key: String,
|
||||||
|
channel: Channel,
|
||||||
|
) -> Result<(), RunPlayerError> {
|
||||||
let mut client = ClientApiServiceClient::with_interceptor(channel, |mut req: Request<()>| {
|
let mut client = ClientApiServiceClient::with_interceptor(channel, |mut req: Request<()>| {
|
||||||
let player_key: MetadataValue<_> = player_key.parse().unwrap();
|
let player_key: MetadataValue<_> = player_key.parse().unwrap();
|
||||||
req.metadata_mut().insert("player_key", player_key);
|
req.metadata_mut().insert("player_key", player_key);
|
||||||
|
@ -128,7 +143,10 @@ async fn run_player(bot_config: BotConfig, player_key: String, channel: Channel)
|
||||||
while let Some(message) = stream.message().await.unwrap() {
|
while let Some(message) = stream.message().await.unwrap() {
|
||||||
match message.server_message {
|
match message.server_message {
|
||||||
Some(pb::PlayerApiServerMessageType::ActionRequest(req)) => {
|
Some(pb::PlayerApiServerMessageType::ActionRequest(req)) => {
|
||||||
let moves = bot_process.communicate(&req.content).await.unwrap();
|
let moves = bot_process
|
||||||
|
.communicate(&req.content)
|
||||||
|
.await
|
||||||
|
.map_err(RunPlayerError::RunBotError)?;
|
||||||
let action = pb::PlayerAction {
|
let action = pb::PlayerAction {
|
||||||
action_request_id: req.action_request_id,
|
action_request_id: req.action_request_id,
|
||||||
content: moves.as_bytes().to_vec(),
|
content: moves.as_bytes().to_vec(),
|
||||||
|
@ -141,4 +159,6 @@ async fn run_player(bot_config: BotConfig, player_key: String, channel: Channel)
|
||||||
_ => {} // pass
|
_ => {} // pass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue