use crate::parser::Context;
use crate::proto::*;
use crate::{Entity, EntityEvents, GameEvent, StringTable};
use std::cell::RefCell;
use std::rc::Rc;
#[cfg(feature = "dota")]
use crate::event::CombatLogEntry;
pub type ObserverResult = anyhow::Result<()>;
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct Interests: u64 {
const DEMO_MESSAGE = 1 << 0;
const NET_MESSAGE = 1 << 1;
const SVC_MESSAGE = 1 << 2;
const BASE_USER_MESSAGE = 1 << 3;
const BASE_GAME_EVENT = 1 << 4;
const TICK_START = 1 << 5;
const TICK_END = 1 << 6;
const ENTITY_STATE = 1 << 7;
const ENTITY_EVENTS = 1 << 8;
const STRING_TABLE_STATE = 1 << 9;
const STRING_TABLE_ENTRIES = 1 << 10;
const REPLAY_END = 1 << 11;
#[cfg(feature = "dota")]
const DOTA_USER_MESSAGE = 1 << 12;
#[cfg(feature = "dota")]
const COMBAT_LOG_ENTRIES = 1 << 13;
#[cfg(feature = "deadlock")]
const CITADEL_USER_MESSAGE = 1 << 14;
#[cfg(feature = "deadlock")]
const CITADEL_GAME_EVENT = 1 << 15;
#[cfg(feature = "cs2")]
const CS2_USER_MESSAGE = 1 << 16;
#[cfg(feature = "cs2")]
const CS2_GAME_EVENT = 1 << 17;
}
}
#[allow(unused_variables)]
pub trait Observer {
fn interests(&self) -> Interests {
Interests::empty()
}
#[cold]
#[inline(never)]
fn on_demo_command(
&mut self,
ctx: &Context,
msg_type: EDemoCommands,
msg: &[u8],
) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
fn on_net_message(
&mut self,
ctx: &Context,
msg_type: NetMessages,
msg: &[u8],
) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
fn on_svc_message(
&mut self,
ctx: &Context,
msg_type: SvcMessages,
msg: &[u8],
) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
fn on_base_user_message(
&mut self,
ctx: &Context,
msg_type: EBaseUserMessages,
msg: &[u8],
) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
fn on_base_game_event(
&mut self,
ctx: &Context,
msg_type: EBaseGameEvents,
msg: &[u8],
) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
fn on_tick_start(&mut self, ctx: &Context) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
fn on_tick_end(&mut self, ctx: &Context) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
fn on_entity(&mut self, ctx: &Context, event: EntityEvents, entity: &Entity) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
fn on_game_event(&mut self, ctx: &Context, ge: &GameEvent) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
fn on_string_table(
&mut self,
ctx: &Context,
st: &StringTable,
modified: &[i32],
) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
fn on_stop(&mut self, ctx: &Context) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
#[cfg(feature = "dota")]
fn on_combat_log(&mut self, ctx: &Context, cle: &CombatLogEntry) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
#[cfg(feature = "dota")]
fn on_dota_user_message(
&mut self,
ctx: &Context,
msg_type: EDotaUserMessages,
msg: &[u8],
) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
#[cfg(feature = "deadlock")]
fn on_citadel_game_event(
&mut self,
ctx: &Context,
msg_type: ECitadelGameEvents,
msg: &[u8],
) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
#[cfg(feature = "deadlock")]
fn on_citadel_user_message(
&mut self,
ctx: &Context,
msg_type: CitadelUserMessageIds,
msg: &[u8],
) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
#[cfg(feature = "cs2")]
fn on_cs2_user_message(
&mut self,
ctx: &Context,
msg_type: ECstrike15UserMessages,
msg: &[u8],
) -> ObserverResult {
Ok(())
}
#[cold]
#[inline(never)]
#[cfg(feature = "cs2")]
fn on_cs2_game_event(
&mut self,
ctx: &Context,
msg_type: ECsgoGameEvents,
msg: &[u8],
) -> ObserverResult {
Ok(())
}
}
impl<T> Observer for Rc<RefCell<T>>
where
T: Observer,
{
fn interests(&self) -> Interests {
self.borrow().interests()
}
fn on_demo_command(
&mut self,
ctx: &Context,
msg_type: EDemoCommands,
msg: &[u8],
) -> ObserverResult {
self.borrow_mut().on_demo_command(ctx, msg_type, msg)
}
fn on_net_message(
&mut self,
ctx: &Context,
msg_type: NetMessages,
msg: &[u8],
) -> ObserverResult {
self.borrow_mut().on_net_message(ctx, msg_type, msg)
}
fn on_svc_message(
&mut self,
ctx: &Context,
msg_type: SvcMessages,
msg: &[u8],
) -> ObserverResult {
self.borrow_mut().on_svc_message(ctx, msg_type, msg)
}
fn on_base_user_message(
&mut self,
ctx: &Context,
msg_type: EBaseUserMessages,
msg: &[u8],
) -> ObserverResult {
self.borrow_mut().on_base_user_message(ctx, msg_type, msg)
}
fn on_base_game_event(
&mut self,
ctx: &Context,
msg_type: EBaseGameEvents,
msg: &[u8],
) -> ObserverResult {
self.borrow_mut().on_base_game_event(ctx, msg_type, msg)
}
fn on_tick_start(&mut self, ctx: &Context) -> ObserverResult {
self.borrow_mut().on_tick_start(ctx)
}
fn on_tick_end(&mut self, ctx: &Context) -> ObserverResult {
self.borrow_mut().on_tick_end(ctx)
}
fn on_entity(&mut self, ctx: &Context, event: EntityEvents, entity: &Entity) -> ObserverResult {
self.borrow_mut().on_entity(ctx, event, entity)
}
fn on_game_event(&mut self, ctx: &Context, ge: &GameEvent) -> ObserverResult {
self.borrow_mut().on_game_event(ctx, ge)
}
fn on_string_table(
&mut self,
ctx: &Context,
st: &StringTable,
modified: &[i32],
) -> ObserverResult {
self.borrow_mut().on_string_table(ctx, st, modified)
}
fn on_stop(&mut self, ctx: &Context) -> ObserverResult {
self.borrow_mut().on_stop(ctx)
}
#[cfg(feature = "dota")]
fn on_combat_log(&mut self, ctx: &Context, cle: &CombatLogEntry) -> ObserverResult {
self.borrow_mut().on_combat_log(ctx, cle)
}
#[cfg(feature = "dota")]
fn on_dota_user_message(
&mut self,
ctx: &Context,
msg_type: EDotaUserMessages,
msg: &[u8],
) -> ObserverResult {
self.borrow_mut().on_dota_user_message(ctx, msg_type, msg)
}
#[cfg(feature = "deadlock")]
fn on_citadel_game_event(
&mut self,
ctx: &Context,
msg_type: ECitadelGameEvents,
msg: &[u8],
) -> ObserverResult {
self.borrow_mut().on_citadel_game_event(ctx, msg_type, msg)
}
#[cfg(feature = "deadlock")]
fn on_citadel_user_message(
&mut self,
ctx: &Context,
msg_type: CitadelUserMessageIds,
msg: &[u8],
) -> ObserverResult {
self.borrow_mut()
.on_citadel_user_message(ctx, msg_type, msg)
}
#[cfg(feature = "cs2")]
fn on_cs2_user_message(
&mut self,
ctx: &Context,
msg_type: ECstrike15UserMessages,
msg: &[u8],
) -> ObserverResult {
self.borrow_mut().on_cs2_user_message(ctx, msg_type, msg)
}
#[cfg(feature = "cs2")]
fn on_cs2_game_event(
&mut self,
ctx: &Context,
msg_type: ECsgoGameEvents,
msg: &[u8],
) -> ObserverResult {
self.borrow_mut().on_cs2_game_event(ctx, msg_type, msg)
}
}