async def all_(sender: vq.Sender(), peer_id: vq.PeerID()): """ Возвращает список всех заметок """ query = vq.current.session.query(vq.current.Notes) important_notes = query.filter_by(owner_id=sender.id, important=True, done=False).all() undone_notes = query.filter_by(owner_id=sender.id, important=False, done=False).all() done_notes = query.filter_by(owner_id=sender.id, done=True).all() important_notes_list = _get_list(important_notes) undone_notes_list = _get_list(undone_notes) done_notes_list = _get_list(done_notes) document_text = config.DOCUMENT_TEXT_PATTERN.format( important_notes=important_notes_list, undone_notes=undone_notes_list, done_notes=done_notes_list) document = vq.Doc.message(document_text, peer_id=peer_id, type_="doc") document = await document(title="tasks.txt") return vq.Message(config.ANSWER, attachment=document)
def done(id_: int, sender: vq.Sender()): """ Помечает команду как "выполненное" """ note = vq.current.Notes.fetch_by_id(id_=id_, owner_id=sender.id) if note is None: return config.ANSWER_NOT_EXIST.format(id=id_) note.done = True vq.current.session.add(note) vq.current.session.commit() return config.ANSWER.format(id=id_, text=note.text)
def imp(id_: int, sender: vq.Sender()): """ Помечает заметку как "важное" """ note = vq.current.Notes.fetch_by_id(id_=id_, owner_id=sender.id) if note is None: return config.ANSWER_NOT_EXIST.format(id=id_) note.important = True vq.current.session.add(note) vq.current.session.commit() return config.ANSWER.format(id=id_, text=note.text)
def add(text: str, sender: vq.Sender()): """ Добавляет заметку в базу данных """ note = vq.current.Notes( owner_id=sender.id, text=text, ) vq.current.session.add(note) vq.current.session.commit() return config.ANSWER.format( id=note.id, text=text )
def cmd_types(num: int, num_vq: vq.Integer(), word: vq.Word(), lit: vq.Literal("foo", "bar"), mention: vq.UserMention(), mentions: [vq.UserMention()], string: str, sender: vq.Sender()): """ Check types working """ assert num == 123 assert num_vq == 456 assert lit == "foo" assert isinstance(mention, vq.User) assert isinstance(mentions, list) assert string == "long string" assert isinstance(sender, vq.User) cache("cmd_types") return config.ANSWER
async def urlcheck(api: vq.API, event: vq.Event(), sender: vq.Sender()): """ Update data for user """ link = re.fullmatch(config.LINK_PATTERN, event.object.message.text) if event.object.message.peer_id > vq.PEER: if not re.fullmatch( config.LINK_PATTERN, event.object.message.text) and not ( "action" in event.object.message and event.object.message.action.type in ("chat_invite_user", "chat_invite_user_by_link")): await api.messages.send(peer_id=event.object.message.peer_id, message=config.INVALID_LINK, random_id=0) await api.messages.remove_chat_user( chat_id=event.object.message.peer_id - vq.PEER, user_id=sender.id)
async def annotypes1(sender: vq.Sender("verificate"), event_brackets: vq.Event(), event: vq.Event, api: vq.API, client_info_brackets: vq.ClientInfo(), client_info: vq.ClientInfo): """ Annotypes """ assert client_info_brackets == client_info and isinstance( client_info, attrdict.AttrMap) assert api is vq.current.api assert event_brackets == event and isinstance(event, attrdict.AttrMap) user = await vq.User(user_id=sender.id).get_info("verificate") assert user.info == sender.info cache("annotypes1") return config.ANSWER
async def addtolist( screen: vq.Word(), sender: vq.Sender(), event: vq.Event, api: vq.API): """ Handler to command `addtolist` """ info = await api.utils.resolve_screen_name(screen_name=screen) if not info or info.type != "group": await api.messages.send(peer_id=event.object.message.peer_id, message=config.INVALID_LINK, random_id=0) await api.messages.remove_chat_user( chat_id=event.object.message.peer_id - vq.PEER, user_id=sender.id) return # Последняя позиция пользователя last_seq = get( """ SELECT MAX(seq) FROM last WHERE id = ? AND peer_id = ?; """, sender.id, event.object.message.peer_id)[0] # Максимальная позиция max_seq = get( """ SELECT MAX(seq) FROM last WHERE peer_id = ?; """, event.object.message.peer_id)[0] # Если пользователь не писал сообщение if last_seq["MAX(seq)"] is None: post( """ INSERT INTO last (id, peer_id, seq, group_id) VALUES (?, ?, ?, ?) """, sender.id, event.object.message.peer_id, max_seq["MAX(seq)"] + 1 if max_seq["MAX(seq)"] is not None else 1, info.object_id) return # Если не прошло DELAY сообщений if max_seq["MAX(seq)"] - last_seq["MAX(seq)"] < config.DELAY: await api.messages.send(peer_id=event.object.message.peer_id, message=config.NOT_WAITED, random_id=0) await api.messages.remove_chat_user( chat_id=event.object.message.peer_id - vq.PEER, user_id=sender.id) return group_ids = get( """ SELECT group_id FROM last WHERE seq > ? AND seq < ? AND peer_id = ?; """, last_seq["MAX(seq)"], max_seq["MAX(seq)"] + 1, event.object.message.peer_id) subscribed = 0 for group in group_ids: is_member = await api.groups.is_member(group_id=group.group_id, user_id=sender.id) if is_member: subscribed += 1 # Если пользователь не подписался в достаточное количество групп if subscribed < config.DELAY: await api.messages.send(peer_id=event.object.message.peer_id, message=config.LOW_SUBSCRIBED, random_id=0) await api.messages.remove_chat_user( chat_id=event.object.message.peer_id - vq.PEER, user_id=sender.id) return # Все успешно. Обновляем данные в базе post( """ INSERT INTO last (id, peer_id, seq, group_id) VALUES (?, ?, ?, ?) """, sender.id, event.object.message.peer_id, max_seq["MAX(seq)"] + 1, info.object_id)