1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 18:24:05 +02:00
This commit is contained in:
Robin Appelman 2019-03-05 00:06:25 +01:00
commit f07770f206
7 changed files with 3513 additions and 2130 deletions

File diff suppressed because it is too large Load diff

View file

@ -3,12 +3,12 @@ use std::iter::FromIterator;
use bitstream_reader::{BitRead, BitReadSized, LittleEndian}; use bitstream_reader::{BitRead, BitReadSized, LittleEndian};
use crate::{Parse, ParseError, ParserState, ReadResult, Result, Stream};
use crate::demo::gameevent_gen::GameEventType; use crate::demo::gameevent_gen::GameEventType;
use crate::demo::gamevent::{ use crate::demo::gamevent::{
GameEvent, GameEventDefinition, GameEventEntry, GameEventValue, GameEventValueType, GameEvent, GameEventDefinition, GameEventEntry, GameEventValue, GameEventValueType,
RawGameEvent, RawGameEvent,
}; };
use crate::{Parse, ParseError, ParserState, ReadResult, Result, Stream};
fn read_event_value(stream: &mut Stream, definition: &GameEventEntry) -> Result<GameEventValue> { fn read_event_value(stream: &mut Stream, definition: &GameEventEntry) -> Result<GameEventValue> {
Ok(match definition.kind { Ok(match definition.kind {
@ -40,7 +40,10 @@ impl Parse for GameEventMessage {
values.push(read_event_value(&mut data, &entry)?); values.push(read_event_value(&mut data, &entry)?);
} }
RawGameEvent { event_type: definition.event_type, values } RawGameEvent {
event_type: definition.event_type,
values,
}
} }
None => unreachable!(), None => unreachable!(),
}; };
@ -65,7 +68,7 @@ pub struct GameEventListMessage {
impl BitRead<LittleEndian> for GameEventDefinition { impl BitRead<LittleEndian> for GameEventDefinition {
fn read(stream: &mut Stream) -> ReadResult<Self> { fn read(stream: &mut Stream) -> ReadResult<Self> {
let event_type:GameEventTypeId = stream.read()?; let event_type: GameEventTypeId = stream.read()?;
let name: String = stream.read()?; let name: String = stream.read()?;
let mut entries = Vec::new(); let mut entries = Vec::new();

View file

@ -121,9 +121,7 @@ impl BitRead<LittleEndian> for ChatMessageKind {
"TF_Chat_Team_Dead" => ChatMessageKind::ChatTeamDead, "TF_Chat_Team_Dead" => ChatMessageKind::ChatTeamDead,
"#TF_Name_Change" => ChatMessageKind::NameChange, "#TF_Name_Change" => ChatMessageKind::NameChange,
"TF_Chat_All" => ChatMessageKind::ChatAll, "TF_Chat_All" => ChatMessageKind::ChatAll,
_ => { _ => unreachable!("unknown chat kind"),
unreachable!("unknown chat kind")
},
}) })
} }
} }

View file

@ -4,16 +4,16 @@ use std::thread::spawn;
use serde::Serialize; use serde::Serialize;
use serde_repr::Serialize_repr; use serde_repr::Serialize_repr;
use crate::{ParserState, ReadResult, Stream};
use crate::demo::gameevent_gen::{ use crate::demo::gameevent_gen::{
GameEvent, PlayerDeathEvent, PlayerSpawnEvent, TeamPlayRoundWinEvent, GameEvent, PlayerDeathEvent, PlayerSpawnEvent, TeamPlayRoundWinEvent,
}; };
use crate::demo::message::{Message, MessageType};
use crate::demo::message::packetentities::EntityId; use crate::demo::message::packetentities::EntityId;
use crate::demo::message::usermessage::{ChatMessageKind, SayText2Message, UserMessage}; use crate::demo::message::usermessage::{ChatMessageKind, SayText2Message, UserMessage};
use crate::demo::message::{Message, MessageType};
use crate::demo::packet::stringtable::StringTableEntry; use crate::demo::packet::stringtable::StringTableEntry;
use crate::demo::parser::handler::{MessageHandler, StringTableEntryHandler}; use crate::demo::parser::handler::{MessageHandler, StringTableEntryHandler};
use crate::demo::vector::Vector; use crate::demo::vector::Vector;
use crate::{ParserState, ReadResult, Stream};
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
pub struct ChatMassage { pub struct ChatMassage {
@ -295,7 +295,10 @@ pub struct UserState {
} }
impl UserState { impl UserState {
pub fn from_users_and_spawn(users: HashMap<UserId, UserInfo>, spawns: Vec<Spawn>) -> HashMap<UserId, Self> { pub fn from_users_and_spawn(
users: HashMap<UserId, UserInfo>,
spawns: Vec<Spawn>,
) -> HashMap<UserId, Self> {
let mut teams: HashMap<UserId, Team> = HashMap::with_capacity(users.len()); let mut teams: HashMap<UserId, Team> = HashMap::with_capacity(users.len());
let mut classes: HashMap<UserId, HashMap<Class, u8>> = HashMap::with_capacity(9); let mut classes: HashMap<UserId, HashMap<Class, u8>> = HashMap::with_capacity(9);
for spawn in spawns { for spawn in spawns {
@ -305,15 +308,21 @@ impl UserState {
*class_spawns += 1; *class_spawns += 1;
} }
users.into_iter().map(|(user_id, user)| { users
(user_id, UserState { .into_iter()
.map(|(user_id, user)| {
(
user_id,
UserState {
classes: classes.remove(&user.user_id).unwrap_or(HashMap::new()), classes: classes.remove(&user.user_id).unwrap_or(HashMap::new()),
team: teams.remove(&user.user_id).unwrap_or(Team::Other), team: teams.remove(&user.user_id).unwrap_or(Team::Other),
name: user.name, name: user.name,
user_id: user.user_id, user_id: user.user_id,
steam_id: user.steam_id, steam_id: user.steam_id,
},
)
}) })
}).collect() .collect()
} }
} }

View file

@ -4,8 +4,8 @@ use std::rc::Rc;
use crate::demo::message::{Message, MessageType}; use crate::demo::message::{Message, MessageType};
use crate::demo::packet::datatable::{SendTable, ServerClass}; use crate::demo::packet::datatable::{SendTable, ServerClass};
use crate::demo::packet::Packet;
use crate::demo::packet::stringtable::{StringTable, StringTableEntry}; use crate::demo::packet::stringtable::{StringTable, StringTableEntry};
use crate::demo::packet::Packet;
use crate::demo::parser::analyser::{Analyser, MatchState}; use crate::demo::parser::analyser::{Analyser, MatchState};
use crate::ParserState; use crate::ParserState;
@ -89,11 +89,13 @@ impl DemoHandler {
} }
fn handle_data_table(&mut self, send_tables: Vec<SendTable>, server_classes: Vec<ServerClass>) { fn handle_data_table(&mut self, send_tables: Vec<SendTable>, server_classes: Vec<ServerClass>) {
self.state_handler.handle_data_table(send_tables, server_classes); self.state_handler
.handle_data_table(send_tables, server_classes);
} }
fn handle_string_entry(&mut self, table: &String, index: usize, entries: &StringTableEntry) { fn handle_string_entry(&mut self, table: &String, index: usize, entries: &StringTableEntry) {
self.state_handler.handle_string_entry(table, index, entries); self.state_handler
.handle_string_entry(table, index, entries);
self.analyser.handle_string_entry(table, index, entries); self.analyser.handle_string_entry(table, index, entries);
} }

View file

@ -3,6 +3,7 @@ use std::rc::Rc;
use bitstream_reader::{BitRead, LittleEndian, ReadError}; use bitstream_reader::{BitRead, LittleEndian, ReadError};
use crate::demo::gameevent_gen::GameEventType;
use crate::demo::gamevent::{GameEventValue, GameEventValueType}; use crate::demo::gamevent::{GameEventValue, GameEventValueType};
use crate::demo::header::Header; use crate::demo::header::Header;
use crate::demo::message::{Message, MessageType}; use crate::demo::message::{Message, MessageType};
@ -14,7 +15,6 @@ pub use crate::demo::parser::state::ParserState;
use crate::Stream; use crate::Stream;
use std::cell::RefCell; use std::cell::RefCell;
use std::ops::Deref; use std::ops::Deref;
use crate::demo::gameevent_gen::GameEventType;
mod analyser; mod analyser;
mod handler; mod handler;
@ -40,7 +40,11 @@ pub enum ParseError {
/// A unknown game event type was read /// A unknown game event type was read
UnknownGameEvent(String), UnknownGameEvent(String),
/// A read game event doesn't contain the expected values /// A read game event doesn't contain the expected values
InvalidGameEvent { expected_type: GameEventValueType, name: String, value: GameEventValue }, InvalidGameEvent {
expected_type: GameEventValueType,
name: String,
value: GameEventValue,
},
/// Unexpected type of compressed data /// Unexpected type of compressed data
UnexpectedCompressionType(String), UnexpectedCompressionType(String),
/// Error while decompressing SNAP compressed string table /// Error while decompressing SNAP compressed string table
@ -85,10 +89,9 @@ pub struct DemoParser {
impl DemoParser { impl DemoParser {
pub fn new(stream: Stream) -> Self { pub fn new(stream: Stream) -> Self {
DemoParser { DemoParser {
stream, stream,
handler: DemoHandler::new() handler: DemoHandler::new(),
} }
} }

View file

@ -2,6 +2,7 @@ use std::collections::HashMap;
use crate::demo::gameevent_gen::GameEventType; use crate::demo::gameevent_gen::GameEventType;
use crate::demo::gamevent::GameEventDefinition; use crate::demo::gamevent::GameEventDefinition;
use crate::demo::message::gameevent::GameEventTypeId;
use crate::demo::message::packetentities::EntityId; use crate::demo::message::packetentities::EntityId;
use crate::demo::message::stringtable::StringTableMeta; use crate::demo::message::stringtable::StringTableMeta;
use crate::demo::message::{Message, MessageType}; use crate::demo::message::{Message, MessageType};
@ -12,7 +13,6 @@ use crate::demo::parser::handler::{MessageHandler, StringTableEntryHandler};
use crate::demo::sendprop::SendProp; use crate::demo::sendprop::SendProp;
use crate::Stream; use crate::Stream;
use std::mem::replace; use std::mem::replace;
use crate::demo::message::gameevent::GameEventTypeId;
pub type StringEntryHandler = Box<FnMut(&String, &StringTableEntry) -> ()>; pub type StringEntryHandler = Box<FnMut(&String, &StringTableEntry) -> ()>;
@ -127,7 +127,7 @@ impl StringTableEntryHandler for ParserState {
}, },
_ => unreachable!("missing baseline"), _ => unreachable!("missing baseline"),
}, },
_ => {}, _ => {}
} }
} }
} }