async def disconnect(self): HttpPipe.removePlayer(self.__ID) try: await self.__websocket.ping() await self.__websocket.close() logger.info(self.__address + " has been disconnected.") except websockets.ConnectionClosed: # Already closed, no need. return
async def connectPlayer(self, player: Player): while len(self.__players) < 2: await asyncio.sleep(1) try: await player.ping() except ConnectionClosedOK: logger.info("{} has disconnected.".format(player.getAddress())) return except ConnectionClosedError as e: logger.error( "{}: Connection with {} has been terminated. Reason: {}". format(e.code, player.getAddress(), e.reason)) return await self.__start()
def run(cls): try: server = websockets.serve(Server.userHandler, "localhost", 31666, max_queue=2000000) logger.info("Server started.") HttpPipe.run() asyncio.get_event_loop().run_until_complete(server) asyncio.get_event_loop().run_forever() except KeyboardInterrupt: logger.info("Stopped the socket server.") logger.info("Stopping HTML server...") HttpPipe.stop() logger.info("Stopped HTML server.")
async def userHandler(cls, websocket: websockets.WebSocketClientProtocol, _): # _ is path. player = Player(websocket) if (not await cls.__verifyPlayer(player)): await player.sendMessageSafe("BAD_CODE") logger.warning( player.getAddress() + " has tried to connect but didn't pass the verification!") return cls.__cooldown += 4 await asyncio.sleep(cls.__cooldown ) # Players can join once per 4 seconds. cls.__cooldown -= 4 cls.__ID += 1 logger.info(player.getAddress() + " has connected.") room = RoomList.addPlayer(player) await room.connectPlayer(player) RoomList.removeRoom(room.getID()) await player.disconnect() logger.info("The game in room #{} is over.".format(room.getID()))
async def __start(self): if self.__started: # Player 1 comes here and starts the game, await self.__keepConnected( ) # Player 2 goes to __keepConnected() to avoid doing all the tasks twice. self.__started = True logger.info("The game in room #{} has started.".format(str(self.__ID))) player1, player2 = self.__players game = Game(self.__ID) try: await game.start(player1, player2) except ConnectionClosedOK as e: logger.info("{} has disconnected.".format(e.player.getAddress())) await self.__onConnectionClose(e.player) # Ignore these errors. except PlayerKickedException as e: logger.info("{} has been kicked. Reason: {}.".format( e.player.getAddress(), e.reason)) await self.__onConnectionClose(e.player) except ConnectionClosedError as e: logger.error( "{}: Connection with {} has beed terminated. Reason: {}". format(e.code, e.player, e.reason)) # Ignore this error. await self.__onConnectionError() winner = game.getWinner() if (winner == 1): await self.__gameOver(player1, player2) elif (winner == 2): await self.__gameOver(player2, player1) elif (winner == 3): await self.__onDraw() else: await self.__onConnectionError( ) # Theoretically it will never happen.
from src.Server import Server from src.util.Logger import LogFormatter, logger if __name__ == "__main__": LogFormatter.debugMode(True) Server.run() logger.info("Server has been successfully stopped.")