Arkm20 commited on
Commit
3827a07
·
verified ·
1 Parent(s): ae66bc2

Create backend/app.py

Browse files
Files changed (1) hide show
  1. backend/app.py +100 -0
backend/app.py ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, WebSocket, HTTPException
2
+ from fastapi.staticfiles import StaticFiles
3
+ from pydantic import BaseModel
4
+ import uuid, random, asyncio
5
+
6
+ app = FastAPI()
7
+ app.mount("/", StaticFiles(directory="../frontend", html=True), name="static")
8
+
9
+ # --- Data Models ---
10
+ class CreateLobby(BaseModel):
11
+ max_players: int
12
+ starting_amount: int
13
+ passkey: str
14
+
15
+ class JoinLobby(BaseModel):
16
+ lobby_id: str
17
+ player_name: str
18
+ passkey: str
19
+
20
+ # --- In-memory state ---
21
+ lobbies = {} # lobby_id -> Lobby instance
22
+
23
+ class Player:
24
+ def __init__(self, name, amount):
25
+ self.name = name
26
+ self.amount = amount
27
+ self.cards = []
28
+ self.active = True
29
+
30
+ class Lobby:
31
+ def __init__(self, max_players, start_amt, passkey):
32
+ self.id = str(uuid.uuid4())[:8]
33
+ self.passkey = passkey
34
+ self.max_players = max_players
35
+ self.start_amt = start_amt
36
+ self.players = [] # list[Player]
37
+ self.state = "waiting" # waiting | dealing | betting | showdown
38
+ self.deck = []
39
+ self.pot = 0
40
+ self.community = [] # flop/turn/river cards
41
+
42
+ def build_deck(self):
43
+ suits = ['♠','♥','♦','♣']
44
+ ranks = [str(r) for r in range(2,11)] + list("JQKA")
45
+ self.deck = [r + s for s in suits for r in ranks]
46
+ random.shuffle(self.deck)
47
+ print(f"[Lobby {self.id}] deck shuffled")
48
+
49
+ def deal(self):
50
+ self.build_deck()
51
+ # deal hole cards
52
+ for p in self.players:
53
+ p.cards = [self.deck.pop(), self.deck.pop()]
54
+ print(f"[Lobby {self.id}] Dealt to {p.name}: {p.cards}")
55
+
56
+ # --- Endpoints ---
57
+ @app.post("/create_lobby")
58
+ async def create_lobby(data: CreateLobby):
59
+ lobby = Lobby(data.max_players, data.starting_amount, data.passkey)
60
+ lobbies[lobby.id] = lobby
61
+ print(f"Lobby {lobby.id} created, max_players={lobby.max_players}")
62
+ return {"lobby_id": lobby.id}
63
+
64
+ @app.post("/join_lobby")
65
+ async def join_lobby(data: JoinLobby):
66
+ lobby = lobbies.get(data.lobby_id)
67
+ if not lobby or lobby.passkey != data.passkey:
68
+ raise HTTPException(404, "Lobby not found or wrong passkey")
69
+ if len(lobby.players) >= lobby.max_players:
70
+ raise HTTPException(400, "Lobby is full")
71
+ p = Player(data.player_name, lobby.start_amt)
72
+ lobby.players.append(p)
73
+ print(f"{p.name} joined Lobby {lobby.id}")
74
+ # Auto-start when full
75
+ if len(lobby.players) == lobby.max_players:
76
+ lobby.state = "dealing"
77
+ lobby.deal()
78
+ return {"status": "joined"}
79
+
80
+ @app.get("/lobby/{lobby_id}/state")
81
+ async def lobby_state(lobby_id: str):
82
+ lobby = lobbies.get(lobby_id)
83
+ if not lobby:
84
+ raise HTTPException(404, "Lobby not found")
85
+ # Simplified: only reveal each player’s name, chips, cards if dealing
86
+ return {
87
+ "state": lobby.state,
88
+ "players": [
89
+ {"name": p.name, "amount": p.amount, "cards": p.cards if lobby.state!="waiting" else []}
90
+ for p in lobby.players
91
+ ],
92
+ "community": lobby.community,
93
+ "pot": lobby.pot
94
+ }
95
+
96
+ # (You would add endpoints for posting “bet”, “fold”, advancing rounds, showdown, etc.)
97
+
98
+ if __name__ == "__main__":
99
+ import uvicorn
100
+ uvicorn.run("app:app", host="0.0.0.0", port=7860, log_level="info")