async def run(self, skip_updates: bool, wait: int = DEFAULT_WAIT): """ Run bot polling forever Can be manually stopped with: bot.stop() """ self.__wait = wait logger.debug("Polling will be started. Is it OK?") if self.__secret is not None: logger.warning("You set up secret and started polling. Removing secret") self.__secret = None if not self.status.dispatched: self.middleware.add_middleware(self.on.pre) await self.on.dispatch(self.get_current_rest) self.status.dispatched = True if not skip_updates: await self.get_updates() await self.get_server() logger.info("Polling successfully started. Press Ctrl+C to stop it") while not self._stop: event = await self.make_long_request(self.long_poll_server) if isinstance(event, dict) and event.get("ts"): self.loop.create_task(self.emulate(event)) self.long_poll_server["ts"] = event["ts"] else: await self.get_server() logger.error("Polling was stopped")
async def run(self, wait: int = DEFAULT_WAIT): """ Run user polling forever Can be manually stopped with: >> user.stop() """ self.__wait = wait logger.info("Polling will be started. Is it OK?") await self.get_server() self.on.dispatch() logger.debug("User Polling successfully started") while not self._stop: try: event = await self.make_long_request(self.long_poll_server) if isinstance(event, dict) and event.get("ts"): self.__loop.create_task(self.emulate(event)) self.long_poll_server["ts"] = event["ts"] else: await self.get_server() except ( aiohttp.ClientConnectionError, aiohttp.ServerTimeoutError, TimeoutError, ): # No internet connection logger.warning("Server Timeout Error!") except: logger.error( "While user lp was running error occurred \n\n{}".format( traceback.format_exc())) logger.error("Polling was stopped")
def check(self): for key in self.database.__all_fields__: if key not in self.database: if key in self.fix_database: logger.warning( f"[DATABASE]: Поле {key} отсутствовало. Использую стандартное значение." ) self.database.update({key: self.fix_database[key]}) self.database.save() else: raise DatabaseError( name='Нет поля', description=f'В базе данных не хватает поля "{key}"')
async def _processor(self, update: dict, update_code: int, update_fields: list): try: data = update, update_code, update_fields if update_code not in list(map(int, UserEvents)): logger.warning("Undefined event {}", update_code) return event = UserEvents(update_code) logger.debug("New event: {} {}", event, update) if event is UserEvents.new_message: return await self._message_processor(*data) return await self._event_processor(*data) except VKError as e: await self.error_handler.handle_error(e) except: logger.error( "While user polling worked error occurred \n\n{traceback}", traceback=traceback.format_exc(), )
async def parent_processor( self, update: dict, update_code: int, update_fields: typing.List[int], ) -> bool: """ Classify and distribute user polling events as message and not message #TODO Reduce difference :param update: full event :param update_code: first element from update :param update_fields: fields stack """ data = update, update_code, update_fields if update_code not in list(map(int, UserEvents)): logger.warning("Undefined event {}", update_code) return event = UserEvents(update_code) logger.debug("New event: {} {}", event, update) if event is UserEvents.new_message: return await self.message_processor(*data) return await self.event_processor(*data)
async def get_updates(self): # noqa logger.info("Receiving updates from conversations") updates = [] close, offset = False, 0 while not close: conversations = await self.api.messages.get_conversations( offset, 200, filter="unanswered" ) if offset == 0: logger.info(f"Conversation count - {conversations.count}") if conversations.count == 0: return offset += 200 updates.extend([item.conversation.out_read for item in conversations.items]) if len(conversations.items) < 200: close = True logger.warning("Answering...") chunk = list(chunks(updates, 100)) for mid in chunk: try: messages = await self.api.messages.get_by_id(mid) await self.emulate( { "updates": [ { "type": "message_new", "object": {"message": m.dict(), "client_info": {}}, } for m in messages.items ] } ) except VKError: continue