async def process_longpoll_event(self, new_event): if not new_event: return event_id = new_event[0] if event_id != 4: evnt = LongpollEvent(self.api, event_id, new_event) return await self.process_event(evnt) data = MessageEventData() data.msg_id = new_event[1] data.attaches = new_event[6] data.time = int(new_event[4]) try: data.user_id = int(data.attaches['from']) data.chat_id = int(new_event[3]) - 2000000000 data.is_multichat = True del data.attaches['from'] except KeyError: data.user_id = int(new_event[3]) data.is_multichat = False # https://vk.com/dev/using_longpoll_2 flags = parse_msg_flags(new_event[2]) if flags['outbox']: if not self.settings.READ_OUT: return data.is_out = True data.full_text = new_event[5].replace('<br>', '\n') if "fwd" in data.attaches: data.forwarded = MessageEventData.parse_brief_forwarded_messages_from_lp( data.attaches["fwd"]) del data.attaches["fwd"] else: data.forwarded = [] msg = Message(self.api, data) if await self.check_event(data.user_id, data.chat_id, data.attaches): msg.is_event = True await self.process_message(msg)
async def check_event(self, new_event): if not new_event: return # На всякий случай event_id = new_event.pop(0) if event_id != 4: return # Если событие - не новое сообщение msg_id, flags, peer_id, ts, subject, text, attaches = new_event # Если ID находится в чёрном списке if peer_id in self.BLACKLIST: return # Получаем параметры сообщения # https://vk.com/dev/using_longpoll_2 flags = parse_msg_flags(flags) # Если сообщение - исходящее if flags['outbox']: return # Тип сообщения - конференция или ЛС? try: # Пробуем получить ID пользователя, который отправил # сообщение в беседе user_id = attaches['from'] peer_id -= 2000000000 conf = True except KeyError: # Если ключа from нет - это ЛС user_id = peer_id conf = False user_id = int(user_id) cleaned_body = text.replace('<br>', '\n') data = MessageEventData(conf, peer_id, user_id, cleaned_body, ts, msg_id, attaches) user = await get_or_none(User, uid=user_id) if user: if ts - user.message_date <= self.FLOOD_INTERVAL: user.message_date = ts await db.update(user) return user.message_date = ts await db.update(user) else: await db.create(User, uid=user_id) await self.check_if_command(data, msg_id)
async def check_event(self, new_event): if not new_event: return # На всякий случай if not new_event.pop(0) == 4: return # Если событие - не новое сообщение msg_id, flags, peer_id, ts, subject, text, attaches = new_event # Если ID находится в чёрном списке if peer_id in self.BLACKLIST: return # Получаем параметры сообщения # https://vk.com/dev/using_longpoll_2 flags = parse_msg_flags(flags) # Если сообщение - исходящее if flags['outbox']: return # Тип сообщения - конференция или ЛС? try: # Пробуем получить ID пользователя, который отправил # сообщение в беседе user_id = attaches['from'] peer_id -= 2000000000 conf = True except KeyError: # Если ключа from нет - это ЛС user_id = peer_id conf = False cleaned_body = text.replace('<br>', '\n') data = MessageEventData(conf, peer_id, user_id, cleaned_body, attaches, ts) try: # Если разница между сообщениями меньше 1 сек - игнорим if ts - self.messages_date[user_id] <= 1: self.messages_date[user_id] = ts return else: self.messages_date[user_id] = ts except KeyError: self.messages_date[user_id] = ts await self.check_if_command(data, msg_id)