This commit is contained in:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user