예제 #1
0
def join_room_api(request):
    # grab data from input json
    try:
        raw_data = parse_body_json_or_400(
            request, required_keys=["room", "nickname", "password"])
    except InvalidRequestJsonError as e:
        return JsonResponse({"error": str(e)})

    room = Room.get_for_encoded_uuid_or_404(raw_data["room"])

    # use a JoinRoomForm to share validation with the regular path
    form_data = JoinRoomForm.for_room(room).initial
    form_data.update({
        "player_name": raw_data["nickname"],
        "passphrase": raw_data["password"],
        "is_spectator": raw_data.get("is_specator", False),
    })
    join_form = JoinRoomForm(form_data)
    if join_form.is_valid():
        player = join_form.create_player()
        _save_session_player(request.session, player)
        return redirect("get_socket_key", encoded_room_uuid=room.encoded_uuid)
    else:
        return HttpResponse(join_form.errors.as_json(),
                            content_type="application/json",
                            status=400)
예제 #2
0
def get_socket_key(request, encoded_room_uuid):
    room = Room.get_for_encoded_uuid_or_404(encoded_room_uuid)
    player = _get_session_player(request.session, room)
    data = {
        "socket_key": _create_temporary_socket_key(player),
    }
    return JsonResponse(data)
예제 #3
0
def room_view(request, encoded_room_uuid):
    if request.method == "POST":
        join_form = JoinRoomForm(request.POST)
        if join_form.is_valid():
            player = join_form.create_player()
            _save_session_player(request.session, player)
            return redirect("room_view", encoded_room_uuid=encoded_room_uuid)
        else:
            room = Room.get_for_encoded_uuid_or_404(encoded_room_uuid)
            return _join_room(request, join_form, room)
    else:
        try:
            room = Room.get_for_encoded_uuid_or_404(encoded_room_uuid)
            initial_values = {
                "game_type": room.current_game.game_type.group.value,
                "variant_type": room.current_game.game_type.value,
                "lockout_mode": room.current_game.lockout_mode.value,
                "hide_card": room.hide_card,
            }
            new_card_form = RoomForm(initial=initial_values)
            new_card_form.helper.layout = Layout(
                "game_type",
                "variant_type",
                "custom_json",
                "lockout_mode",
                "seed",
                "hide_card",
            )
            new_card_form.helper['variant_type'].wrap(Field,
                                                      wrapper_class='hidden')
            new_card_form.helper['custom_json'].wrap(Field,
                                                     wrapper_class='hidden')
            player = _get_session_player(request.session, room)
            params = {
                "room": room,
                "game": room.current_game,
                "player": player,
                "sockets_url": SOCKETS_URL,
                "new_card_form": new_card_form,
                "temporary_socket_key": _create_temporary_socket_key(player)
            }
            return render(request, "bingosync/bingosync.html", params)
        except NotAuthenticatedError:
            join_form = JoinRoomForm.for_room(room)
            return _join_room(request, join_form, room)
예제 #4
0
def board_revealed(request):
    data = parse_body_json_or_400(request, required_keys=["room"])

    room = Room.get_for_encoded_uuid_or_404(data["room"])
    player = _get_session_player(request.session, room)

    revealed_event = RevealedEvent(player=player, player_color_value=player.color.value)
    revealed_event.save()
    publish_revealed_event(revealed_event)
    return HttpResponse("Received data: " + str(data))
예제 #5
0
def select_color(request):
    data = parse_body_json_or_400(request, required_keys=["room", "color"])

    room = Room.get_for_encoded_uuid_or_404(data["room"])
    player = _get_session_player(request.session, room)
    color = Color.for_name(data["color"])

    color_event = player.update_color(color)
    publish_color_event(color_event)
    return HttpResponse("Received data: ", str(data))
예제 #6
0
def chat_message(request):
    data = parse_body_json_or_400(request, required_keys=["room", "text"])

    room = Room.get_for_encoded_uuid_or_404(data["room"])
    player = _get_session_player(request.session, room)
    text = data["text"]

    chat_event = ChatEvent(player=player, player_color_value=player.color.value, body=text)
    chat_event.save()
    publish_chat_event(chat_event)
    return HttpResponse("Recieved data: " + str(data))
예제 #7
0
def goal_selected(request):
    data = parse_body_json_or_400(request, required_keys=["room", "slot", "color", "remove_color"])

    room = Room.get_for_encoded_uuid_or_404(data["room"])
    player = _get_session_player(request.session, room)
    game = room.current_game
    slot = int(data["slot"])
    color = Color.for_name(data["color"])
    remove_color = data["remove_color"]

    goal_event = game.update_goal(player, slot, color, remove_color)
    if not goal_event:
        return HttpResponseBadRequest("Blocked by Lockout")
    publish_goal_event(goal_event)
    return HttpResponse("Recieved data: " + str(data))
예제 #8
0
def room_feed(request, encoded_room_uuid):
    room = Room.get_for_encoded_uuid_or_404(encoded_room_uuid)
    # lookup the player to force authentication
    _get_session_player(request.session, room)
    events_to_return = []
    all_included = True

    if request.GET.get('full') == 'true':
        events_to_return = Event.get_all_for_room(room)
    else:
        recent_events = Event.get_all_recent_for_room(room)
        events_to_return = recent_events["events"]
        all_included = recent_events["all_included"]

    all_jsons = [event.to_json() for event in events_to_return]
    return JsonResponse({'events': all_jsons, 'allIncluded': all_included}, safe=False)
예제 #9
0
def room_disconnect(request, encoded_room_uuid):
    room = Room.get_for_encoded_uuid_or_404(encoded_room_uuid)
    _clear_session_player(request.session, room)
    return redirect("rooms")
예제 #10
0
def room_board(request, encoded_room_uuid):
    room = Room.get_for_encoded_uuid_or_404(encoded_room_uuid)
    board = room.current_game.board
    return JsonResponse(board, safe=False)