2026-03-13 00:31:17 -04:00
|
|
|
from django.contrib.auth.decorators import login_required
|
2026-03-13 22:51:42 -04:00
|
|
|
from django.http import HttpResponse
|
2026-03-13 00:31:17 -04:00
|
|
|
from django.shortcuts import redirect, render
|
2026-03-12 15:05:02 -04:00
|
|
|
|
2026-03-13 18:37:19 -04:00
|
|
|
from apps.epic.models import Room, RoomInvite, debit_token
|
2026-03-13 17:31:52 -04:00
|
|
|
from apps.lyric.models import Token
|
2026-03-13 00:31:17 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@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)
|
2026-03-13 22:51:42 -04:00
|
|
|
return redirect("/gameboard/")
|
2026-03-13 00:31:17 -04:00
|
|
|
|
|
|
|
|
def gatekeeper(request, room_id):
|
|
|
|
|
room = Room.objects.get(id=room_id)
|
|
|
|
|
slots = room.gate_slots.order_by("slot_number")
|
2026-03-13 18:37:19 -04:00
|
|
|
user_has_slot = (
|
|
|
|
|
request.user.is_authenticated
|
|
|
|
|
and room.gate_slots.filter(gamer=request.user).exists()
|
|
|
|
|
)
|
2026-03-13 00:31:17 -04:00
|
|
|
return render(request, "apps/gameboard/room.html", {
|
2026-03-13 18:37:19 -04:00
|
|
|
"room": room,
|
|
|
|
|
"slots": slots,
|
|
|
|
|
"user_has_slot": user_has_slot,
|
2026-03-13 00:31:17 -04:00
|
|
|
})
|
2026-03-13 17:31:52 -04:00
|
|
|
|
|
|
|
|
@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)
|
2026-03-13 18:37:19 -04:00
|
|
|
|
|
|
|
|
@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)
|
2026-03-13 22:51:42 -04:00
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
})
|