diff -r f748a72432f2 -r d79795acaa73 gameServer2/src/protocol/parser.rs --- a/gameServer2/src/protocol/parser.rs Fri Jul 06 21:03:03 2018 +0300 +++ b/gameServer2/src/protocol/parser.rs Sat Jul 07 20:22:31 2018 +0300 @@ -18,7 +18,7 @@ test::gen_proto_msg }; use server::coretypes::{ - HedgehogInfo, TeamInfo, GameCfg + HedgehogInfo, TeamInfo, GameCfg, VoteType }; named!(end_of_message, tag!("\n\n")); @@ -26,6 +26,9 @@ named!( a_line<&[u8], String>, map!(str_line, String::from)); named!( u8_line<&[u8], u8>, map_res!(str_line, FromStr::from_str)); named!(u32_line<&[u8], u32>, map_res!(str_line, FromStr::from_str)); +named!(yes_no_line<&[u8], bool>, alt!( + do_parse!(tag_no_case!("YES") >> (true)) + | do_parse!(tag_no_case!("NO") >> (false)))); named!(opt_param<&[u8], Option >, alt!( do_parse!(peek!(tag!("\n\n")) >> (None)) | do_parse!(tag!("\n") >> s: str_line >> (Some(s.to_string()))))); @@ -42,6 +45,18 @@ h5: hog_line >> eol >> h6: hog_line >> eol >> h7: hog_line >> eol >> h8: hog_line >> ([h1, h2, h3, h4, h5, h6, h7, h8]))); +named!(voting<&[u8], VoteType>, alt!( + do_parse!(tag_no_case!("KICK") >> spaces >> n: a_line >> + (VoteType::Kick(n))) + | do_parse!(tag_no_case!("MAP") >> + n: opt!(preceded!(spaces, a_line)) >> + (VoteType::Map(n))) + | do_parse!(tag_no_case!("PAUSE") >> + (VoteType::Pause)) + | do_parse!(tag_no_case!("NEWSEED") >> + (VoteType::NewSeed)) + | do_parse!(tag_no_case!("HEDGEHOGS") >> spaces >> n: u8_line >> + (VoteType::HedgehogsPerTeam(n))))); /** Recognizes messages which do not take any parameters */ named!(basic_message<&[u8], HWProtocolMessage>, alt!( @@ -94,10 +109,12 @@ | do_parse!(tag_no_case!("GLOBAL") >> spaces >> m: a_line >> (Global(m))) | do_parse!(tag_no_case!("WATCH") >> spaces >> i: a_line >> (Watch(i))) | do_parse!(tag_no_case!("GREETING") >> spaces >> m: a_line >> (Greeting(m))) - | do_parse!(tag_no_case!("VOTE") >> spaces >> m: a_line >> (Vote(m))) - | do_parse!(tag_no_case!("FORCE") >> spaces >> m: a_line >> (ForceVote(m))) + | do_parse!(tag_no_case!("VOTE") >> spaces >> m: yes_no_line >> (Vote(m))) + | do_parse!(tag_no_case!("FORCE") >> spaces >> m: yes_no_line >> (ForceVote(m))) | do_parse!(tag_no_case!("INFO") >> spaces >> n: a_line >> (Info(n))) | do_parse!(tag_no_case!("MAXTEAMS") >> spaces >> n: u8_line >> (MaxTeams(n))) + | do_parse!(tag_no_case!("CALLVOTE") >> + v: opt!(preceded!(spaces, voting)) >> (CallVote(v))) | do_parse!( tag_no_case!("RND") >> alt!(spaces | peek!(end_of_message)) >> v: str_line >>