impl GameStatus {
pub fn new(created: Timestamp) -> Self {
- Self {
- created,
- completed: false,
- players: HashSet::new(),
- winner: None,
- }
+ Self { created, completed: false, players: HashSet::new(), winner: None }
}
}
fn validate_action(&self, UserAction { timestamp, username, action }: UserAction) -> Result<ValidatedUserAction, ActionError> {
match (self.state, action) {
(_, Action::PlayCard { .. }) | (_, Action::ChooseTrumps { .. }) => Err(ActionError::InvalidActionForGameType),
- (_, Action::Message {message}) => Ok(ValidatedUserAction(UserAction { timestamp, username, action: Action::Message {message}})),
+ (_, Action::Message { message }) => Ok(ValidatedUserAction(UserAction { timestamp, username, action: Action::Message { message } })),
(State::NotStarted, Action::Join { seat, chips }) => {
if self.seats.contains_player(username) {
Err(ActionError::AlreadyJoined)
fn take_action(&mut self, ValidatedUserAction(UserAction { timestamp, username, action }): ValidatedUserAction) -> Result<(), ActionError> {
self.actions_len += 1;
- if matches!(action, Action::Message {..}) {
+ if matches!(action, Action::Message { .. }) {
return Ok(());
}
self.last_action_time = Some(timestamp);
fn next_dealer_action(&self, timestamp: Timestamp) -> DealerAction {
let mut rng = self.rng.clone();
match self.state {
- State::NotStarted => {
- match self.settings.start_time {
- StartCondition::WhenFull => {
- if self.seats.players_len() == self.settings.max_players as usize {
- if let Some(username) = rng.choose_from(self.seats.player_set()) {
- return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
- }
+ State::NotStarted => match self.settings.start_time {
+ StartCondition::WhenFull => {
+ if self.seats.players_len() == self.settings.max_players as usize {
+ if let Some(username) = rng.choose_from(self.seats.player_set()) {
+ return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
}
- DealerAction::WaitForPlayer
}
- StartCondition::AtTime(start_time) => {
- if timestamp >= start_time {
- if self.seats.players_len() < 2 {
- return DealerAction::WaitForPlayer
- }
- if let Some(username) = rng.choose_from(self.seats.player_set()) {
- return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
- }
+ DealerAction::WaitForPlayer
+ }
+ StartCondition::AtTime(start_time) => {
+ if timestamp >= start_time {
+ if self.seats.players_len() < 2 {
+ return DealerAction::WaitForPlayer;
+ }
+ if let Some(username) = rng.choose_from(self.seats.player_set()) {
+ return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
}
- DealerAction::WaitUntil(start_time)
}
+ DealerAction::WaitUntil(start_time)
}
- }
+ },
State::Dealing => {
if let Some(username) = self.receiver {
let card = rng.choose_from(&self.deck).cloned();
} else if let Some(username) = self.only_player_left() {
DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::WinGame }))
} else if let Some(username) = self.dealer.and_then(|dealer| self.seats.player_after(dealer)) {
- let level = self.start_time.map(|start_time| self.settings.level(timestamp.millis_since(start_time))).unwrap_or(self.level);
+ let level = self.start_time.map(|start_time| self.settings.level(timestamp.millis_since(start_time))).unwrap_or(self.level);
if level > self.level {
DealerAction::TakeAction(ValidatedUserAction(UserAction {
timestamp,
(_, Action::AddOn { .. }) | (_, Action::RevealCard { .. }) | (_, Action::Fold) | (_, Action::TimeoutFold) | (_, Action::Bet { .. }) => {
Err(ActionError::InvalidActionForGameType)
}
- (_, Action::Message {message}) => Ok(ValidatedUserAction(UserAction { timestamp, username, action: Action::Message {message}})),
+ (_, Action::Message { message }) => Ok(ValidatedUserAction(UserAction { timestamp, username, action: Action::Message { message } })),
(State::NotStarted, Action::Join { seat, .. }) => {
if self.seats.contains_player(username) {
Err(ActionError::AlreadyJoined)
fn take_action(&mut self, ValidatedUserAction(UserAction { username, action, .. }): ValidatedUserAction) -> Result<(), ActionError> {
self.actions_len += 1;
- if matches!(action, Action::Message {..}) {
+ if matches!(action, Action::Message { .. }) {
return Ok(());
}
self.rng.advance();
fn next_dealer_action(&self, timestamp: Timestamp) -> DealerAction {
let mut rng = self.rng.clone();
match self.state {
- State::NotStarted => {
- match self.settings.start_time {
- StartCondition::WhenFull => {
- if self.seats.players_len() == self.settings.max_players as usize {
- if let Some(username) = rng.choose_from(self.seats.player_set()) {
- return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
- }
+ State::NotStarted => match self.settings.start_time {
+ StartCondition::WhenFull => {
+ if self.seats.players_len() == self.settings.max_players as usize {
+ if let Some(username) = rng.choose_from(self.seats.player_set()) {
+ return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
}
- DealerAction::WaitForPlayer
}
- StartCondition::AtTime(start_time) => {
- if timestamp >= start_time {
- if self.seats.players_len() < 2 {
- return DealerAction::WaitForPlayer
- }
- if let Some(username) = rng.choose_from(self.seats.player_set()) {
- return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
- }
+ DealerAction::WaitForPlayer
+ }
+ StartCondition::AtTime(start_time) => {
+ if timestamp >= start_time {
+ if self.seats.players_len() < 2 {
+ return DealerAction::WaitForPlayer;
+ }
+ if let Some(username) = rng.choose_from(self.seats.player_set()) {
+ return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
}
- DealerAction::WaitUntil(start_time)
}
+ DealerAction::WaitUntil(start_time)
}
- }
+ },
State::Dealing => {
if let Some(username) = self.receiver {
let card = rng.choose_from(&self.deck).cloned();
use signal_hook::consts::signal::*;
use signal_hook_async_std::Signals;
use tide::{
+ http::{
+ cache::{CacheControl, CacheDirective},
+ headers::CACHE_CONTROL,
+ },
listener::{ConcurrentListener, ToListener},
- http::{cache::{CacheControl, CacheDirective}, headers::CACHE_CONTROL},
utils::After,
Body, Response, StatusCode,
};