diff --git a/flanabot/bots/flana_bot.py b/flanabot/bots/flana_bot.py index 9580faa..7090d5a 100644 --- a/flanabot/bots/flana_bot.py +++ b/flanabot/bots/flana_bot.py @@ -76,7 +76,7 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe async def _get_message( self, event: multibot_constants.MESSAGE_EVENT, - pull_overwrite_fields: Iterable[str] = ('_id', 'config', 'ubereats_seconds') + pull_overwrite_fields: Iterable[str] = ('_id', 'config', 'ubereats') ) -> Message: return await super()._get_message(event, pull_overwrite_fields) @@ -146,7 +146,7 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe if k not in config_names: continue if k == 'ubereats': - k = f"ubereats (cada {flanautils.TimeUnits(seconds=message.chat.ubereats_seconds).to_words()})" + k = f"ubereats (cada {flanautils.TimeUnits(seconds=message.chat.ubereats['seconds']).to_words()})" buttons_texts.append((f"{'✔' if v else '❌'} {k}", v)) await self.send('Estos son los ajustes del chat:\n\n', flanautils.chunks(buttons_texts, 3), message, buttons_key=ButtonsGroup.CONFIG) @@ -165,7 +165,7 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe await self.start_ubereats(message.chat) else: await self.stop_ubereats(message.chat) - button_text = f"ubereats (cada {flanautils.TimeUnits(seconds=message.chat.ubereats_seconds).to_words()})" + button_text = f"ubereats (cada {flanautils.TimeUnits(seconds=message.chat.ubereats['seconds']).to_words()})" else: button_text = config_name message.buttons_info.pressed_button.text = f"{'✔' if message.chat.config[config_name] else '❌'} {button_text}" @@ -269,15 +269,15 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe await flanautils.do_every(multibot_constants.CHECK_OLD_DATABASE_MESSAGES_EVERY_SECONDS, self.check_old_database_actions) for chat in Chat.find({ 'platform': self.platform.value, - "config.ubereats": {"$exists": True, "$eq": True}, - "ubereats_cookies": {"$exists": True, "$ne": []} + 'config.ubereats': {"$exists": True, "$eq": True}, + 'ubereats.cookies': {"$exists": True, "$ne": []} }): chat = await self.get_chat(chat.id) - chat.pull_from_database(overwrite_fields=('_id', 'config', 'ubereats_cookies', 'ubereats_seconds')) + chat.pull_from_database(overwrite_fields=('_id', 'config', 'ubereats')) if ( - chat.ubereats_next_execution + chat.ubereats['next_execution'] and - (delta_time := chat.ubereats_next_execution - datetime.datetime.now(datetime.timezone.utc)) > datetime.timedelta() + (delta_time := chat.ubereats['next_execution'] - datetime.datetime.now(datetime.timezone.utc)) > datetime.timedelta() ): await flanautils.do_later(delta_time, self.start_ubereats, chat) else: diff --git a/flanabot/bots/ubereats_bot.py b/flanabot/bots/ubereats_bot.py index a4c8cc1..2b24e99 100644 --- a/flanabot/bots/ubereats_bot.py +++ b/flanabot/bots/ubereats_bot.py @@ -52,8 +52,7 @@ class UberEatsBot(MultiBot, ABC): self.task_contexts[chat.id]['playwright'] = await playwright.async_api.async_playwright().start() - chat.pull_from_database(overwrite_fields=('ubereats_cookies',)) - for i, cookies in enumerate(chat.ubereats_cookies): + for i, cookies in enumerate(chat.ubereats['cookies']): for _ in range(3): try: self.task_contexts[chat.id]['browser'] = await self.task_contexts[chat.id]['playwright'].chromium.launch() @@ -90,7 +89,7 @@ class UberEatsBot(MultiBot, ABC): code = pyperclip.paste() codes.append(code) - chat.ubereats_cookies[i] = await context.cookies('https://www.myunidays.com') + chat.ubereats['cookies'][i] = await context.cookies('https://www.myunidays.com') except playwright.async_api.Error: pass @@ -103,8 +102,6 @@ class UberEatsBot(MultiBot, ABC): if playwright_ := self.task_contexts[chat.id]['playwright']: await playwright_.stop() - chat.save() - return codes # ---------------------------------------------- # @@ -112,7 +109,7 @@ class UberEatsBot(MultiBot, ABC): # ---------------------------------------------- # @group(False) async def _on_ubereats(self, message: Message): - if not message.chat.ubereats_cookies: + if not message.chat.ubereats['cookies']: return time = flanautils.text_to_time(message.text) @@ -127,7 +124,7 @@ class UberEatsBot(MultiBot, ABC): return seconds = int(time.total_seconds()) - message.chat.ubereats_seconds = seconds + message.chat.ubereats['seconds'] = seconds message.save() period = flanautils.TimeUnits(seconds=seconds) await self.send(f'A partir de ahora te enviaré un código de UberEats cada {period.to_words()}.', message) @@ -137,28 +134,30 @@ class UberEatsBot(MultiBot, ABC): # -------------------- PUBLIC METHODS -------------------- # # -------------------------------------------------------- # async def send_ubereats_code(self, chat: Chat, update_next_execution=True): + chat.pull_from_database(overwrite_fields=('ubereats',)) + new_codes = [] for code in await self._scrape_codes(chat): new_codes.append(code) - if code in chat.ubereats_last_codes: + if code in chat.ubereats['last_codes']: warning_text = 'Código ya enviado anteriormente:' else: warning_text = '' await self.send(f'{warning_text} {code}', chat, silent=True) + chat.ubereats['last_codes'] = new_codes - chat.ubereats_last_codes = new_codes if update_next_execution: - chat.ubereats_next_execution = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(seconds=chat.ubereats_seconds) + chat.ubereats['next_execution'] = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(seconds=chat.ubereats['seconds']) chat.save() async def start_ubereats(self, chat: Chat, send_code_now=True): await self._cancel_scraping_task(chat) chat.config['ubereats'] = True - chat.save(pull_overwrite_fields=('ubereats_cookies',)) - self.task_contexts[chat.id]['task'] = await flanautils.do_every(chat.ubereats_seconds, self.send_ubereats_code, chat, do_first_now=send_code_now) + chat.save(pull_overwrite_fields=('ubereats',)) + self.task_contexts[chat.id]['task'] = await flanautils.do_every(chat.ubereats['seconds'], self.send_ubereats_code, chat, do_first_now=send_code_now) async def stop_ubereats(self, chat: Chat): await self._cancel_scraping_task(chat) chat.config['ubereats'] = False - chat.save(pull_overwrite_fields=('ubereats_cookies',)) + chat.save(pull_overwrite_fields=('ubereats',)) diff --git a/flanabot/models/chat.py b/flanabot/models/chat.py index 600829c..b4c7f58 100644 --- a/flanabot/models/chat.py +++ b/flanabot/models/chat.py @@ -1,6 +1,5 @@ __all__ = ['Chat'] -import datetime from dataclasses import dataclass, field from multibot import Chat as MultiBotChat @@ -8,7 +7,7 @@ from multibot import Chat as MultiBotChat @dataclass(eq=False) class Chat(MultiBotChat): - DEFAULT_CONFIG = { + config: dict = field(default_factory=lambda: { 'auto_insult': True, 'auto_scraping': True, 'auto_weather_chart': False, @@ -16,14 +15,10 @@ class Chat(MultiBotChat): 'punish': False, 'scraping_delete_original': True, 'ubereats': False - } - - config: dict = field(default_factory=dict) - ubereats_cookies: list[list[dict]] = field(default_factory=list) - ubereats_last_codes: list[str] = field(default_factory=list) - ubereats_seconds: int = 86700 - ubereats_next_execution: datetime.datetime = None - - def __post_init__(self): - super().__post_init__() - self.config = self.DEFAULT_CONFIG | self.config + }) + ubereats: dict = field(default_factory=lambda: { + 'cookies': [], + 'last_codes': [], + 'seconds': 86700, + 'next_execution': None + })