ws.py 1.59 KB
Newer Older
1
from time import sleep
2 3
from typing import Optional

4 5
import socketio

6
from server.game.lobby import LobbyManager, Metadata
7 8 9
from server.model.hand import Hand
from server.model.players import Player, Announce

10 11
sio = socketio.AsyncServer(
    async_mode='asgi',
12
    logger=True,
13
    cors_allowed_origins="*"  # FIXME: CSRF Vulnerability
14
)
15 16 17 18 19 20 21
lobby = LobbyManager(sio)


class ClientPlayer(Player):
    def __init__(self, lobby: LobbyManager):
        super().__init__()
        self.lobby = lobby
22
        self.ready = False
23 24

    async def announce(self, current_bet: Optional[Hand]) -> Announce:
25
        metadata: Metadata = self.lobby.metadata[self.name]
26
        print(f"Asking Client {self.name} for announce...")
27 28

        while not metadata.last_announce and metadata.fresh_announce:
PLN (Algolia) committed
29
            print("While, send_waiting_for")
30
            await lobby.send_waiting_for(self)
31
            print(f"Still waiting for {self.name}'s announce...")
32
            sleep(2)
33

34
        print(f"Client announced: {metadata.last_announce.bet}!")
35
        return metadata.last_announce
36

37

38
@sio.event
39
async def connect(sid, environ):
PLN (Algolia) committed
40
    print("[WS] Connect ", sid, environ)
41
    player = ClientPlayer(lobby)
PLN (Algolia) committed
42
    await lobby.new_player(player, sid)
43

44

45
@sio.event
46
async def message(sid, data):
PLN (Algolia) committed
47
    print("[WS] Message ", data)
48
    await lobby.handle_message(sid, data)
49

50 51 52

@sio.on("pingServer")
async def ping_server(sid, data):
PLN (Algolia) committed
53
    print("[WS] Ping received:", data)
PLN (Algolia) committed
54
    await sio.emit('messageChannel', '{"extras":{"message":"PONG"}}', room=sid)
55 56


57
@sio.event
58
async def disconnect(sid):
PLN (Algolia) committed
59
    print('[WS] Disconnect ', sid)
60
    await lobby.player_left(sid)