Skip to content

Commit

Permalink
Tenta obter o livro do dia novamente caso falhe
Browse files Browse the repository at this point in the history
Talvez corrija GDGAracaju#94
  • Loading branch information
wagnerluis1982 committed Aug 11, 2018
1 parent fca84e6 commit 41de0ca
Showing 1 changed file with 59 additions and 2 deletions.
61 changes: 59 additions & 2 deletions gdgajubot/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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:
Expand Down

0 comments on commit 41de0ca

Please sign in to comment.