summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-10-29 18:43:09 +0100
committersalmonik <salmonik@tuta.io>2026-10-29 18:43:09 +0100
commit08269639606c0481037cbde7ebaf2e0455460883 (patch)
tree57c1f967e8836a1a7da84b1887d932e0067d538f /src/server
parentv2.2.0: add blackjack with reserved bets and hit/stand/double (diff)
downloadzagan-bet-08269639606c0481037cbde7ebaf2e0455460883.tar.gz
zagan-bet-08269639606c0481037cbde7ebaf2e0455460883.zip
v2.2.1: forfeit blackjack bets when leaving or disconnecting
Diffstat (limited to 'src/server')
-rw-r--r--src/server/core.rs50
-rw-r--r--src/server/games/blackjack.rs4
2 files changed, 47 insertions, 7 deletions
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 {
297 return format!("ERROR {error}"); 297 return format!("ERROR {error}");
298 } 298 }
299 } 299 }
300 "cancel" => { 300 "forfeit" | "cancel" => {
301 let refund = session.bet_amount as i64; 301 hand.forfeit();
302 let balance = database::credit(&mut self.conn, user, refund).unwrap_or(balance); 302 let state = hand.state(session_id, balance);
303 let details = serde_json::to_string(&state).unwrap_or_else(|_| "{}".to_string());
304 let balance = match database::settle_play(
305 &mut self.conn,
306 session_id,
307 user,
308 "blackjack",
309 hand.bet as i64,
310 0,
311 &details,
312 ) {
313 Ok(balance) => balance,
314 Err(error) => {
315 eprintln!("Blackjack forfeit settlement failed for {user}: {error}");
316 let _ = self.sessions.remove_session(session_id);
317 return "ERROR Failed to update balance".to_string();
318 }
319 };
303 let _ = self.sessions.remove_session(session_id); 320 let _ = self.sessions.remove_session(session_id);
304 hand.cancel();
305 let state = hand.state(session_id, balance); 321 let state = hand.state(session_id, balance);
306 return blackjack_wire(&state); 322 return blackjack_wire(&state);
307 } 323 }
@@ -485,7 +501,31 @@ impl ServerCore {
485 if let Some(user) = state.user.as_deref() { 501 if let Some(user) = state.user.as_deref() {
486 for session in self.sessions.get_user_sessions(user) { 502 for session in self.sessions.get_user_sessions(user) {
487 if session.game_type == "blackjack" { 503 if session.game_type == "blackjack" {
488 let _ = database::credit(&mut self.conn, user, session.bet_amount as i64); 504 if let Some(raw) = session.state.data.get("hand") {
505 if let Ok(mut hand) = BlackjackHand::from_json(raw) {
506 if !hand.is_done() {
507 hand.forfeit();
508 let balance =
509 database::get_balance(&self.conn, user).unwrap_or(0);
510 let final_state = hand.state(&session.session_id, balance);
511 let details = serde_json::to_string(&final_state)
512 .unwrap_or_else(|_| "{}".to_string());
513 if let Err(error) = database::settle_play(
514 &mut self.conn,
515 &session.session_id,
516 user,
517 "blackjack",
518 hand.bet as i64,
519 0,
520 &details,
521 ) {
522 eprintln!(
523 "Blackjack disconnect forfeit failed for {user}: {error}"
524 );
525 }
526 }
527 }
528 }
489 } 529 }
490 let _ = self.sessions.remove_session(&session.session_id); 530 let _ = self.sessions.remove_session(&session.session_id);
491 } 531 }
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 {
133 Ok(()) 133 Ok(())
134 } 134 }
135 135
136 pub fn cancel(&mut self) { 136 pub fn forfeit(&mut self) {
137 self.phase = "done".to_string(); 137 self.phase = "done".to_string();
138 self.result = "cancelled".to_string(); 138 self.result = "forfeit".to_string();
139 self.winnings = 0; 139 self.winnings = 0;
140 } 140 }
141 141