Exemple #1
0
 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
Exemple #2
0
 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()
Exemple #3
0
    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.")
Exemple #4
0
    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()))
Exemple #5
0
    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.
Exemple #6
0
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.")