def set_active(self, current_chat=None): """Выбор активного пользователя.""" chat_name = current_chat or self.get_current_chat() if not self.current_user: self.current_user = self.get_current_user() if not chat_name: return user = User.by_name(chat_name) chat = Chat.filter_by(name=chat_name).first() or next((c for c in user.get_chats() if c.is_personal), None) obj = user or chat self.chat_members = chat.members self.current_chat = chat.name self.set_current_chat(chat) self.set_view_obj(obj) client = self.get_client() for cm in self.chat_members: if self.current_user == cm: continue client.notify(settings.PUBLIC_KEY_REQUEST, contact=cm.username) self.make_encryptor() if obj: self.fill_chat() if obj.avatar: self.set_ava(obj.avatar) else: self.clear_ava()
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 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 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 result(text_button, instance): current_user = User.by_name(settings.USER_NAME) text = str(instance.text_field.text) if instance.text_field.text: chat = Chat.filter_by(name=text).first() if chat: toast('Ошибка Создание чата\nТакая группа уже существует') return with db_lock: chat = Chat.create(name=text, owner=current_user, is_personal=False) chat.members.append(current_user) chat.save() cg = self.get_screen('create_group') cg.instance_chat = chat print('set chat', cg.instance_chat) self.show_screen('create_group') toast(instance.text_field.text)
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}')
def get_current_user(self): return User.by_name(settings.USER_NAME) if hasattr(User, '_session') else None
def get_raw_data(self, **kwargs): user = User.by_name(settings.USER_NAME) search = kwargs.get('search', '') return user.get_chats(search) if kwargs.get('contacts', True) else user.not_contacts(search)