async def start(self): try: self.loop = asyncio.get_event_loop() self.reader, self.writer = await asyncio.open_connection( host=self.host, port=self.port, ssl=self.ssl) except Exception as e: raise ClientError(*e.args) while True: line = (await self.reader.readline()).decode("utf-8").strip() if line == "": break msg = Message.from_line(line) self.notify_observers(msg)
async def on_client_connect(self, reader, writer): addr = Server.address(writer) sess = Session(self, reader, writer) sess.send(Message("001", self.name)) while True: line = (await reader.readline()).decode("utf-8").strip() if line == "": break msg = Message.from_line(line) cmd = msg.command.upper() if cmd == "LOGIN": if sess.token is not None: sess.send(Message("093", "Already logged in")) continue if sess.mode is not None: sess.send(Message("094", "Must send LOGIN before MODE")) break data = self.login_provider.authenticate(msg.params) if "error" in data: sess.send(Message("091", data["error"])) break sess.token = data["token"] sess.level = data["level"] if sess.level < 25: sess.send(Message("092", "Insufficient permissions")) break if sess.token not in self.clients: self.clients[sess.token] = [] self.clients[sess.token].append(sess) sess.send(Message("002", sess.token)) elif cmd == "MODE": if sess.mode is not None: sess.send(Message("090", "Session mode already set")) continue if sess.token is None: sess.send(Message("094", "Must send LOGIN before MODE")) break if len(msg.params) != 1: sess.send(Message("095", "Wrong number of parameters")) mode = msg.params[0].upper() if mode == "NX": sess.mode = SessionMode.ENTRANCE_EXIT elif mode == "LEVER": sess.mode = SessionMode.LEVER elif mode == "OBSERVE": sess.mode = SessionMode.OBSERVE elif mode == "OPER": sess.mode = SessionMode.OPERATOR else: sess.send(Message("096", "Invalid parameter to MODE")) continue sess.send(Message("003", mode, "Session mode set")) await self.send_data(sess) else: if sess.token is None and sess.mode is None: sess.send(Message("097", "Must be logged in")) ret = await sess.handle(msg) if ret == 0: if sess.dlserver1 is not None: sess.dlserver1.close() if sess.dlserver2 is not None: sess.dlserver2.close() return self.close(sess)