diff options
Diffstat (limited to '')
| -rw-r--r-- | src/server/core.rs | 50 | ||||
| -rw-r--r-- | src/server/games/blackjack.rs | 4 |
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 | ||
