diff --git a/backend/__init__.py b/backend/__init__.py index bd3cd86..ff4a655 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -12,7 +12,7 @@ app = socketio.WSGIApp(sio, static_files={ games = [] def advertise_lobbies(): - sio.emit('lobbies', room='lobby', data=[{'name': g.name, 'players': g.players} for g in games if not g.started]) + sio.emit('lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players)} for g in games if not g.started]) @sio.event def connect(sid, environ): @@ -21,7 +21,7 @@ def connect(sid, environ): @sio.event def set_username(sid, username): - sio.save_session(sid, Player(username)) + sio.save_session(sid, Player(username, sid)) print(f'{sid} is now {username}') advertise_lobbies() @@ -31,17 +31,34 @@ def my_message(sid, data): @sio.event def disconnect(sid): + if sio.get_session(sid).disconnect(): + games.pop(games.index(sio.get_session(sid).game)) print('disconnect ', sid) + advertise_lobbies() @sio.event def create_room(sid, room_name): sio.leave_room(sid, 'lobby') - g = Game(room_name) + sio.enter_room(sid, room_name) + g = Game(room_name, sio) g.add_player(sio.get_session(sid)) games.append(g) - sio.enter_room(sid, room_name) print(f'{sid} created a room named {room_name}') advertise_lobbies() +@sio.event +def join_room(sid, room_name): + print(f'{sid} joined a room named {room_name}') + sio.leave_room(sid, 'lobby') + sio.enter_room(sid, room_name) + i = [g.name for g in games].index(room_name) + games[i].add_player(sio.get_session(sid)) + advertise_lobbies() + +@sio.event +def chat_message(sid, msg): + ses = sio.get_session(sid) + sio.emit('chat_message', room=ses.game.name, data=f'[{ses.name}]: {msg}') + if __name__ == '__main__': eventlet.wsgi.server(eventlet.listen(('', 5001)), app) diff --git a/backend/game.py b/backend/game.py index 35dfe3e..0063b13 100644 --- a/backend/game.py +++ b/backend/game.py @@ -1,24 +1,38 @@ from typing import List, Set, Dict, Tuple, Optional import random +import socketio import players from characters import all_characters from deck import Deck import roles class Game: - def __init__(self, name): + def __init__(self, name, sio:socketio): super().__init__() + self.sio = sio self.name = name self.players: List[players.Player] = [] self.deck: Deck = None self.started = False self.turn = 0 + def handle_disconnect(self, player: players.Player): + print(f'player {player.name} left the game {self.name}') + self.players.pop(self.players.index(player)) + if len(self.players) == 0: + print(f'no players left in game {self.name}') + return True + self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players]}) + return False + def add_player(self, player: players.Player): + if player in self.players: + return player.join_game(self) self.players.append(player) print(f'Added player {player.name} to game') - + self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players]}) + def choose_characters(self): char_cards = random.sample(all_characters(), len(self.players)*2) for i in range(len(self.players)): diff --git a/backend/players.py b/backend/players.py index 60f257a..b69c32a 100644 --- a/backend/players.py +++ b/backend/players.py @@ -1,5 +1,6 @@ from enum import IntEnum import json +import socketio import roles import cards @@ -13,9 +14,10 @@ class PendingAction(IntEnum): WAIT = 4 class Player: - def __init__(self, name): + def __init__(self, name, sid): super().__init__() self.name = name + self.sid = sid self.hand: cards.Card = [] self.equipment: cards.Card = [] self.role: roles.Role = None @@ -34,6 +36,9 @@ class Player: self.game = game print(f'I {self.name} joined {self.game}') + def disconnect(self): + return self.game.handle_disconnect(self) + def set_role(self, role: roles.Role): self.role = role print(f'I {self.name} am a {role.name}, my goal is "{role.goal}"') diff --git a/frontend/src/App.vue b/frontend/src/App.vue index f618073..a84433e 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,23 +1,35 @@