record raw events everywhere
record-daemon / Build, check and test (push) Waiting to run

This commit is contained in:
2026-05-06 23:53:01 +02:00
parent ff713da1e8
commit fcfa55d0aa
13 changed files with 848 additions and 2043 deletions
+67 -23
View File
@@ -11,7 +11,7 @@ use tracing::{debug, error, info, trace, warn};
use super::auth::LockfileCredentials;
use super::endpoints;
use super::events::GameEvent;
use super::events::EVENT_TYPE_GAME_END;
use super::state::{ClientState, GameflowPhase};
use super::tls::create_insecure_tls_config;
use super::websocket::{parse_live_client_event, parse_websocket_message, ParsedEvent};
@@ -186,23 +186,35 @@ impl LqpClient {
}
if let Some(parsed) = parse_websocket_message(&text) {
// Update state based on event
Self::update_state_from_event(&state, &parsed.event).await;
Self::update_state_from_event(&state, &parsed).await;
// Check for duplicate GameStart events
if let GameEvent::GameStart(ref info) = parsed.event {
if parsed.event_type == super::events::EVENT_TYPE_GAME_START {
let game_id = parsed
.raw_data
.get("gameId")
.or_else(|| {
parsed
.raw_data
.get("gameData")
.and_then(|gd| gd.get("gameId"))
})
.and_then(|v| v.as_u64())
.unwrap_or(0);
let mut last_game_id = last_emitted_game_id.write().await;
if *last_game_id == Some(info.game_id) {
if *last_game_id == Some(game_id) && game_id != 0 {
info!(
"Skipping duplicate GameStart event for game_id={}",
info.game_id
game_id
);
continue;
}
*last_game_id = Some(info.game_id);
*last_game_id = Some(game_id);
}
// Reset last_emitted_game_id on GameEnd to allow new game starts
if let GameEvent::GameEnd(_) = &parsed.event {
if parsed.event_type == EVENT_TYPE_GAME_END {
*last_emitted_game_id.write().await = None;
}
@@ -219,23 +231,35 @@ impl LqpClient {
if !text.is_empty() {
if let Some(parsed) = parse_websocket_message(&text) {
// Update state based on event
Self::update_state_from_event(&state, &parsed.event).await;
Self::update_state_from_event(&state, &parsed).await;
// Check for duplicate GameStart events
if let GameEvent::GameStart(ref info) = parsed.event {
if parsed.event_type == super::events::EVENT_TYPE_GAME_START {
let game_id = parsed
.raw_data
.get("gameId")
.or_else(|| {
parsed
.raw_data
.get("gameData")
.and_then(|gd| gd.get("gameId"))
})
.and_then(|v| v.as_u64())
.unwrap_or(0);
let mut last_game_id = last_emitted_game_id.write().await;
if *last_game_id == Some(info.game_id) {
if *last_game_id == Some(game_id) && game_id != 0 {
info!(
"Skipping duplicate GameStart event for game_id={}",
info.game_id
game_id
);
continue;
}
*last_game_id = Some(info.game_id);
*last_game_id = Some(game_id);
}
// Reset last_emitted_game_id on GameEnd to allow new game starts
if let GameEvent::GameEnd(_) = &parsed.event {
if parsed.event_type == EVENT_TYPE_GAME_END {
*last_emitted_game_id.write().await = None;
}
@@ -277,19 +301,36 @@ impl LqpClient {
Ok(())
}
/// Update internal state from a game event.
async fn update_state_from_event(state: &Arc<RwLock<ClientState>>, event: &GameEvent) {
/// Update internal state from a parsed event.
async fn update_state_from_event(state: &Arc<RwLock<ClientState>>, parsed: &ParsedEvent) {
let mut state = state.write().await;
match event {
GameEvent::GameStart(info) => {
match parsed.event_type.as_str() {
super::events::EVENT_TYPE_GAME_START => {
state.phase = GameflowPhase::InProgress;
state.game_id = Some(info.game_id);
state.champion = info.champion.clone();
state.game_id = parsed
.raw_data
.get("gameId")
.or_else(|| {
parsed
.raw_data
.get("gameData")
.and_then(|gd| gd.get("gameId"))
})
.and_then(|v| v.as_u64());
// Champion is not extracted here — raw session data has it
}
GameEvent::GameEnd(_) => {
super::events::EVENT_TYPE_GAME_END => {
state.phase = GameflowPhase::EndOfGame;
}
super::events::EVENT_TYPE_PHASE_CHANGE => {
let phase_str = parsed
.raw_data
.as_str()
.or_else(|| parsed.raw_data.get("phase").and_then(|v| v.as_str()))
.unwrap_or("");
state.phase = GameflowPhase::from(phase_str);
}
_ => {}
}
}
@@ -497,6 +538,7 @@ impl LqpClient {
Ok(events) => {
// The response has an "Events" key containing the array
let events_array = events.get("Events").and_then(|e| e.as_array());
if let Some(events_array) = events_array {
let event_count = events_array.len();
if event_count > 0 {
@@ -522,10 +564,12 @@ impl LqpClient {
// Parse and broadcast the event
if let Some(parsed) = parse_live_client_event(event) {
info!("Parsed live client event: {:?}", parsed.event);
info!(
"Parsed live client event: type={}",
parsed.event_type
);
// Update state based on event
Self::update_state_from_event(&state, &parsed.event)
.await;
Self::update_state_from_event(&state, &parsed).await;
// Broadcast event
if event_sender.send(parsed).is_err() {