Пример #1
0
 def __init__(self, *args, **kwargs):
     super(Client, self).__init__(*args, **kwargs)
     self.server_host = None
     self.server_port = None
     self.login = None
     self.auth_token = None
     self.sock_fd = None
     self.state = "start"
     self.chats = None
     self.shm = None
     self.gui = None
     self.receiver = None
     self.rcv_success = threading.Event()
     self.rcv_success.clear()
     self.read_shut = threading.Event()
     self.app = QtWidgets.QApplication(sys.argv)
     self.current_chat = None
     self.window = MainWindow()
     self.window.pushButton_3.clicked.connect(self.exit_gui)
     self.window2 = RegWindow()
     self.window3 = ChatWindow()
     self.window4 = Ui_Group()
     self.window3.pushButton_2.clicked.connect(self.log_out_gui)
     self.window3.pushButton.clicked.connect(self.send_gui)
     self.window3.pushButton_3.clicked.connect(
         self.back_to_choose_group_gui)
     self.show_chat.connect(self.run_chat_gui)
     self.show_group.connect(self.run_group_gui)
Пример #2
0
 def log_out_gui(self):
     data = json.dumps({"auth_token": self.auth_token})
     req = self.form_request_line(data, "logout")
     if req:
         self.transfer(req)
     self.window4 = Ui_Group()
     self.window3.hide()
     self.window3.plainTextEdit.clear()
     self.window3.textBrowser.clear()
     self.window.show()
Пример #3
0
class Client(QObject):
    incoming_text = pyqtSignal(str)
    show_chat = pyqtSignal()
    show_group = pyqtSignal(set)

    @pyqtSlot()
    def run_group_gui(self):
        for x in self.chats:
            self.window4.addWidget(x)
            self.window4.widget.lblName.clicked.connect(self.choose_group_gui)
        self.window4.show()
        self.window.hide()

    @pyqtSlot()
    def run_chat_gui(self):
        self.window3.show()
        self.window4.hide()

    def __init__(self, *args, **kwargs):
        super(Client, self).__init__(*args, **kwargs)
        self.server_host = None
        self.server_port = None
        self.login = None
        self.auth_token = None
        self.sock_fd = None
        self.state = "start"
        self.chats = None
        self.shm = None
        self.gui = None
        self.receiver = None
        self.rcv_success = threading.Event()
        self.rcv_success.clear()
        self.read_shut = threading.Event()
        self.app = QtWidgets.QApplication(sys.argv)
        self.current_chat = None
        self.window = MainWindow()
        self.window.pushButton_3.clicked.connect(self.exit_gui)
        self.window2 = RegWindow()
        self.window3 = ChatWindow()
        self.window4 = Ui_Group()
        self.window3.pushButton_2.clicked.connect(self.log_out_gui)
        self.window3.pushButton.clicked.connect(self.send_gui)
        self.window3.pushButton_3.clicked.connect(
            self.back_to_choose_group_gui)
        self.show_chat.connect(self.run_chat_gui)
        self.show_group.connect(self.run_group_gui)

    def exit_gui(self):
        self.disconnect()
        sys.exit()

    def back_to_choose_group_gui(self):
        self.window4.show()
        self.window3.hide()
        self.window3.plainTextEdit.clear()
        self.window3.textBrowser.clear()

    def choose_group_gui(self):
        sender = self.sender()
        self.current_chat = sender.text()
        self.run_chat_gui()

    def put_txt_gui(self, str):
        self.window3.textBrowser.append("\n" + str)

    def send_gui(self):
        group = self.current_chat
        msg = self.window3.plainTextEdit.toPlainText()
        self.window3.plainTextEdit.clear()
        print(msg)
        data = json.dumps({"auth_token": self.auth_token, "text": msg})
        req = self.form_request_line(data, f"message/{group}")
        if req:
            self.transfer(req)

    def log_out_gui(self):
        data = json.dumps({"auth_token": self.auth_token})
        req = self.form_request_line(data, "logout")
        if req:
            self.transfer(req)
        self.window4 = Ui_Group()
        self.window3.hide()
        self.window3.plainTextEdit.clear()
        self.window3.textBrowser.clear()
        self.window.show()

    def run_gui(self):
        self.incoming_text.connect(self.put_txt_gui)
        self.window.show()
        self.window.pushButton.clicked.connect(self.log_in_gui)
        self.window.pushButton_2.clicked.connect(self.reg_gui)
        self.app.exec()

    def reg_gui(self):
        self.window.hide()
        self.window2.show()
        self.window2.pushButton_2.clicked.connect(self.registration_gui)

    def registration_gui(self):
        self.login = self.window2.lineEdit.text()
        name = self.window2.lineEdit_3.text()
        password = self.window2.lineEdit_2.text()
        data = json.dumps({
            "login": self.login,
            "name": name,
            "password": password
        })
        req = self.form_request_line(data, "registry")
        self.window2.hide()
        self.window.show()
        if req:
            self.transfer(req)

    def log_in_gui(self):
        self.login = self.window.lineEdit.text()
        password = self.window.lineEdit_2.text()
        data = json.dumps({"login": self.login, "password": password})
        req = self.form_request_line(data, "login")
        if req:
            self.transfer(req)

    def connect_to_server(self, host, port):
        try:
            self.sock_fd = socket.create_connection((host, port))
            self.server_host = host
            self.server_port = port
            self.receiver = threading.Thread(target=self.receive_forever,
                                             args=(
                                                 self.rcv_success,
                                                 self.read_shut,
                                             ))
            self.receiver.start()
        except socket.gaierror:
            logging.warning("trouble finding server host")
            return False
        except socket.timeout:
            logging.info("can't find server")
            return False
        except socket.error:
            logging.warning("trouble creating connection")
            return False
        self.state = "connected"
        return True

    def disconnect(self):
        self.log_out()  # log out before disconnecting if necessary
        data = json.dumps({"state": "connected"})
        data.encode('utf-8')
        req = self.form_request_line(data, "disconnect")
        if req:
            self.transfer(req)
            self.sock_fd.shutdown(socket.SHUT_WR)
            self.read_shut.wait()
            self.sock_fd.shutdown(socket.SHUT_RD)
            self.sock_fd.close()

    def register(self):
        self.login = input("Login name: ")
        name = input(_("User name: "))
        password = input(_("Password: "******"login": self.login,
            "name": name,
            "password": password
        })
        req = self.form_request_line(data, "registry")
        if req:
            self.transfer(req)

    def log_in(self):
        self.login = input(_("Login name: "))
        password = input(_("Password: "******"login": self.login, "password": password})
        req = self.form_request_line(data, "login")
        if req:
            self.transfer(req)

    def log_out(self):
        if not self.state == "logged":
            return
        data = json.dumps({"auth_token": self.auth_token})
        req = self.form_request_line(data, "logout")
        if req:
            self.transfer(req)

    def create_group(self, chat_name, users):
        if not self.state == "logged":
            return
        data = json.dumps({
            "auth_token": self.auth_token,
            "name": chat_name,
            "users": users
        })
        req = self.form_request_line(data, f"group/create")
        if req:
            self.transfer(req)

    def delete_group(self, chat_name):
        if not self.state == "logged":
            return
        data = json.dumps({"auth_token": self.auth_token, "name": chat_name})
        req = self.form_request_line(data, f"group/delete")
        if req:
            self.transfer(req)

    def add_to_group(self, chat_name, users):
        if not self.state == "logged":
            return
        data = json.dumps({
            "auth_token": self.auth_token,
            "name": chat_name,
            "users": users
        })
        req = self.form_request_line(data, f"group/add")
        if req:
            self.transfer(req)

    def exclude_from_group(self, chat_name, users):
        if not self.state == "logged":
            return
        data = json.dumps({
            "auth_token": self.auth_token,
            "name": chat_name,
            "users": users
        })
        req = self.form_request_line(data, f"group/exclude")
        if req:
            self.transfer(req)

    def post_message(self, msg, group):
        if not self.state == "logged":
            return
        data = json.dumps({"auth_token": self.auth_token, "text": msg})
        req = self.form_request_line(data, f"message/{group}")
        if req:
            self.transfer(req)

    def receive_forever(self, success, read_shut):
        read_shut.clear()
        while True:
            resp = self.get_response()
            if resp and resp.status != '200' and resp.status != '204':
                print(resp.reason)
            else:
                data = json.loads(resp.body.decode('utf-8'))
                if data["status"] == "user_created":
                    print(resp.reason)

                elif data["status"] == "logged in":
                    self.auth_token = data["token"]
                    #self.window3.show()

                    self.state = "logged"
                    self.chats = set(data["chats"])
                    if self.gui:
                        self.show_group.emit(self.chats)
                    else:
                        print(_('Your chats: {0}').format(self.chats))
                        print(self.state)

                elif data["status"] == "logged out":
                    self.auth_token = None
                    self.login = None
                    self.chats = None
                    self.state = "connected"

                elif data["status"] == "disconnect OK":
                    success.set()
                    logging.info("exited reading thread")
                    read_shut.set()
                    sys.exit()

                elif data["status"] == "incoming":
                    logging.info("got a message")
                    if self.gui:
                        self.incoming_text.emit(data["text"])
                    else:
                        print(data["text"])
                    continue

                elif data["status"] == "sent":
                    logging.info("sent a message")
                    if self.gui:
                        self.incoming_text.emit(data["text"])
                    print(data["text"])

                elif data["status"] == "create group":
                    print(resp.reason)
                    self.chats.add(data["name"])

                elif data["status"] == "added to group":
                    print(
                        _('You have been added to group: {0}').format(
                            data['name']))
                    self.chats.add(data["name"])
                    continue
                elif data["status"] == "delete group":
                    print(resp.reason)
                    self.chats.discard(data["name"])
                elif data["status"] == "group deleted":
                    print(_('group {0} has been deleted').format(data['name']))
                    self.chats.discard(data["name"])
                    continue
                elif data["status"] == "added":
                    print(
                        _('users {0} added to {1}').format(
                            data["users"], data["name"]))
                elif data["status"] == "users added":
                    print(
                        _('users {0} added to {1}').format(
                            data["users"], data["name"]))
                    if self.login in data["users"]:
                        self.chats.add(data["name"])
                    continue
                elif data["status"] == "excluded":
                    print(
                        _('users {0} excluded from {1}').format(
                            data["users"], data["name"]))
                elif data["status"] == "users excluded":
                    print(
                        _('users {0} excluded from {1}').format(
                            data["users"], data["name"]))
                    if self.login in data["users"]:
                        self.chats.discard(data["name"])
                    continue
            success.set()

    def transfer(self, req):
        try:
            self.sock_fd.send(req.encode())
        except socket.error:
            logging.warning("cant send to server")
        self.rcv_success.wait()
        self.rcv_success.clear()

    def form_request_line(self, data, path):
        if self.server_host and self.server_port:
            target = "https://" + f"{self.server_host}" + f":{self.server_port}/{path}"
            req = f"POST {target} HTTP/1.1\r\nHost: server\r\nUser-Agent: demo-client\r\nContent-Length:{len(data)}\r" \
                  f"\nAccept: application/json\r\n\n{data}"
            return req
        return None

    def get_response(self):
        buffer = self.sock_fd.makefile('rb')
        ver, status, reason = self.parse_response_line(buffer)
        ver = None
        headers = self.parse_headers(buffer)
        size = headers.get('Content-Length')
        if not size:
            body = None
        else:
            body = buffer.read(int(size))
        buffer.flush()
        buffer.close()
        return Response(status, reason, headers, body)

    def parse_response_line(self, file):
        raw = file.readline()
        resp_line = str(raw, 'iso-8859-1')
        resp_line = resp_line.rstrip("\r\n")
        words = resp_line.split(" ")
        if len(words) != 3:
            words[2] = " ".join(words[2:])
            words = words[:3]
            logging.info("Bad response")
        return words

    def parse_headers(self, file):
        headers = []
        while True:
            line = file.readline()
            if line in (b'\r\n', b'\n', b''):
                break
            headers.append(line)
        sheaders = b''.join(headers).decode('iso-8859-1')
        return Parser().parsestr(sheaders)