async def handle_connection(self):
     logger.log_debug("District connected.")
     self.send_raw_message("AUTH#{}".format(
         self.server.config["district_password"]))
     while True:
         data = await self.reader.readuntil(b"\r\n")
         if not data:
             return
         raw_msg = data.decode()[:-2]
         logger.log_debug("[DISTRICT][INC][RAW]{}".format(raw_msg))
         cmd, *args = raw_msg.split("#")
         if cmd == "GLOBAL":
             glob_name = "{}[{}:{}][{}]".format("<dollar>G", args[1],
                                                args[2], args[3])
             if args[0] == "1":
                 glob_name += "[M]"
             self.server.send_all_cmd_pred(
                 "CT",
                 glob_name,
                 args[4],
                 pred=lambda x: not x.muted_global)
         elif cmd == "NEED":
             need_msg = "=== Cross Advert ===\r\n{} at {} in {} [{}] needs {}\r\n====================".format(
                 args[1], args[0], args[2], args[3], args[4])
             self.server.send_all_cmd_pred(
                 "CT",
                 "{}".format(self.server.config["hostname"]),
                 need_msg,
                 pred=lambda x: not x.muted_adverts,
             )
Example #2
0
    async def handle_connection(self):
        print(logger.log_debug("Master server connected."))

        await self.send_server_info()
        while True:
            data = await self.reader.readuntil(b"#%")
            if not data:
                return
            raw_msg = data.decode()[:-2]
            cmd, *args = raw_msg.split("#")
            if cmd != "CHECK" and cmd != "PONG":
                logger.log_debug("[MASTERSERVER][INC][RAW]{}".format(raw_msg))
            if cmd == "CHECK":
                await self.send_raw_message("PING#%")
            elif cmd == "NOSERV":
                await self.send_server_info()
Example #3
0
 async def connect(self):
     loop = asyncio.get_event_loop()
     while True:
         try:
             self.reader, self.writer = await asyncio.open_connection(
                 self.server.config["masterserver_ip"],
                 self.server.config["masterserver_port"],
                 loop=loop,
             )
             await self.handle_connection()
         except (ConnectionRefusedError, TimeoutError):
             pass
         except (ConnectionResetError, asyncio.IncompleteReadError):
             self.writer = None
             self.reader = None
         finally:
             logger.log_debug(
                 "Couldn't connect to the master server, retrying in 30 seconds."
             )
             await asyncio.sleep(30)
    def data_received(self, data):
        """ Handles any data received from the network.

        Receives data, parses them into a command and passes it
        to the command handler.

        :param data: bytes of data
        """
        # try to decode as utf-8, ignore any erroneous characters
        self.buffer += data.decode("utf-8", "ignore")
        if len(self.buffer) > 8192:
            self.client.disconnect()
        for msg in self.get_messages():
            if len(msg) < 2:
                self.client.disconnect()
                return
            try:
                if self.server.config["debug"]:
                    print(logger.log_debug(f"[RCV]{msg}", self.client))

                cmd, *args = msg.split("#")
                self.net_cmd_dispatcher[cmd](self, args)
            except KeyError:
                return
    def start(self):
        loop = asyncio.get_event_loop()

        bound_ip = "0.0.0.0"
        if self.config["local"]:
            bound_ip = "127.0.0.1"

        ao_server_crt = loop.create_server(lambda: AOProtocol(self), bound_ip,
                                           self.config["port"])
        ao_server = loop.run_until_complete(ao_server_crt)

        if self.config["use_websockets"]:
            ao_server_ws = websockets.serve(new_websocket_client(self),
                                            bound_ip,
                                            self.config["websocket_port"])
            asyncio.ensure_future(ao_server_ws)
            print(logger.log_debug("WebSocket support enabled."))

        if self.config["use_district"]:
            self.district_client = DistrictClient(self)
            asyncio.ensure_future(self.district_client.connect(), loop=loop)
            print(logger.log_debug("District support enabled."))

        if self.config["use_masterserver"]:
            self.ms_client = MasterServerClient(self)
            asyncio.ensure_future(self.ms_client.connect(), loop=loop)
            print(logger.log_debug("Master server support enabled."))

        print(logger.log_debug("Server started."))

        try:
            loop.run_forever()
        except KeyboardInterrupt:
            pass

        logger.log_debug("Server shutting down.")

        ao_server.close()
        loop.run_until_complete(ao_server.wait_closed())
        loop.close()
Example #6
0
 def _send_raw_message(self, msg):
     if self.server.config["debug"]:
         print(logger.log_debug(f"[SND]{msg}", self))
     self.network.send_raw_message(msg)