def send_avatar(self, avatar_bytes): avatar_part = 512 for i in range(0, len(avatar_bytes), avatar_part): part = b64encode(avatar_bytes[i:i + avatar_part]) part_req = Request(RequestAction.IMAGE, part.decode()) self.__send_request(part_req) self.file_answers.get() self.logger.debug(f'Send end part') end_req = Request(RequestAction.END_IMAGE, 'set_avatar') self.__send_request(end_req) resp = self.file_answers.get()
def authorization(self): """ Method of authorization on server """ pr_req = Request(RequestAction.PRESENCE, self.user.username) self.__send_request(pr_req) resp = self.__get_response() if resp is None: return Response(SERVER_ERROR) if resp.code != AUTH: return resp enc_pass = encrypt_rsa(import_pub_key(resp.message.encode()), self.user.password) auth_req = Request(RequestAction.AUTH, enc_pass.decode()) self.__send_request(auth_req) return self.__get_response()
def get_chat_req(self, contact): """ Method send request for gets all messages of chat with contact """ if self.get_chat_sended: return req = Request(RequestAction.COMMAND, f'get_chat {self.user.username} {contact}') self.__send_request(req)
def check_self_avatar(self): user = self.username av_hash = self.storage.get_avatar_hash(self.username) ch_req = Request(RequestAction.COMMAND, f'check_avatar {user} {av_hash}') self.__send_request(ch_req) resp = self.answers.get() if not resp: self.send_avatar(self.avatar)
def add_contact(self, contact): """ Method add contact in contact list """ if self.storage.get_contact(contact): return False self.storage.add_contact(contact) req = Request(RequestAction.COMMAND, f'add_contact {contact}') self.__send_request(req) return True
def send_msg(self, text, to): """ Method send messge to server """ encryptor = self.get_encryptor(to) text = encryptor.encript_msg(text.encode()).decode() msg = Msg(text, self.user, to) self.storage.add_message(msg.to, msg.text) request = Request(RequestAction.MESSAGE, msg) self.__send_request(request)
def start_chat(self, contact): """ Method initialization of chat with contact """ key = self.storage.get_key(contact) if key is not None: self.set_encryptor(contact, ClientCrypt(key)) prv, pub = gen_keys() self.priv_key = prv msg = Msg(pub.export_key().decode(), self.username, contact) start_req = Request(RequestAction.START_CHAT, msg) self.__send_request(start_req)
def get_user_avatar(self, user): avatar = self.storage.get_avatar(user) if avatar: ch_req = Request(RequestAction.COMMAND, f'check_avatar {user} {avatar.avatar_hash}') self.__send_request(ch_req) resp = self.answers.get() if resp == 1: return avatar.avatar get_req = Request(RequestAction.GET_IMAGE, user) self.__send_request(get_req) avatar_bytes = b'' while True: resp = self.file_answers.get() if not resp: break avatar_bytes += b64decode(resp.encode()) self.storage.set_avatar(user, avatar_bytes) return avatar_bytes pass
def accepting_chat(self, resp_mes): """ Method of handle request to start chat """ r_msg = Msg.from_formated(resp_mes) pub = import_pub_key(r_msg.text.encode()) key = self.storage.get_key(r_msg.sender) if key is not None: encryptor = ClientCrypt(key) else: encryptor = ClientCrypt.gen_secret(self.username, r_msg.sender) self.storage.add_chat_key(r_msg.sender, encryptor.secret) self.set_encryptor(r_msg.sender, encryptor) enc_key = encrypt_rsa(pub, encryptor.secret) msg = Msg(enc_key.decode(), self.username, r_msg.sender) accept_req = Request(RequestAction.ACCEPT_CHAT, msg) self.__send_request(accept_req)
def rem_contact(self, contact): """ Method remove contact from contact list """ self.storage.remove_contact(contact) req = Request(RequestAction.COMMAND, f'rem_contact {contact}') self.__send_request(req)
def get_contacts_req(self): """ Method send request for gets list contacts """ self.__send_request(Request(RequestAction.COMMAND, 'get_contacts'))
def get_users_req(self): """ Method send request for gets users online """ self.__send_request(Request(RequestAction.COMMAND, 'get_users'))