async def advance_from_voting( room_name: str, game_mapper: GameEventMapper = Depends(get_game_mapper), token: str = Depends(JWTBearer()), conman: ConnectionManager = Depends(get_websocket_connection_manager), ): user = decodeJWT(token) if user is None: raise HTTPException(404, "User not found with this token.") room = game_mapper.get_game(room_name) if room is None: raise HTTPException(404, "Room does not exist.") if user.user_id not in room.session.player_lookup.keys(): raise HTTPException(404, "User not in the game room.") if room.session.state == GameStates.PLAYERS_INSPECTING_RESULT: room.on_new_event(AdvanceRoundAfterVoting(), user.user_id) else: raise HTTPException(400, "You can't do that in this game state.") await broadcast_event( room_name, conman, f"{user.user_id} has started a new round!", ) return GameStatePlayerView.from_game_state(room.session, user.user_id)
async def select_winner( room_name: str, winner: SelectWinningSubmission, game_mapper: GameEventMapper = Depends(get_game_mapper), token: str = Depends(JWTBearer()), conman: ConnectionManager = Depends(get_websocket_connection_manager), ): user = decodeJWT(token) if user is None: raise HTTPException(404, "User not found with this token.") room = game_mapper.get_game(room_name) if room is None: raise HTTPException(404, "Room does not exist.") try: room.on_new_event(winner, user.user_id) except GameHasEnded as e: pass # It's fine. Just proceed. # TODO: event broadcast shall be triggered somehow inside from the SM await broadcast_event( room_name, conman, f"{user.user_id} voted for the winner", ) return GameStatePlayerView.from_game_state(room.session, user.user_id)
def refresh( room_name: str, game_mapper: GameEventMapper = Depends(get_game_mapper), token: str = Depends(JWTBearer()), ): user = decodeJWT(token) if user is None: raise HTTPException(404, "User not found with this token.") room = game_mapper.get_game(room_name) if room is None: raise HTTPException(404, "Room does not exist.") if user.user_id not in room.session.player_lookup.keys(): raise HTTPException(404, "User not in the game room.") return GameStatePlayerView.from_game_state(room.session, user.user_id)
async def join_game( room_name: str, game_mapper: GameEventMapper = Depends(get_game_mapper), token: str = Depends(JWTBearer()), conman: ConnectionManager = Depends(get_websocket_connection_manager), ): user = decodeJWT(token) if user is None: raise HTTPException(404, "User not found with this token.") room = game_mapper.get_game(room_name) if room is None: raise HTTPException(404, "Room does not exist.") room.session.player_join(user.user_id) await broadcast_event(room_name, conman, f"{user.user_id} has joined the game!") return GameStatePlayerView.from_game_state(room.session, user.user_id)
async def submit_cards( room_name: str, cards: List[WhiteCard], game_mapper: GameEventMapper = Depends(get_game_mapper), token: str = Depends(JWTBearer()), conman: ConnectionManager = Depends(get_websocket_connection_manager), ): user = decodeJWT(token) if user is None: raise HTTPException(404, "User not found with this token.") room = game_mapper.get_game(room_name) if room is None: raise HTTPException(404, "Room does not exist.") room.on_new_event( PlayerSubmitCards(submitting_user=user.user_id, cards=cards), user.user_id, ) await broadcast_event(room_name, conman, f"{user.user_id} has submitted cards!") return GameStatePlayerView.from_game_state(room.session, user.user_id)
async def leave_game( room_name: str, game_mapper: GameEventMapper = Depends(get_game_mapper), token: str = Depends(JWTBearer()), conman: ConnectionManager = Depends(get_websocket_connection_manager), ): user = decodeJWT(token) if user is None: raise HTTPException(404, "User not found with this token.") room = game_mapper.get_game(room_name) if room is None: raise HTTPException(404, "Room does not exist.") # This kinda deserves a test: if room.session.state != GameStates.FINISHED: room.session.player_leaves(user.user_id) if len(room.session.players) == 0: game_mapper.end_game(room_name) await broadcast_event(room_name, conman, f"{user.user_id} has left the game!") return LeaveResponse()
GameStatePlayerView, ) from fast_cards.internal.cards_against_humanity_rules.models import ( PlayerSubmitCards, SelectWinningSubmission, GamePreferences, GameModes, GameStates, AdvanceRoundAfterVoting, ) from fast_cards.websocket.connection_manager import ConnectionManager, SENDER_TYPES from fast_cards.websocket.models import WebSocketMessage router = APIRouter( prefix="/game", dependencies=[Depends(get_db), Depends(JWTBearer())], tags=["cards-against"], ) logger = logging.getLogger("game") async def broadcast_event(room_name: str, connection_manager: ConnectionManager, message: str): logger.debug(f"Broadcast attempt for : {room_name}->{message}") if connection_manager.active_rooms.get(room_name) is not None: await connection_manager.broadcast( room_name=room_name, message=WebSocketMessage(message=message, sender=SENDER_TYPES.SYSTEM, topic=room_name),
def is_my_login_valid(token: str = Depends(JWTBearer())): user = decodeJWT(token) if user is None: raise HTTPException(404, "User not found with this token.") return LoginCheckResponse(success=True)