From 08269639606c0481037cbde7ebaf2e0455460883 Mon Sep 17 00:00:00 2001 From: salmonik Date: Thu, 29 Oct 2026 18:43:09 +0100 Subject: v2.2.1: forfeit blackjack bets when leaving or disconnecting --- src/server/core.rs | 50 ++++++++++++++++++++++++++++++++++++++----- src/server/games/blackjack.rs | 4 ++-- 2 files changed, 47 insertions(+), 7 deletions(-) (limited to 'src/server') diff --git a/src/server/core.rs b/src/server/core.rs index cf8c4b9..259f936 100644 --- a/src/server/core.rs +++ b/src/server/core.rs @@ -297,11 +297,27 @@ impl ServerCore { return format!("ERROR {error}"); } } - "cancel" => { - let refund = session.bet_amount as i64; - let balance = database::credit(&mut self.conn, user, refund).unwrap_or(balance); + "forfeit" | "cancel" => { + hand.forfeit(); + let state = hand.state(session_id, balance); + let details = serde_json::to_string(&state).unwrap_or_else(|_| "{}".to_string()); + let balance = match database::settle_play( + &mut self.conn, + session_id, + user, + "blackjack", + hand.bet as i64, + 0, + &details, + ) { + Ok(balance) => balance, + Err(error) => { + eprintln!("Blackjack forfeit settlement failed for {user}: {error}"); + let _ = self.sessions.remove_session(session_id); + return "ERROR Failed to update balance".to_string(); + } + }; let _ = self.sessions.remove_session(session_id); - hand.cancel(); let state = hand.state(session_id, balance); return blackjack_wire(&state); } @@ -485,7 +501,31 @@ impl ServerCore { if let Some(user) = state.user.as_deref() { for session in self.sessions.get_user_sessions(user) { if session.game_type == "blackjack" { - let _ = database::credit(&mut self.conn, user, session.bet_amount as i64); + if let Some(raw) = session.state.data.get("hand") { + if let Ok(mut hand) = BlackjackHand::from_json(raw) { + if !hand.is_done() { + hand.forfeit(); + let balance = + database::get_balance(&self.conn, user).unwrap_or(0); + let final_state = hand.state(&session.session_id, balance); + let details = serde_json::to_string(&final_state) + .unwrap_or_else(|_| "{}".to_string()); + if let Err(error) = database::settle_play( + &mut self.conn, + &session.session_id, + user, + "blackjack", + hand.bet as i64, + 0, + &details, + ) { + eprintln!( + "Blackjack disconnect forfeit failed for {user}: {error}" + ); + } + } + } + } } let _ = self.sessions.remove_session(&session.session_id); } diff --git a/src/server/games/blackjack.rs b/src/server/games/blackjack.rs index 9505fed..df5a6ac 100644 --- a/src/server/games/blackjack.rs +++ b/src/server/games/blackjack.rs @@ -133,9 +133,9 @@ impl BlackjackHand { Ok(()) } - pub fn cancel(&mut self) { + pub fn forfeit(&mut self) { self.phase = "done".to_string(); - self.result = "cancelled".to_string(); + self.result = "forfeit".to_string(); self.winnings = 0; } -- cgit v1.2.3