from django.contrib.auth.decorators import login_required from django.http import HttpResponse from django.shortcuts import redirect, render from apps.epic.models import Room, RoomInvite, debit_token from apps.lyric.models import Token @login_required def create_room(request): if request.method == "POST": name = request.POST.get("name", "").strip() if name: room = Room.objects.create(name=name, owner=request.user) return redirect("epic:gatekeeper", room_id=room.id) return redirect("/gameboard/") def gatekeeper(request, room_id): room = Room.objects.get(id=room_id) slots = room.gate_slots.order_by("slot_number") user_has_slot = ( request.user.is_authenticated and room.gate_slots.filter(gamer=request.user).exists() ) return render(request, "apps/gameboard/room.html", { "room": room, "slots": slots, "user_has_slot": user_has_slot, }) @login_required def drop_token(request, room_id, slot_number): if request.method == "POST": room = Room.objects.get(id=room_id) slot = room.gate_slots.get(slot_number=slot_number) token = ( request.user.tokens.filter(token_type=Token.COIN).first() or request.user.tokens.filter(token_type=Token.FREE).first() or request.user.tokens.filter(token_type=Token.TITHE).first() ) if token: debit_token(request.user, slot, token) return redirect("epic:gatekeeper", room_id=room_id) @login_required def invite_gamer(request, room_id): if request.method == "POST": room = Room.objects.get(id=room_id) email = request.POST.get("invitee_email", "").strip() if email: RoomInvite.objects.get_or_create( room=room, inviter=request.user, invitee_email=email, defaults={"status": RoomInvite.PENDING} ) return redirect("epic:gatekeeper", room_id=room_id) @login_required def delete_room(request, room_id): if request.method == "POST": room = Room.objects.get(id=room_id) if request.user == room.owner: room.delete() return redirect("/gameboard/") @login_required def abandon_room(request, room_id): if request.method == "POST": room = Room.objects.get(id=room_id) room.gate_slots.filter(gamer=request.user).update( gamer=None, status="EMPTY", filled_at=None ) room.invites.filter( invitee_email=request.user.email, status=RoomInvite.PENDING ).delete() return redirect("/gameboard/") def gate_status(request, room_id): room = Room.objects.get(id=room_id) if room.gate_status == Room.OPEN: return HttpResponse("") slots = room.gate_slots.order_by("slot_number") user_has_slot = ( request.user.is_authenticated and slots.filter(gamer=request.user).exists() ) return render(request, "apps/gameboard/_partials/_gatekeeper.html", { "room": room, "slots": slots, "user_has_slot": user_has_slot, })