rust/hedgewars-checker/src/main.rs
author unc0rr
Wed, 30 Jun 2021 23:06:54 +0200
changeset 15811 a855f32ab3ca
parent 14396 694c96fb3a06
child 15812 8c39a11f7756
permissions -rw-r--r--
- Update hedgewars-network-protocol library with messages needed for checker - Use the library in hedgewars-checker
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
     1
use anyhow::{bail, Result};
13952
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
     2
use argparse::{ArgumentParser, Store};
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
     3
use hedgewars_network_protocol::{
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
     4
    messages::HwProtocolMessage as ClientMessage, messages::HwServerMessage::*, parser,
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
     5
};
13952
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
     6
use ini::Ini;
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
     7
use log::{debug, info, warn};
13952
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
     8
use netbuf::Buf;
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
     9
use std::{io::Write, net::TcpStream, process::Command, str::FromStr};
13953
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    10
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    11
fn check(executable: &str, data_prefix: &str, buffer: &[String]) -> Result<Vec<String>> {
13953
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    12
    let mut replay = tempfile::NamedTempFile::new()?;
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    13
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    14
    for line in buffer.into_iter() {
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    15
        replay.write(&base64::decode(line)?)?;
13953
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    16
    }
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    17
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    18
    let temp_file_path = replay.path();
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    19
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    20
    let mut home_dir = dirs::home_dir().unwrap();
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    21
    home_dir.push(".hedgewars");
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    22
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    23
    debug!("Checking replay in {}", temp_file_path.to_string_lossy());
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    24
13953
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    25
    let output = Command::new(executable)
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    26
        .arg("--user-prefix")
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    27
        .arg(&home_dir)
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    28
        .arg("--prefix")
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    29
        .arg(data_prefix)
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    30
        .arg("--nomusic")
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    31
        .arg("--nosound")
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    32
        .arg("--stats-only")
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    33
        .arg(temp_file_path)
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    34
        .output()?;
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    35
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    36
    let mut result = Vec::new();
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    37
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    38
    let mut engine_lines = output
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    39
        .stderr
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    40
        .split(|b| *b == '\n' as u8)
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    41
        .skip_while(|l| *l != b"WINNERS" && *l != b"DRAW");
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    42
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    43
    loop {
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    44
        match engine_lines.next() {
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    45
            Some(b"DRAW") => result.push("DRAW".to_owned()),
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    46
            Some(b"WINNERS") => {
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    47
                result.push("WINNERS".to_owned());
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    48
                let winners = engine_lines.next().unwrap();
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    49
                let winners_num = u32::from_str(&String::from_utf8(winners.to_vec())?)?;
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    50
                result.push(String::from_utf8(winners.to_vec())?);
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    51
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    52
                for _i in 0..winners_num {
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    53
                    result.push(String::from_utf8(engine_lines.next().unwrap().to_vec())?);
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    54
                }
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    55
            }
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    56
            Some(b"GHOST_POINTS") => {
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    57
                result.push("GHOST_POINTS".to_owned());
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    58
                let points = engine_lines.next().unwrap();
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    59
                let points_num = u32::from_str(&String::from_utf8(points.to_vec())?)? * 2;
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    60
                result.push(String::from_utf8(points.to_vec())?);
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    61
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    62
                for _i in 0..points_num {
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    63
                    result.push(String::from_utf8(engine_lines.next().unwrap().to_vec())?);
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    64
                }
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    65
            }
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    66
            Some(b"ACHIEVEMENT") => {
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    67
                result.push("ACHIEVEMENT".to_owned());
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    68
                for _i in 0..4 {
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    69
                    result.push(String::from_utf8(engine_lines.next().unwrap().to_vec())?);
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    70
                }
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    71
            }
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    72
            _ => break,
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    73
        }
13953
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    74
    }
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    75
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    76
    if result.len() > 0 {
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    77
        Ok(result)
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    78
    } else {
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    79
        bail!("no data from engine")
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
    80
    }
13953
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    81
}
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
    82
13952
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    83
fn connect_and_run(
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    84
    username: &str,
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    85
    password: &str,
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    86
    protocol_number: u16,
13952
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    87
    executable: &str,
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    88
    data_prefix: &str,
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
    89
) -> Result<()> {
13952
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    90
    info!("Connecting...");
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    91
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    92
    let mut stream = TcpStream::connect("hedgewars.org:46631")?;
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    93
    stream.set_nonblocking(false)?;
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    94
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    95
    let mut buf = Buf::new();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    96
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    97
    loop {
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    98
        buf.read_from(&mut stream)?;
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
    99
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   100
        while let Ok((tail, msg)) = parser::server_message(buf.as_ref()) {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   101
            buf.consume(buf.len() - tail.len());
13953
e98e2fc556a7 Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
unc0rr
parents: 13952
diff changeset
   102
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   103
            match msg {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   104
                Connected(_, _) => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   105
                    info!("Connected");
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   106
                    stream.write(
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   107
                        ClientMessage::Checker(
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   108
                            protocol_number,
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   109
                            username.to_owned(),
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   110
                            password.to_owned(),
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   111
                        )
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   112
                        .to_raw_protocol()
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   113
                        .as_bytes(),
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   114
                    )?;
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   115
                }
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   116
                Ping => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   117
                    stream.write(ClientMessage::Pong.to_raw_protocol().as_bytes())?;
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   118
                }
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   119
                LogonPassed => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   120
                    stream.write(ClientMessage::CheckerReady.to_raw_protocol().as_bytes())?;
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   121
                }
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   122
                Replay(lines) => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   123
                    info!("Got a replay");
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   124
                    match check(executable, data_prefix, &lines) {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   125
                        Ok(result) => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   126
                            info!("Checked");
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   127
                            debug!("Check result: [{:?}]", result);
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   128
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   129
                            stream.write(
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   130
                                ClientMessage::CheckedOk(result)
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   131
                                    .to_raw_protocol()
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   132
                                    .as_bytes(),
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   133
                            )?;
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   134
                            stream
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   135
                                .write(ClientMessage::CheckerReady.to_raw_protocol().as_bytes())?;
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   136
                        }
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   137
                        Err(e) => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   138
                            info!("Check failed: {:?}", e);
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   139
                            stream.write(
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   140
                                ClientMessage::CheckedFail("error".to_owned())
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   141
                                    .to_raw_protocol()
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   142
                                    .as_bytes(),
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   143
                            )?;
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   144
                            stream
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   145
                                .write(ClientMessage::CheckerReady.to_raw_protocol().as_bytes())?;
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   146
                        }
13955
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
   147
                    }
a857cd1cc3f0 Finish hedgewars-checker implementation
unc0rr
parents: 13953
diff changeset
   148
                }
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   149
                Bye(message) => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   150
                    warn!("Received BYE: {}", message);
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   151
                    return Ok(());
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   152
                }
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   153
                ChatMsg { nick, msg } => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   154
                    info!("Chat [{}]: {}", nick, msg);
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   155
                }
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   156
                RoomAdd(fields) => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   157
                    let mut l = fields.into_iter();
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   158
                    info!("Room added: {}", l.skip(1).next().unwrap());
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   159
                }
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   160
                RoomUpdated(name, fields) => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   161
                    let mut l = fields.into_iter();
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   162
                    let new_name = l.skip(1).next().unwrap();
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   163
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   164
                    if (name != new_name) {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   165
                        info!("Room renamed: {}", new_name);
13957
a4877a16564d Also report chat and added rooms in log
unc0rr
parents: 13955
diff changeset
   166
                    }
a4877a16564d Also report chat and added rooms in log
unc0rr
parents: 13955
diff changeset
   167
                }
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   168
                RoomRemove(_) => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   169
                    // ignore
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   170
                }
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   171
                Error(message) => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   172
                    warn!("Received ERROR: {}", message);
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   173
                    return Ok(());
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   174
                }
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   175
                something => {
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   176
                    warn!("Unexpected protocol command: {:?}", something)
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   177
                }
13952
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   178
            }
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   179
        }
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   180
    }
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   181
}
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   182
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   183
fn get_protocol_number(executable: &str) -> std::io::Result<u16> {
13952
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   184
    let output = Command::new(executable).arg("--protocol").output()?;
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   185
15811
a855f32ab3ca - Update hedgewars-network-protocol library with messages needed for checker
unc0rr
parents: 14396
diff changeset
   186
    Ok(u16::from_str(&String::from_utf8(output.stdout).unwrap().trim()).unwrap_or(55))
13952
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   187
}
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   188
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   189
fn main() {
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   190
    stderrlog::new()
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   191
        .verbosity(3)
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   192
        .timestamp(stderrlog::Timestamp::Second)
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   193
        .module(module_path!())
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   194
        .init()
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   195
        .unwrap();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   196
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   197
    let mut frontend_settings = dirs::home_dir().unwrap();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   198
    frontend_settings.push(".hedgewars/settings.ini");
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   199
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   200
    let i = Ini::load_from_file(frontend_settings.to_str().unwrap()).unwrap();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   201
    let username = i.get_from(Some("net"), "nick").unwrap();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   202
    let password = i.get_from(Some("net"), "passwordhash").unwrap();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   203
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   204
    let mut exe = "/usr/local/bin/hwengine".to_string();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   205
    let mut prefix = "/usr/local/share/hedgewars/Data".to_string();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   206
    {
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   207
        let mut ap = ArgumentParser::new();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   208
        ap.set_description("Game replay checker for hedgewars.");
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   209
        ap.refer(&mut exe)
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   210
            .add_option(&["--exe"], Store, "Path to hwengine executable");
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   211
        ap.refer(&mut prefix)
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   212
            .add_option(&["--prefix"], Store, "Path main Data dir");
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   213
        ap.parse_args_or_exit();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   214
    }
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   215
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   216
    info!("Executable: {}", exe);
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   217
    info!("Data dir: {}", prefix);
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   218
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   219
    let protocol_number = get_protocol_number(&exe.as_str()).unwrap_or_default();
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   220
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   221
    info!("Using protocol number {}", protocol_number);
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   222
14207
bb2f301d4fe0 2018ize everything
alfadur
parents: 13957
diff changeset
   223
    connect_and_run(&username, &password, protocol_number, &exe, &prefix).unwrap();
13952
d12ca66054aa Start checker implementation in rust
unc0rr
parents:
diff changeset
   224
}