Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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()
Пример #7
0
    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),
Пример #8
0
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)