Beispiel #1
0
 def new_room(self, name):
     if name in self._rooms.keys():
         util.print_core('Room already exists')
         return 0
     else:
         util.print_core('Making a new room')
         self._rooms[name] = Room(name)
         return 1
Beispiel #2
0
 def leave(self, person_name):
     if self._status == 'waiting' and person_name in self._players.keys():
         del self._players[person_name]
         util.print_core(f'{person_name} has left {self._name}')
         return 1
     elif self._status == 'started' and person_name in self._players.keys():
         util.print_core(
             f'The game has already started but {person_name} has left {self._name}')
         return 1
     else:
         return 0
Beispiel #3
0
 async def send_message(self, msg):
     try:
         if isinstance(msg, str):
             await self._ws.send(msg)
         elif isinstance(msg, list):
             for m in msg:
                 await self._ws.send(m)
         else:
             await self._ws.send(json.dumps(msg))
     except:
         util.print_core('Could not send!')
Beispiel #4
0
    async def start_game(self):
        if self._status == 'started':
            util.print_core(f'The game in {self._name} has already started!')
            await self.tell_room({
                'type': 'Info', 'status': f'The game in room {self._name} has already started'
            })
            return

        util.print_core(f'The game in {self._name} is starting!')
        await self.tell_room({
            'type': 'Info', 'status': f'The game in room {self._name} has begun'
        })
Beispiel #5
0
    async def consume(self, q: asyncio.Queue):
        while True:
            msg, ws = await self._q.get()
            if isinstance(msg, dict):
                await self.update_and_send_response(msg, ws)

            elif isinstance(msg, list):
                for m in msg:
                    await self.update_and_send_response(m, ws)

            else:
                util.print_core('Unknown message datatype')
Beispiel #6
0
    async def client_handler(self, websocket, path):
        self._connected_users.add(websocket)
        print('-' * 60)
        util.print_core('A client has connected!')
        print('-' * 60)
        try:
            async for _ in websocket:
                message = await websocket.recv()
                d = json.loads(message)
                await self._q.put((d, websocket))

        except Exception:
            traceback.print_exc()
            util.print_core('Client unexpectedly disconnected!')
Beispiel #7
0
    async def join_room(self, room_name):
        if room_name in self._rooms:
            util.print_core(f'{self._player_name} is already in {room_name}')
            return 0
        else:
            self._rooms.add(room_name)

            await self.send_message({
                'type': 'CurrentRoom',
                'data': {
                    'name': room_name
                }
            })
            util.print_core(f'{self._player_name} has joined {room_name}')
            return 1
Beispiel #8
0
 async def join(self, player: Player):
     person_name = player._player_name
     if self._status != 'waiting' and person_name not in self._players.keys():
         util.print_core(
             f'{person_name} could not join {self._name} (already started)')
         return 0
     elif self._status != 'waiting' and person_name in self._players.keys():
         util.print_core(
             f'{person_name} is rejoining in {self._name} (started)')
         await player.send_message({
             'type': 'RoomPlayersUpdate',
             'data': {
                 'room': self._name,
                 'players': list(self._players.keys())
             }
         })
         await player.send_message({
             'type': 'GameStart',
             'data': {
             }
         })
         return 1
     else:
         self._players[person_name] = player
         util.print_core(f'{person_name} has joined {self._name}')
         await self.tell_room({
             'type': 'RoomPlayersUpdate',
             'data': {
                 'room': self._name,
                 'players': list(self._players.keys())
             }
         })
         return 1
Beispiel #9
0
 async def new_player(self, player_name, password, ws):
     if player_name in self._players.keys():
         util.print_core('Player already exists - attempting login')
         if self._players[player_name]._password == password:
             self._players[player_name].update_ws(ws)
             await self._players[player_name].send_message({
                 'type': 'PlayerDetails',
                 'data': player_name
             })
             util.print_core('Login success!')
             return 1
         else:
             return 0
     else:
         util.print_core(f'Creating player: {player_name}')
         self._players[player_name] = Player(player_name, password, ws)
         await self._players[player_name].send_message(
             {
                 'type': 'PlayerDetails',
                 'data': player_name
             }
         )
         util.print_core('New player creation success!')
         return 1
Beispiel #10
0
 async def tell_room(self, msg):
     for _, player in self._players.items():
         try:
             await player.send_message(json.dumps(msg))
         except:
             util.print_core('Could not send!')
Beispiel #11
0
 def leave_room(self, room_name):
     if room_name in self._rooms:
         self._rooms.remove(room_name)
         util.print_core(f'{self._player_name} has left {room_name}')
         return 1
     return 0
Beispiel #12
0
    async def run(self, port='8887', host='localhost'):
        util.print_core(f'Starting server on port {port}')
        await websockets.server.serve(self.client_handler, host, port)

        consumer = asyncio.create_task(self.consume(self._q))
        await asyncio.gather(consumer)
Beispiel #13
0
 def __init__(self):
     util.print_core('Initialising...')
     self._connected_users = set()
     self._lobby = Lobby()               # Lobby of the rooms
     self._q = asyncio.Queue()