From 41de0cabd22fa52aa013a85b0e4f9d326861107a Mon Sep 17 00:00:00 2001 From: Wagner Macedo Date: Sat, 11 Aug 2018 00:27:32 -0300 Subject: [PATCH] Tenta obter o livro do dia novamente caso falhe Talvez corrija #94 --- gdgajubot/bot.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/gdgajubot/bot.py b/gdgajubot/bot.py index 927ebc4..8a475a9 100644 --- a/gdgajubot/bot.py +++ b/gdgajubot/bot.py @@ -369,7 +369,7 @@ def __getattribute__(self, name): return super().__getattribute__(name) @command('/book') - def packtpub_free_learning(self, message, now=None, reply=True): + def packtpub_free_learning(self, message, now=None, reply=True, retry=False): """Retorna o livro disponível no free-learning da editora PacktPub.""" if reply: logging.info("%s: %s", message.from_user.name, "/book") @@ -390,7 +390,64 @@ def send_message(*args, **kwargs): now = datetime.datetime.now(tz=AJU_TZ) # obtém o livro do dia, a resposta formatada e quanto tempo falta para acabar a oferta - book, response, left = self.__get_book(now) + try: + book, response, left = self.__get_book(now) + except: + book, response, left = None, 'error', -1 + + # livro não obtido: considera pegar novamente o livro em alguns minutos + if book is None: + with self.state_access['lock']: + state = self.get_state('daily_book', message.chat_id) + last_time = state['last_time'] + my = state['__memory__'] + + # inicializa contador de tentativas se necessário + if 'retry-counter' not in my: + my['retry-counter'] = 0 + + # reinicializa contador se faz algum tempo desde o último envio + elif last_time \ + and last_time - now >= datetime.timedelta(hours=1): + my['retry-counter'] = 0 + + # reinicializa contador se faz algum tempo desde a última tentativa + elif 'retry-when' in my and now < my['retry-when'] \ + and my['retry-when'] - now >= datetime.timedelta(hours=1): + my['retry-counter'] = 0 + + # incrementa o contador desta tentativa + if retry: + my['retry-counter'] += 1 + + # condições básicas para talvez reagendar + should_retry = not retry or 'retry-when' not in my or now > my['retry-when'] + + # flags para a mensagem ao usuário + already_scheduled = not should_retry and reply + + phrase = None + + # agenda obtenção do livro em 5 minutos + if should_retry: + callback = lambda bot, job, msg=message: self.packtpub_free_learning(msg, now, reply, retry=True) + self.updater.job_queue.run_once(callback, when=5*60) + + phrase = "⏰ Eu não consegui pegar o livro agora, eu vou tentar de novo em alguns minutos. Aguarde!" + + # avisa que já há um agendamento + elif already_scheduled: + phrase = "⏰ Eu não consegui pegar o livro agora, mas em poucos minutos, deve chegar. Aguarde!" + + # forma a frase em caso de erro + if response == 'error': + phrase = "⛔ Houston, we have a problem..." + if should_retry or already_scheduled: + phrase += " estou trabalhando em tentar de novo. Aguarde!" + + if phrase: + send_message(message, phrase, parse_mode="Markdown") + return # adiciona à resposta uma frase de que a oferta está acabando if left >= 0: