def update(self, proto, msg=None, *args, **kwargs): proto.write( Message(**{ settings.ACTION: self.name, settings.USER: settings.USER_NAME, })) proto.notify(f'send_{self.name}')
def update(self, proto, msg=None, **kwargs): code = getattr(msg, settings.RESPONSE, '') if code == 202: lst = [] for username, ava in getattr(msg, settings.LIST_INFO, []): user = User.by_name(username=username) if user: if ava: user.avatar = QByteArray.fromBase64( base64.b64decode(ava)) else: user = User(username=username, password='******', avatar=QByteArray.fromBase64( base64.b64decode(ava)) if ava else None) lst.append(user) with db_lock: User.save_all(lst) proto.notify(f'done_{self.name}') else: proto.write( Message( **{ settings.ACTION: settings.USERS_REQUEST, settings.USER: settings.USER_NAME, })) proto.notify(f'send_{self.name}')
def update(self, proto, msg, *args, **kwargs): user = User.by_name(settings.USER_NAME) ans_data = getattr(msg, settings.DATA, '') code = getattr(msg, settings.RESPONSE, '') if code == 511: digest = hmac.new(user.auth_key, ans_data.encode('utf-8')).digest() proto.write( Message(response=511, **{ settings.ACTION: settings.AUTH, settings.DATA: binascii.b2a_base64(digest).decode('ascii'), settings.USER: user.username, })) proto.notify('done_511') elif code == 212: user.active = True with db_lock: user.save() proto.notify(f'done_{self.name}') elif code == 412: logger.error(f'{msg}') proto.notify(f'fail_{self.name}')
def connection_made(self, transport): self.transport = transport user = User.by_name(settings.USER_NAME) hash_ = binascii.hexlify( hashlib.pbkdf2_hmac( 'sha512', settings.get('password').encode('utf-8'), settings.USER_NAME.encode('utf-8'), 10000, )) if user: user.password = settings.get('password') user.auth_key = hash_ user.active = False else: user = User(username=settings.USER_NAME, password=settings.get('password'), auth_key=hash_) with db_lock: user.save() logger.debug('Установлено соединение с сервером.') self.write(Message.presence()) self.def_size, self.transport.max_size, self.cur_size = self.transport.max_size, self.CHUNK_SIZE, self.CHUNK_SIZE self._thread.notify('new_connect') self.long_data = b''
def update(self, proto, msg=None, *args, **kwargs): code = getattr(msg, settings.RESPONSE, '') if code == 202: Chat.chats_merge(getattr(msg, settings.LIST_INFO, [])) proto.notify(f'done_{self.name}') else: proto.write( Message( **{ settings.ACTION: settings.GET_CHATS, settings.USER: settings.USER_NAME, })) proto.notify(f'send_{self.name}')
def send_chat(self, chat): self.client.notify( f'send_{settings.MESSAGE}', msg=Message( **{ settings.ACTION: settings.EDIT_CHAT, settings.USER: settings.USER_NAME, settings.DATA: { 'name': chat.name, 'owner': chat.owner.username if chat.owner else None, 'is_personal': chat.is_personal, 'members': [i.username for i in chat.members], }, }))
def del_active(self, row): user = User.by_name(settings.USER_NAME) name_contact = row.text try: with db_lock: chat = user.del_contact(name_contact) self.app.client.notify(f'send_{settings.MESSAGE}', msg=Message(**{ settings.ACTION: settings.DEL_CONTACT, settings.USER: settings.USER_NAME, settings.ACCOUNT_NAME: name_contact, })) self.app.send_chat(chat) except (ContactExists, NotFoundUser, ContactNotExists) as e: toast('Ошибка\n' + str(e)) logger.error(e) else: self.make_data()
def add_contact(self, current_chat): """Добавление контакта.""" user = User.by_name(settings.USER_NAME) try: with db_lock: chat = user.add_contact(current_chat) self.app.client.notify( f'send_{settings.MESSAGE}', msg=Message( **{ settings.ACTION: settings.ADD_CONTACT, settings.USER: settings.USER_NAME, settings.ACCOUNT_NAME: current_chat, })) self.app.send_chat(chat) except (ContactExists, NotFoundUser, ContactNotExists) as e: self.app.show_info('Ошибка\n' + str(e)) logger.error(e)
def make_message(self, username, text=''): """Создать объект сообщения. Args: username: (str) Name destination text: [description] (default: {''}) Returns: :py:class:`~jim_mes.Message` """ return Message(**{ settings.ACTION: settings.MESSAGE, settings.SENDER: settings.USER_NAME, settings.DESTINATION: username, settings.MESSAGE_TEXT: text, 'chat': self.current_chat, })
def update(self, proto, msg=None, *args, **kwargs): code = getattr(msg, settings.RESPONSE, '') if code == 202: user = User.by_name(settings.USER_NAME) for contact in getattr(msg, settings.LIST_INFO, []): try: with db_lock: user.add_contact(contact) except ContactExists: pass proto.notify(f'done_{self.name}') else: proto.write( Message( **{ settings.ACTION: settings.GET_CONTACTS, settings.USER: settings.USER_NAME, })) proto.notify(f'send_{self.name}')
def data_received(self, data): if len(data) == self.CHUNK_SIZE: self.cur_size = struct.unpack('>I', data)[0] self.transport.max_size = min(self.cur_size, self.def_size) return self.long_data += data if self.cur_size > len(self.long_data): return self.transport.max_size = self.cur_size = self.CHUNK_SIZE if len(self.long_data) < 1024: logger.debug( f'Server say: {self.long_data.decode(settings.get("encoding", "utf-8"))}' ) else: logger.debug(f'Server say message len {len(self.long_data)}') mes = Message(self.long_data) self.long_data = b'' self._thread.run_command(self, mes)
def update(self, proto, msg=None, *args, **kwargs): code = getattr(msg, settings.RESPONSE, '') if not msg: dest = kwargs.get('contact') if not dest: logger.info('Не указан контакт чей ключ нужно получить') return proto.write( Message( **{ settings.ACTION: settings.PUBLIC_KEY_REQUEST, settings.SENDER: settings.USER_NAME, settings.DESTINATION: dest, })) proto.notify(f'send_{self.name}') elif code == 202: pub_key = getattr(msg, settings.DATA, '') with db_lock: rest_user = User.by_name( getattr(msg, settings.ACCOUNT_NAME, '')) rest_user.pub_key = pub_key rest_user.save() proto.notify(f'done_{self.name}')